
;4X4矩陣鍵盤程序。主要原理為掃描鍵盤矩陣時,每次只有一行電平拉低。在逐次掃描拉低的這些行的同時,去讀那些列的電平。
;被拉低的行上,按下的鍵對應的列的電平為0 ,其它為1. 用左移位的指令,在進位位CY里就可以檢測出是0還是1.為1表示無按下,
;為0表示該鍵按下。在掃描按鍵時,如無按下,則取碼指針R1加1后,繼續(xù)掃描 。如有鍵按下,轉按鍵處理子程序,按鍵按下標志位
;F0清0(表示按下)。此時,取碼指針的值,就是按鍵的鍵名。 隨后繼續(xù)進入按鍵檢測子程序重新掃描。
;注:本程序只通過仿真,因無按鍵防抖,實物中正常與否,未能確定 。
;2016 04 10 D:\DPJ\4X4KEY.ASM
ORG 00H
AJMP MAIN
ORG 30H
MAIN:
MOV SP,#60H
MOV DPTR,#TABLE
KEY:
ACALL KEY0_1 ;調用KEY0_1,判斷是否有鍵按下
JB F0,$-2 ;無鍵按下,轉ACALL KEY0_1,繼續(xù)掃描
MOV A,R1 ;R1為取碼指針
MOVC A,@A+DPTR ;取碼,關送顯示
MOV P1,A
AJMP KEY KEY0_1: ;按鍵檢測子程序
SETB F0 ;設F0=1
MOV R3,#0F7H ;行掃描指針初值(P2.3=0)
MOV R1,#00H ;取碼指針初值
L2:
MOV A,R3 ;載入掃描指針
MOV P2,A ;輸出至P2,開始掃描為0的一行
NOP
MOV A,P2 ;讀入P2
SETB C
MOV R5,#4 ;檢測P2.7~P2.4,共4 列
L3: ;檢測4列
RLC A ;左移一位(P2.7~P2.4)
JNC KEY1 ;檢測到C=0,表示被按下
INC R1 ;無鍵按下則取碼指針加1
DJNZ R5,L3 ;4列檢測完畢?
MOV A,R3 ;載入掃描指針
SETB C
RRC A ;掃描為0的下一行,
MOV R3,A ;存回R3掃描指針寄存器
JC L2 ;C=0,行掃描完畢
RET
KEY1:
CLR F0 ;F0清0 ,表示按鍵按下
RET TABLE:
DB 0C0H;0
DB 0F9H;1
DB 0A4H;2
DB 0B0H;3
DB 099H;4
DB 092H;5
DB 082H;
DB 0F8H;7
DB 080H;8
DB 090H;9
DB 088H;A
DB 083H;b
DB 0C6H;C
DB 0A1H;d
DB 086H;E
DB 08EH;F
END
|