📄 键盘扫描驱动.asm
字号:
STARTSCAN:
OLR Keyport,#(1<<ROW0)|(1<<ROW1)|(1<<ROW2)|(1<<ROW3) ;把R全部设定为输入 先把R和1或然后全部赋给Keyport
CLR COL0
CLR COL1
CLR COL2
MOV A,KeyPort
ORL A,#0FFH-(1<<ROW0)|(1<<ROW1)|(1<<ROW2)|(1<<ROW3) ;多余的端口都为0,被OFFH减的结果都为1,然后和Keyport相或就使多余的端口都为1,避免和FFH比较时无法判断,从而实现了对多余端口的屏蔽
CJNE A,#0FFH,rkHasPushKey
MOV R7,#0CH
RET
rkHasPushKey:
CLR C2
SETB C1
SETB C0 ;其实为了使整个电路变化的省电,可以在把Keyport赋给A之后把C2恢复成1
MOV R7,#(0CH-1) ;R7本来为OCH,为无按键,进入该部分程序后会直接减1进入有按键状态
MOV A,KeyPort
JNB ACC.ROW3,NEXT ;R7=0BH
DEC R7
JNB ACC.ROW2,NEXT
DEC R7
JNB ACC.ROW1,NEXT ;注意:这里JNB命令后只可以跟位,JNB只能进行位操作而不能进行数操作,所以R1要改为ACC.R1,之前已经把Keyport端口内容拷贝到了寄存器A中ACC.R1就表示A中第1位
DEC R7
JNB ACC.ROW0,NEXT
CLR C1
SETB C2
SETB C0
DEC R7
MOV A,KeyPort
JNB ACC.ROW3,NEXT
DEC R7
JNB ACC.ROW2,NEXT
DEC R7
JNB ACC.ROW1,NEXT
DEC R7
JNB ACC.ROW0,NEXT
CLR C0
SETB C2
SETB C1
DEC R7
MOV A,KeyPort
JNB ACC.ROW3,NEXT
DEC R7
JNB ACC.ROW2,NEXT
DEC R7
JNB ACC.ROW1,NEXT
DEC R7
JNB ACC.ROW0,NEXT
MOV R7,#OCH ;最后一步可以防止因为按键的物理抖动造成的漏扫描,在按键输入稳定的时候抓住扫描
NEXT:
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -