ORG 0000HLJMP MAIN ;跳轉(zhuǎn)至主程序ORG 0100HMAIN: LCALL KEY_INMOV P0,ALCALL DELAJMP MAIN;======================;判斷有無按鍵,無按鍵直接返回;KEY_IN: MOV P1,#0F0H ;置行線為低電平,讀列線狀態(tài)(在高4位,無按鍵則全為1); MOV A,P1; ANL A,#0F0H ;屏蔽低四位; MOV B,A; MOV P1,#0FH ;置列線為低電平,讀行線狀態(tài)(在低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,說明該列有按鍵動(dòng)作INC R1 ;列地址加1,準(zhǔn)備掃描下一列CJNE R1,#4,LOOP ;列地址不等于4,掃描下一列SJMP EXIT ;沒有按鍵,退出;//=============按鍵判斷對(duì)應(yīng)位等于零,說明該行有按鍵按下==================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: ;計(jì)算按鍵地址MOV A,R1RL ARL A ;列地址乘4(每列對(duì)應(yīng)4行)ADD A,R2 ;加行地址MOV DPTR,#KEYTABMOVC A,@A+DPTREXIT:; MOV P1,#0FFH ;置鍵盤接口高電平RET;延時(shí)子程序,1s延時(shí)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
評(píng)論