ORG 0000H LJMP MAIN ;跳轉(zhuǎn)至主程序 ORG 0100H MAIN: LCALL KEY_IN MOV P0,A LCALL DEL AJMP MAIN ;====================== ;判斷有無(wú)按鍵,無(wú)按鍵直接返回 ;KEY_IN: MOV P1,#0F0H ;置行線為低電平,讀列線狀態(tài)(在高4位,無(wú)按鍵則全為1) ; MOV A,P1 ; ANL A,#0F0H ;屏蔽低四位 ; MOV B,A ; MOV P1,#0FH ;置列線為低電平,讀行線狀態(tài)(在低4位,無(wú)按鍵則全為1) ; MOV A,P1 ; ANL A,#0FH ; ORL A,B ;高四位與低四位重新組合 ; CJNE A,#0FFH,KEYSCAN ;0FFH為末按鍵 ; RET ;========================================== ;//=============鍵盤(pán)掃描程序============================================== ;KEYSCAN: KEY_IN: MOV R1,#0 ;初始化列地址 MOV R3,#11110111B ;初始化掃描碼 LOOP: MOV A,R3 RL A MOV R3,A ;保留掃描碼 MOV P1,A ;送掃描碼 MOV A,P1 ;讀鍵盤(pán) ORL A,#0F0H ;屏蔽高四位 CJNE A,#0FFH,NEXT31 ;A不等于FFH,說(shuō)明該列有按鍵動(dòng)作 INC R1 ;列地址加1,準(zhǔn)備掃描下一列 CJNE R1,#4,LOOP ;列地址不等于4,掃描下一列 SJMP EXIT ;沒(méi)有按鍵,退出 ;//=============按鍵判斷對(duì)應(yīng)位等于零,說(shuō)明該行有按鍵按下================== 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: ;計(jì)算按鍵地址 MOV A,R1 RL A RL A ;列地址乘4(每列對(duì)應(yīng)4行) ADD A,R2 ;加行地址 MOV DPTR,#KEYTAB MOVC A,@A+DPTR EXIT: ; MOV P1,#0FFH ;置鍵盤(pán)接口高電平 RET ;延時(shí)子程序,1s延時(shí) 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