ORG 0000H 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