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 2.0已按下 SJMP ZERO ;跳转至计算列键值 K4: JB P2.1,K8 ;判断行线P2.1上按键有无按下 MOV R0,#4 2.1已按下 SJMP ZERO K8: JB P2.2,KC ;判断行线P2.2上按键有无按下 MOV R0,#8 2.2已按下 SJMP ZERO KC: MOV R0,#0CH ;----计算列键值------------- ZERO: MOV P2,#0F0H JB P2.4,ONE ;判断行线P2.4上按键有无按下 MOV R1,#0 2.4已按下 SJMP WAIT ;跳转至等待按键释放 ONE: JB P2.5,TWO ;判断行线P2.5上按键有无按下 MOV R1,#1 2.5已按下 SJMP WAIT TWO: JB P2.6,THR ;判断行线P2.6上按键有无按下 MOV R1,#2 2.6已按下 SJMP WAIT THR: MOV R1,#3 2.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 END |