📄 key.asm
字号:
KEY: MOV P1,#0F0H ;行线置低电平,列线置输入态
KEY0: MOV A,P1 ;读列线数据
CPL A ;数据取反,"1"有效
ANL A,#0F0H ;屏蔽行线,保留列线数据
MOV R1,A ;存列线数据(R1高4位)
JZ GRET ;全0,无键按下,返回
KEY1: MOV P1,#0FH ;行线置输入态,列线置低电平
MOV A, P1 ;读行线数据
CPL A ;数据取反,"1"有效
ANL A, #0FH ;屏蔽列线,保留行线数据
MOV R2,A ;存行线数据(R2低4位)
JZ GRET ;全0,无键按下,返回
JBC F0,WAIT ;已有消抖标志,转
SETB F0 ;无消抖标志,置消抖标志
LCALL DY10ms ;调用10ms延时子程序(参阅例4.13),消抖
SJMP KEY0 ;重读行线列线数据
GRET: RET ;
WAIT: MOV A,P1 ;等待按键释放
CPL A ;
ANL A,#0FH ;
JNZ WAIT ;按键未释放,继续等待
KEY2: MOV A,R1 ;取列线数据(高4位)
MOV R1,#03H ;取列线编号初值
MOV R3,#03H ;置循环数
CLR C ;
KEY3: RLC A ;依次左移入C中
JC KEY4 ;C=1,该列有键按下,(列线编号存R1)
DEC R1 ;C=0,无键按下,修正列编号
DJNZ R3,KEY3 ;判循环结束否?未结束继续寻找有键按下的列线
KEY4: MOV A,R2 ;取行线数据(低4位)
MOV R2,#00H ;置行线编号初值
MOV R3,#03H ;置循环数
CLR C ;
KEY5: RRC A ;依次右移入C中
JC KEY6 ;C=1,该行有键按下,(行线编号存R2)
INC R2 ;C=0,无键按下,修正行线编号
DJNZ R3,KEY5 ;判循环结束否?未结束继续寻找有键按下的行线
KEY6: MOV A,R2 ;取行线编号
CLR C ;
RLC A ;行编号×2
RLC A ;行编号×4
ADD A,R1 ;行编号×4+列编号=按键编号
KEY7: CLR C ;
RLC A ;按键编号×2
RLC A ;按键编号×4(LCALL+ RET共4字节)
MOV DPTR,#TABJ ;
JMP @A+DPTR ;散转,执行相应键功能子程序
TABJ: LCALL WORK0 ;调用执行0#键功能子程序
RET ;
LCALL WORK1 ;调用执行1#键功能子程序
RET ;
… …
LCALL WORK15 ;调用执行15#键功能子程序
RET ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -