4×4矩陣鍵盤的工作原理與編程
本文介紹如何在ME300B型51/AVR單片機學習開發系統上使用數碼管顯示4×4矩陣鍵盤的鍵值。
一、硬件工作原理的簡單介紹
該實驗使用ME300B上的8位數碼管顯示電路和4×4矩陣鍵盤電路。現將這二部分的電路工作原理進行簡單的介紹:
1、4×4矩陣鍵盤的工作原理
矩陣鍵盤又稱爲行列式鍵盤,它是用4條I/O線作爲行線,4條I/O線作爲列線組成的鍵盤。在行線和列線的每一個交叉點上,設置一個按鍵。這樣鍵盤中按鍵的個數是4×4個。這種行列式鍵盤結構能夠有效地提高單片機系統中I/O口的利用率。
圖1爲ME300B矩陣鍵盤電路圖,行線接P1.4-P1.7,列線接P1.0-P1.3。
圖1 矩陣鍵盤電路
圖2 按鍵排列
2、數碼管動態掃描顯示電路
在ME300B開發系統中,採用了8位數碼管動態掃描顯示。它將所有數碼管的8個段線相應地並接在一起,並接到 AT89S51的P0口,由P0口控制字段輸出。而各位數碼管的共陽極由AT89S51的P2口控制Q20-Q27來實現8位數碼管的位輸出控制。
這樣,對於一組數碼管動態掃描顯示需要由兩組信號來控制:一組是字段輸出口輸出的字形代碼,用來控制顯示的字形,稱爲段碼;另一組是位輸出口輸出的控制信號,用來選擇第幾位數碼管工作,稱爲位碼。
由於各位數碼管的段線並聯,段碼的輸出對各位數碼管來說都是相同的。因此,同一時刻如果各位數碼管的位選線都處於選通狀態的話,8位數碼管將顯示相同的字符。若要各位數碼管能夠顯示出與本位相應的字符,就必須採用掃描顯示方式。即在某一時刻,只讓某一位的位選線處於導通狀態,而其它各位的位選線處於關閉狀態。同時,段線上輸出相應位要顯示字符的字型碼。這樣同一時刻,只有選通的那一位顯示出字符,而其它各位則是熄滅的,如此循環下去,就可以使各位數碼管顯示出將要顯示的字符。
雖然這些字符是在不同時刻出現的,而且同一時刻,只有一位顯示,其它各位熄滅,但由於數碼管具有餘輝特性和人眼有視覺暫留現象,只要每位數碼管顯示間隔足夠短,給人眼的視覺印象就會是連續穩定地顯示。
圖3 數碼管電路
數碼管不同位顯示的時間間隔可以通過調整延時程序的延時長短來完成。數碼管顯示的時間間隔也能夠確定數碼管顯示時的亮度,若顯示的時間間隔長,顯示時數碼管的亮度將亮些,若顯示的時間間隔短,顯示時數碼管的亮度將暗些。若顯示的時間間隔過長的話,數碼管顯示時將產生閃爍現象。所以,在調整顯示的時間間隔時,即要考慮到顯示時數碼管的亮度,又要數碼管顯示時不產生閃爍現象。
在ME300B單片機開發系統中使用數碼管來顯示信息時,要將JP2的2、3端短接。見圖3
二、演示程序的編程方法
1、4×4矩陣鍵盤的編程方法:
1.1、先讀取鍵盤的狀態,得到按鍵的特徵編碼。
先從P1口的高四位輸出低電平,低四位輸出高電平,從P1口的低四位讀取鍵盤狀態。再從P1口的低四位輸出低電平,高四位輸出高電平,從P1口的高四位讀取鍵盤狀態。將兩次讀取結果組合起來就可以得到當前按鍵的特徵編碼。使用上述方法我們得到16個鍵的特徵編碼。
舉例說明如何得到按鍵的特徵編碼:
假設“1”鍵被按下,找其按鍵的特徵編碼。
從P1口的高四位輸出低電平,即P1.4-P1.7爲輸出口。低四位輸出高電平,即P1.0-P1.3爲輸入口。讀P1口的低四位狀態爲“ 1101”,其值爲“0DH”。
再從P1口的高四位輸出高電平,即P1.4-P1.7爲輸入口。低四位輸出低電平,即P10-P13爲輸出口,讀P1口的高四位狀態爲“1110”,其值爲“E0H”。
將兩次讀出的P0口狀態值進行邏輯或運算就得到其按鍵的特徵編碼爲“EDH”。
用同樣的方法可以得到其它15個按鍵的特徵編碼。
1.2、根據按鍵的特徵編碼,查表得到按鍵的順序編碼。
將用上述方法得到的16個按鍵的特徵編碼按圖2按鍵排列的順序排成一張特徵編碼與順序編碼的對應關係表,然後用當前讀得的特徵編碼來查表,當表中有該特徵編碼時,它所在的位置就是對應的順序編碼。
1.3、矩陣鍵盤鍵值查找程序的具體編程
這個演示程序的主要功能有:
1、識別鍵盤有無按鍵按下,若無鍵按下返回。
2、如果有鍵按下,找出具體的按鍵值(順序碼)。
=====================================================
矩陣鍵盤鍵值查找程序
鍵值存入30H單元
=====================================================
KEY_SCAN: ;識別鍵盤有無鍵按下子程序
MOV P1,#0F0H ;置列線爲0,行線爲1
MOV A,P1 ;讀P1口
ANL A,#0F0H ;取出高四位
MOV B,A ;暫存到B
MOV P1,#0FH ;置列線爲1,行線爲0
MOV A,P1 ;讀P1口
ANL A,#0FH ;取出低四位
ORL A,B ;高四位與低四位邏輯或運算重新組合
CJNE A,#0FFH,KEY_IN1 ;0FFH爲無按鍵按下
RET
KEY_IN1: ;識別具體按鍵值子程序
MOV B,A ;將按鍵的特徵編碼暫存於B
MOV DPTR,#KEYTABLE
MOV R3,#0FFH
KEY_IN2:
INC R3 ;順序碼加1
MOV A,R3
MOVC A,@A+DPTR ;查表
CJNE A,B,KEY_IN3 ;比較,若相同則找到按鍵的特徵編碼。
MOV A,R3 ;找到特徵編碼後,取順序碼
MOV 30H,A ;存入30H單元
RET
KEY_IN3:
CJNE A,#00H,KEY_IN2 ;末完,繼續查
RET ;00H爲結束碼
;特徵編碼與順序編碼的對應關係表
KEY_TABLE:
DB 0EEH,0EDH,0EBH,0E7H,0DEH ;0,1,2,3,4, 順序碼
DB 0DDH,0DBH,0D7H,0BEH,0BDH ;5,6,7,8,9, 順序碼
DB 0BBH,0B7H,07EH,07DH,07BH, 077H ;A,B,C,D,E,F 順序碼
DB 00H ; 結束碼
2、8位數碼管顯示程序的編程方法
根據要使用的數碼管的具體位置來確定掃描初值和掃描方向。
根據使用數碼管的個數來確定掃描的位數。
準備好要顯示的數據,放入相應的顯示單元中。
===========================================================
8位數碼管顯示子程序
;從右至左依次點亮8個數碼管
===========================================================
DISPLAY:
MOV R1,#07FH ;掃描初值送入R1
MOV R2,#08H ;掃描位數送入R2
MOV R0,#30H ;開始填充顯示單元
DISP1: MOV A,@R0 ;顯示內容送入A
MOV DPTR,#TABLE ;獲得表頭
MOVC A,@A+DPTR ;查表獲得顯示數據
MOV P0,A ;顯示單元數據
MOV P2,R1 ;開始顯示當前位
MOV A,R1 ;準備顯示下一位
RR A
MOV R1,A
INC R0 ;取下一個單元地址
LCALL DELAY2MS ;延時 2 MS
DJNZ R2,DISP1 ;重複顯示下一個
RET ;顯示完成,返回
因鍵值顯示只需用一位數碼管,可將上面的顯示程序進行優化,得到下面的顯示程序。
====================================================
鍵值顯示子程序
====================================================
KEY_PLAER:
MOV A,30H ;鍵值數據送入A
MOV DPTR,#TABLE ;取段碼錶地址
MOVC A,@A+DPTR ;查顯示數據對應段碼
MOV P0,A ;段碼送入P0口
CLR P2.7 ;第一個數碼管顯示
CALL DELAY2MS
SETB P2.7
RET
TABLE:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH ;0-F
三、演示程序的功能
當你按下矩陣鍵盤中的任何一個鍵,蜂鳴器響一聲,並在數碼管上顯示相應的鍵值。圖4爲ME300B開發系統的實際演示圖片。
圖4 ME300B開發系統顯示鍵值“E”
編程的具體細節請參閱ME300B光盤中的數碼管顯示鍵值演示程序。