兆赫同步開(kāi)關(guān)電池充電器的應用
pt6311原理與應用分析
硬件結構
作為vfd顯示控制及驅動(dòng)器芯片,pt6311的核心功能仍然是實(shí)現vfd顯示控制與驅動(dòng)。芯片的硬件結構主要由掃描信號發(fā)生器、串行通信接口、控制模塊、顯示存儲器、按鍵掃描值寄存器、通用輸入寄存器、led驅動(dòng)器、vfd段/位驅動(dòng)器等構成。pt6311內部電路原理框圖如圖1所示。
由圖1及電路原理可知,sw輸入端也可以作為四個(gè)單鍵的輸入,即在按鍵數目不多于4個(gè)或者可以利用組合按鍵的情況下,這部分資源也可作為按鍵接口來(lái)利用。因此,pt6311實(shí)際提供兩個(gè)鍵盤(pán)掃描的接口,一個(gè)是通常的矩陣式鍵盤(pán)接口,另一個(gè)就是開(kāi)關(guān)信號輸入端sw1~sw4。另外,pt6311還集成了外掛四個(gè)led驅動(dòng)功能。

鍵盤(pán)接口
普通的鍵盤(pán)接法主要有兩種:獨立式和矩陣式。
(1)由通用開(kāi)關(guān)量輸入sw1~sw4構成四按鍵的獨立式鍵盤(pán)。接法如圖2(a)所示

由圖可見(jiàn),pt6311的鍵盤(pán)接口所支持的最大鍵盤(pán)矩陣為4 12,即最大按鍵數目為48個(gè)。
pt6311的顯存空間配置情況如圖3所示。實(shí)際應用中,顯存空間往往只是使用一部分,因為所使用的顯存空間大小與設置的顯示模式有關(guān),圖中的每一行對應一字,每一列對應八段即一個(gè)字節,相當于一段對應于一個(gè)字節的一位。另外,pt6311還有鍵掃描值寄存器、開(kāi)關(guān)量輸入寄存器和led輸出寄存器,這些寄存器的數據格式如圖4所示。


pt6311具有顯示模式設置、數據設置、地址設置(針對顯存)和顯示控制等四種控制字。其中最高兩位為指令特征位,由指令解碼器來(lái)識別。
外部通信接口及信號時(shí)序
根據該芯片的電路結構,pt6311提供四線(xiàn)制串行接口與外部控制器通信,接口信號線(xiàn)分別為時(shí)鐘clk、輸入數據din、輸出數據dout和選通stb,通信的控制時(shí)序見(jiàn)后。接口電路連接如圖5(a)所示。

根據pt6311與外部微控制器的接口協(xié)議,外部控制操作分為寫(xiě)入控制字、寫(xiě)入數據(包括顯存及l(fā)ed口)、讀取數據(包括鍵值及通用輸入sw口)。寫(xiě)入控制字/數據的時(shí)序如圖5(b)所示,以地址自動(dòng)增一方式連續寫(xiě)入顯存數據的時(shí)序如圖5(c)所示,讀取數據的時(shí)序如圖5(d)所示。
當然,鍵盤(pán)可根據需要選擇掛接部分按鍵,但是,由前述內部鍵掃描存儲器的對應關(guān)系,最好選擇可以連續讀取鍵值的區間,便于程序處理和減少讀取時(shí)間和處理時(shí)間。
鍵掃描與vfd顯示實(shí)用系統
結合鍵掃描與vfd顯示控制等功能于一體的電子系統較常見(jiàn),比如家庭影視音響系統、電梯等電子電器設備。一般而言,這些應用系統所采用的體系結構如圖6所示。

ac-3解碼板的控制和面板顯示系統的設計采用多鍵鍵盤(pán)和vfd顯示器來(lái)作為人機接口,系統的原理框圖與圖6相似。
vfd顯示與鍵掃描的編程實(shí)現
要使得pt6311應用系統能夠正常、可靠地工作,在硬件體系基礎上,pt6311還得通過(guò)編程來(lái)實(shí)現具體的功能。外部控制器控制pt6311實(shí)現預定的操作,實(shí)際上就是一種串口編程,這在編程實(shí)現時(shí)尤其要注意操作時(shí)序。當然,vfd顯示與鍵掃描的具體編程還跟外部微控制器有關(guān),這里給出at89c52單片機的匯編編程實(shí)現的部分程序,并在程序中作了詳細的注釋以便讀者更好地理解。
pt6311上電后,外接矩陣式鍵盤(pán)的鍵掃描和vfd顯示均處于關(guān)閉狀態(tài),因此需要進(jìn)行初始化設置,且至少要開(kāi)啟一次顯示,則鍵掃描功能才能自動(dòng)啟動(dòng),此后若關(guān)閉顯示鍵掃描仍會(huì )繼續。
鍵掃描讀取的編程實(shí)現
按鍵無(wú)論以獨立式接入sw端口,還是以矩陣式接入鍵掃描專(zhuān)用端口,基于pt6311的鍵掃描編程都是類(lèi)似的,故此處不再單獨敘述。這里主要探討pt6311外接矩陣式鍵盤(pán)的鍵掃描編程方法。
假設pt6311已啟動(dòng),單片機從pt6311讀取按鍵位置的編程(讀取sw口只需修改指令,操作類(lèi)似):
(1)、單鍵按鍵的編程實(shí)現
單鍵按鍵的鍵掃描無(wú)需把全部鍵掃描的結果讀出,只要讀到有鍵按下即可,因為不存在組合按鍵的情況則不可能有多鍵同時(shí)按下。于是,可以對鍵盤(pán)的按鍵進(jìn)行編號,并按照pt6311鍵掃描寄存器的對應順序及讀取時(shí)序進(jìn)行讀取,只需檢測是否有效按鍵并保存編號即可,而無(wú)需將全部鍵掃描值數據保存。具體程序段如下:
rd_keynumber:
mov b,#rd_key_i;將鍵掃描值讀取指令放入指令緩存,如讀sw口,則只需修改指令
setb rd_d
clraddr
clr incl_d;設置標志以調用單指令發(fā)送子程序
acall send_1bi_nd;調用單字節指令發(fā)送子程序,參見(jiàn)后面vfd顯示控制的編程
mov r6,#00h;r6保存按下鍵的單鍵編號
rdkey_on:
cpl clk;指令發(fā)送完畢clk=h,脈沖下降沿處pt6311輸出數據dout
inc r6;鍵值取自然數
cpl clk;脈沖上升沿后單片機讀取數據可靠
jnb dout,no_key;讀取dout狀態(tài),判斷有無(wú)鍵按下
setb key_pressed;有鍵按下,則設置有效按鍵標志
ajmp exit
no_key:
cjne6,#keynum_max,rdkey_on;是否掃描完畢所有按鍵,是則表示無(wú)鍵按下
clr k_pressed
exit:
setb stb
ret
退出該程序段后即可根據有無(wú)有效按鍵及鍵編號進(jìn)行必要的按鍵響應處理。實(shí)際上,這個(gè)程序段就是實(shí)現一個(gè)逐位檢測程序,判斷是否有按鍵,有則記下按鍵編號,無(wú)則退出。
(2)、組合按鍵的編程實(shí)現
組合按鍵就是通常所稱(chēng)的“組合鍵”,即兩個(gè)或者兩個(gè)以上按鍵同時(shí)按下的按鍵方法。此時(shí),按鍵的作用并不等于各個(gè)單鍵按下所代表的意思,而是一個(gè)由程序預先規定的新指令,常用于按鍵較少而需指令較多的場(chǎng)合。這種鍵值的讀取一般要將全部鍵掃描值寄存器內容讀出暫存并進(jìn)行軟件判決處理(查詢(xún)是否有預定義的組合鍵),所以需要一定的暫存空間支持。
rd_multi_key:
……;這部分與單鍵掃描程序相同
mov r0,#keynum_max;r0作為鍵計數器,比如前面提到的系統keynum_max=8
(……);此時(shí)根據鍵盤(pán)布局,增加避開(kāi)無(wú)效數據的空操作
rdmkey_on:
cpl clk; 指令發(fā)送完畢clk=h,脈沖下降沿處pt6311輸出數據dout
nop
cpl clk;脈沖上升沿后單片機讀取數據可靠
movc,dout
rrc a
djnz r0,rdmkey_on
movkey_value,a
setb stb
ret
……
acall multi_key_id;組合鍵及單鍵的識別處理,根據按鍵情況作出相應處理以上程序是針對按鍵數據第一位輸出即有效的情況,就是說(shuō)按鍵布局對應于鍵值寄存器的開(kāi)始端。如果不是這樣,且按鍵布局對應鍵值寄存器的連續空間,則需要在程序讀取數據開(kāi)始時(shí)增加避開(kāi)無(wú)效數據位的空操作。
從以上程序可知,其實(shí)單鍵掃描可以視為多鍵掃描的一種特殊情況。后面的按鍵識別處理程序要根據需要進(jìn)行軟件設計,比如最多的組合按鍵只有兩個(gè)按鍵,則多于兩個(gè)以上的按鍵組合就視為無(wú)效而無(wú)需作組合識別處理。
以上按鍵掃描程序一般放在定時(shí)中斷服務(wù)程序中的,主要是為了方便延時(shí)去抖動(dòng)。識別到有效單鍵或者組合鍵并作出響應后都需要處理重復按鍵問(wèn)題,實(shí)際上我們一般都要作按鍵是否松開(kāi)的識別處理或者按鍵間隔有效控制處理,主要是為了避免指令的過(guò)于頻繁反復操作,尤其是大功率調整。
vfd顯示控制的編程實(shí)現
假設顯示內容已經(jīng)放入display_buf_data,并且芯片已完成上電初始化設置,則單片機向pt6311發(fā)送指令與數據的通用程序段如下:(發(fā)送單字節指令可帶有n(0≤n≤48)個(gè)字節數據的子程序)
send_1bi_nd:;發(fā)單字節指令可帶n字節數據,用于初始化設置或修改顯存內容
clrea;發(fā)送過(guò)程禁止中斷,確保發(fā)送過(guò)程完整
jnb addr,no_addr;判斷是否需要設置顯存需要操作的始地址
clr addr
mov a,disply_buf_addr;取要操作的顯存地址
or a,#0c0h ;將要設置的地址與pt6311的指令特征位合并
mov b,a;b作為發(fā)送字節緩存,也作為發(fā)送單字節指令的緩存
no_addr:
clr stb;啟動(dòng)發(fā)送過(guò)程
s_on_d:
mov a,b
mov cnt,#08h ;用cnt作為位計數器,指示串行數據字節發(fā)送完畢與否
s_on:
rrc a
cpl clk;clk初始化為h(高電平)
mov din,c;按位將數據或指令的一位加載到串行數據線(xiàn)
cpl clk;時(shí)鐘上升沿發(fā)送
dec cnt;發(fā)送的位計數器遞減一
djnz cnt,s_on;字節數據發(fā)送完否?否,則繼續發(fā)送下一位
jnb incl_d,s_over;發(fā)送完畢則判斷是否后帶數據,無(wú)則發(fā)送完畢
djnz r6,s_next_byte
clr incl_d;清除后帶數據的標志
mov b,disply_buf_data;取得本次發(fā)送過(guò)程的最后一個(gè)字節
ajmp s_on_d
s_next_byte:
clrc
mov a,#disply_buf_data;單片機內的顯存為display_buf_data開(kāi)始的一段ram空間
add a,r6
mov r0,a
mov b,@r0;這里的運算取得要發(fā)送的顯示數據的下一個(gè)字節
ajmp s_on_d
s_over:
jb rd_d,keep_stb;如果發(fā)送了讀取數據指令,則保持stb為低,由讀取程序置高
setb stb
setb ea;恢復允許中斷設置
keep_stb:
ret
如果發(fā)送單字節的控制字,則設置addr=0,incl_d=0,rd_d=0,b=指令,再調用該子程序即可。
評論