最简行列式按钮识别程序
ORG 0000H
LJMP START
ORG 0050H
START: MOV DPTR,#TAB
MAIN: MOV P2,#0FH
M1: MOV A,P2
CJNE A,#0FH,M2
SJMP M1
M2: LCALL DEL ;延时子程序
MOV A,P2
CJNE A,#0FH,M3
SJMP M1 ;去抖动
M3: LCALL KEY
MOVC A,@A+DPTR ;查表取出键码
MOV P0,A
CLR P1.3 ;显示
LCALL DEL
SJMP MAIN
;----------计算键值子程序------------
;-----首先计算行键值-----------
KEY: JB P2.0,K4 ;判断行线P2.0上按键有无按下
MOV R0,#0 ;P2.0已按下
SJMP ZERO ;跳转至计算列键值
K4: JB P2.1,K8 ;判断行线P2.1上按键有无按下
MOV R0,#4 ;P2.1已按下
SJMP ZERO
K8: JB P2.2,KC ;判断行线P2.2上按键有无按下
MOV R0,#8 ;P2.2已按下
SJMP ZERO
KC: MOV R0,#0CH
;----计算列键值-------------
ZERO: MOV P2,#0F0H
JB P2.4,ONE ;判断行线P2.4上按键有无按下
MOV R1,#0 ;P2.4已按下
SJMP WAIT ;跳转至等待按键释放
ONE: JB P2.5,TWO ;判断行线P2.5上按键有无按下
MOV R1,#1 ;P2.5已按下
SJMP WAIT
TWO: JB P2.6,THR ;判断行线P2.6上按键有无按下
MOV R1,#2 ;P2.6已按下
SJMP WAIT
THR: MOV R1,#3 ;P2.7已按下
;----等待按键释放-------
WAIT: MOV P2,#0F0H ;等待按键释放
MOV A,P2
CJNE A,#0F0H,WAIT
MOV A,R0
ADD A,R1 ;计算出键值
RET
;----延时子程序-------
DEL: MOV R6,#40
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H
DB 88H,83H,0C6H,0A1H,86H,8EH
END000000000000000000000000000.0