ORG 0000H
LJMP MAIN ;跳转至主程序ORG 0100HMAIN: LCALL KEY_INMOV P0,ALCALL DELAJMP 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,R3RL AMOV 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,NEXT32MOV R2,#0 ;第0行有按键SJMP NEXT5NEXT32:JB ACC.1,NEXT33MOV R2,#1 ;第1行有按键SJMP NEXT5NEXT33:JB ACC.2,NEXT34MOV R2,#2 ;第2行有按键SJMP NEXT5NEXT34:MOV R2,#3 ;第3行有按键NEXT5: ;核算按键地址MOV A,R1RL ARL A ;列地址乘4(每列对应4行)ADD A,R2 ;加行地址MOV DPTR,#KEYTABMOVC A,@A+DPTREXIT:; MOV P1,#0FFH ;置键盘接口高电平RET;延时子程序,1s延时DEL: MOV R7,#10DEL1: MOV R6,#200DEL2: MOV R5,#248HERE: DJNZ R5,HEREDJNZ R6,DEL2DJNZ R7,DEL1RET;//=============按键称号表================================================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 ;扫描码DDB 79H ;扫描码EDB 71H ;扫描码FDB 00HDB 00HEND