矩陣式鍵盤掃描原理
將鍵值顯示在七節(jié)顯示器上的單片機源碼。把每個鍵都分成水平和垂直的兩端接入,比如說掃描碼是從垂直的入,那就代表那一行所接收到的掃描碼是同一個bit,而讀入掃描碼的則是水平,掃描的動作是先輸入掃描碼,再去讀取輸入的值,比對之后就可知道是哪個鍵被按下。
比如說掃描碼送入01111111,前面的0111是代表掃描第一行P1.0列,而后面的1111是讓讀取的4行接腳先設(shè)為VDD,若第一行的第三列按鍵被按下,那讀取的結(jié)果就會變成01111101(注意1111變成1101),其中LSB的第三個bit會由1變成0,這是因為這個按鍵被按下之后,會被垂直的掃描碼電位short,而把讀取的LSB的bit電位拉到0,此即為掃描原理。
由於這種按鍵是機械式的開關(guān),當(dāng)按鍵被按下時,鍵會震動一小段時間才穩(wěn)定,為了避免讓8051誤判為多次輸入同一按鍵,我們必須在偵測到有按鍵被按下,就Delay一小段時間,使鍵盤以達穩(wěn)定狀態(tài),再去判讀所按下的鍵,就可以讓鍵盤的輸入穩(wěn)定。
SCAN:
MOV R3,#F7H ; 掃描初始值
MOV R1,#00H ; 取碼指標(biāo)
SCAN1:
MOV A,R3 ; 開始掃描
MOV P1,A ; 將掃描值輸出到 P1
MOV A,P1 ; 讀入 P1 判斷是否有按下
MOV R4,A ; 存到 R4, 判斷是否放開
SETB C ; C=1
MOV R5,#04H ; 掃描 P14~P17
L1:
RLC A ; 將按鍵值左移一位元
JNC KEYIN ; 若 C=0, 有按, 執(zhí)行 KEYIN
INC R1 ; 將指標(biāo)值加 1, 繼續(xù)掃描下一行
DJNZ R5,L1 ; 掃描四行
MOV A,R3 ; 載入掃描值
SETB C ; C=1
RRC A ; 掃描下一列(P13~P10)
MOV R3,A ; 存回掃描值
JC SCAN1 ; C=1, 尚未完成掃描
RET ; 結(jié)束鍵盤掃描, 回到 Main Program
KEYIN:
MOV R7,#10 ; 消除彈跳
D2:
MOV R6,#248
DJNZ R6,$
DJNZ R7,D2
D3:
MOV A,P1 ; 讀入 P1
XRL A,R4
JZ D3
MOV A,R1
MOV DPTR,#TABLE
MOVC A,@A+DPTR
Table:
db0c0h,0f9h,0a4h,0b0h,099h ;0-4
db 092h,082h,0f8h,080h,090h ;5-9
db 088h,083h,0a7h,0a1h,086h ;A-E
db 08eh ;F
end