?? 3x4jian.asm
字號:
KB_DELAY1 EQU 30H ;鍵盤子程序中延時用寄存器1
KB_DELAY2 EQU 31H ;鍵盤子程序中延時用寄存器2
H_NUM EQU 32H ;鍵盤程序中的行號器
ORG 0000H
AJMP START
;ORG 0003H
;LJMP KEY
START:
;SETB Ex0
;SETB IT0
;SETB ex1
;SETB IT1
;SETB ES
;SETB EA
;KEYBOARD:
;MOV R2,#01H
;CJNE R2,#01H, KEY_FX
;AJMP KEYBOARD
;以下為鍵盤掃描與鍵值識別程序
KEYBOARD:
LCALL KB_SCAN ;調用鍵盤掃描程序
JZ KEYBOARD ;若無按鍵動作,循環掃描
LCALL KB_DELAY ;若有按鍵動作,調用20ms延時程序去抖動
LCALL KB_SCAN ;然后再調用鍵盤掃描程序,看是否真的有按鍵動作
JZ KEYBOARD ;若是抖動,則返回循環掃描
;確實有按鍵動作,分析鍵值
;SETB P1.4 ;使P1口的低四位口線接收數據
;SETB P1.5
;SETB P1.6
MOV P1,#11111110B ;P1.0這一行送0
MOV H_NUM,#0 ;此行行號為0
LCALL KB_ID ;調用按鍵識別程序
MOV P1,#11111101B ;P1.1這一行送0
MOV H_NUM,#3 ;對應的此行的行號為3
LCALL KB_ID ;調用按鍵識別程序
MOV P1,#11111011B ;P1.2這一行送0
MOV H_NUM,#6 ;對應的此行的行號為6
LCALL KB_ID ;調用按鍵識別程序
MOV P1,#11110111B ;P1.3這一行送0
MOV H_NUM,#9 ;對應的此行的行號為9
LCALL KB_ID ;調用按鍵識別程序
AJMP KEYBOARD
;按鍵識別程序
KB_ID:
JB P1.6,KBID_P15 ;如若不是P1.6列有動作,跳轉查下一列
JNB P1.6,$ ;如果是該列動作,當按鍵未松開時,在此循環等待
MOV A,#1 ;按鍵松開時,將該列的列號賦值給A
ADD A,H_NUM ;將行號和列號相加,得到按鍵的鍵值
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
RET
KBID_P15:
JB P1.5,KBID_P14 ;如若不是P1.5列有動作,跳轉查下一列
JNB P1.5,$
MOV A,#2 ;將該列的列號賦值給A
ADD A,H_NUM ;行號和列號相加得鍵值
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
RET
KBID_P14:
JB P1.4, KEID_END ;如若不是P1.4列有動作,跳轉到返回處
JNB P1.4,$
MOV A,#3 ;該列的列號賦值給A
ADD A,H_NUM ;行號和列號相加得鍵值
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
KEID_END:
RET
;鍵盤掃描程序
KB_SCAN:
;SETB P1.4 ;使P1口的低四位口線處于接收狀態
;SETB P1.5
;SETB P1.6
MOV P1,#11110000B ;P1口寄存器高四位賦初值為1,低四位賦初值為0
MOV A,P1
XRL A,# 11110000B ;判斷P1口是否有按鍵動作,若有則A不全為0,若沒有動作則A中全為0
RET
;鍵盤去抖動延時子程序,延時為20ms
KB_DELAY:
MOV KB_DELAY1,#100
KB_D0:MOV KB_DELAY2,#200
KB_D1:DJNZ KB_DELAY2,KB_D1
DJNZ KB_DELAY1,KB_D0
RET
;KEY:
;MOV R2,#00H
;RETI
TABLE: DB 11000000B ;0
DB 11111001B ;1
DB 10100100B ;2
DB 10110000B ;3
DB 10011001B ;4
DB 10010010B ;5
DB 10000010B ;6
DB 11111000B ;7
DB 10000000B ;8
DB 10010000B ;9
DB 10001001B ;10
DB 11000000B ;11
DB 10011100B ;12
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -