LJMP MAIN ;跳转至主程序 ORG 0100H MAIN: LCALL KEY_IN MOV P0,A LCALL DEL AJMP MAIN ;====================== ;判断有无按键,无按键直接返回 ;KEY_IN: MOV P1,#0F0H ;置行线为低电平,读列线状态(在高4位,无按键则全为1) ; MOV A,P1 ; ANL A,#0F0H ;屏蔽低四位 ; MOV B,A ; MOV P1,#0FH ;置列线为低电平,读行线状态(在低4位,无按键则全为1) ; MOV A,P1 ; ANL A,#0FH ; ORL A,B ;高四位与低四位重新组合 ; CJNE A,#0FFH,KEYSCAN ;0FFH为末按键 ; RET ;========================================== ;//=============键盘扫描程序============================================== ;KEYSCAN: KEY_IN: MOV R1,#0 ;初始化列地址 MOV R3,#11110111B ;初始化扫描码 LOOP: MOV A,R3 RL A MOV R3,A ;保留扫描码 MOV P1,A ;送扫描码 MOV A,P1 ;读键盘 ORL A,#0F0H ;屏蔽高四位 CJNE A,#0FFH,NEXT31 ;A不等于FFH,说明该列有按键动作 INC R1 ;列地址加1,准备扫描下一列 CJNE R1,#4,LOOP ;列地址不等于4,扫描下一列 SJMP EXIT ;没有按键,退出 ;//=============按键判断对应位等于零,说明该行有按键按下================== NEXT31: JB ACC.0,NEXT32 MOV R2,#0 ;第0行有按键 SJMP NEXT5 NEXT32: JB ACC.1,NEXT33 MOV R2,#1 ;第1行有按键 SJMP NEXT5 NEXT33: JB ACC.2,NEXT34 MOV R2,#2 ;第2行有按键 SJMP NEXT5 NEXT34: MOV R2,#3 ;第3行有按键 NEXT5: ;计算按键地址 MOV A,R1 RL A RL A ;列地址乘4(每列对应4行) ADD A,R2 ;加行地址 MOV DPTR,#KEYTAB MOVC A,@A+DPTR EXIT: ; MOV P1,#0FFH ;置键盘接口高电平 RET ;延时子程序,1s延时 DEL: MOV R7,#10 DEL1: MOV R6,#200 DEL2: MOV R5,#248 HERE: DJNZ R5,HERE DJNZ R6,DEL2 DJNZ R7,DEL1 RET ;//=============按键名称表================================================ KEYTAB: DB 3fH ;扫描码0 ***************************************** DB 06H ;扫描码1 ** DB 5bH ;扫描码2 I/O口 P1.0 P1.1 P1.2 P1.3 ** DB 4fH ;扫描码3 ** DB 66H ;扫描码4 P1.4 0 1 2 3 ** DB 6dH ;扫描码5 ** DB 7dH ;扫描码6 P1.5 4 5 6 7 ** DB 07H ;扫描码7 ** DB 7fH ;扫描码8 P1.6 8 9 A B ** DB 6fH ;扫描码9 ** DB 77H ;扫描码A P1.7 C D E F ** DB 7cH ;扫描码B ** DB 39H ;扫描码C ***************************************** DB 5eH ;扫描码D DB 79H ;扫描码E DB 71H ;扫描码F DB 00H DB 00H END
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』