📄 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 + -