📄 scankey11.asm
字号:
ORG 000H
LJMP KEY
ORG 1000H
;------------检测是否有键按下------------------
IsKeyDown: MOV P2, #0FH ;P2.4~P2.7输出全为0
MOV A, P2
ANL A, #0FH ;读取P2.0~P2.3状态
RET
;---------------程序开始----------
KEY: ;MOV SP, #50H
ACALL IsKeyDown ;
CJNE A, #0FH, LK ;P2.0~P2.3不是全"1"时,有键闭合,转LK
N1: ACALL DELAY ;延时6ms
AJMP KEY ;
LK: ACALL DELAY
ACALL DELAY ;延时12ms去抖动
ACALL IsKeyDown ; 再次检查键是否闭合
CJNE A, #0FH, SCAN ; 键再闭合,转SCAN扫描键盘
ACALL DELAY
AJMP KEY ;无键闭合时 转KEY
;--------------扫描键盘-----------------
SCAN: MOV R0, #00H ;扫描行号送R0
MOV R1, #0EFH ;扫描初值送R1(第一行)
MOV R3, #4H ; 行扫描计数
ROW: MOV A, R1 ;
MOV P2, A
MOV A, P2
JB ACC.0, LINE2 ;P2.0=1时第一列无键闭合,转第二列
MOV R2, #00H ;列号送R2
AJMP CALKEY ;转CALKEY, 计算键号
LINE2: JB ACC.1, LINE3 ;
MOV R2, #1H ;列号送R2
AJMP CALKEY
LINE3: JB ACC.2, LINE4 ;
MOV R2, #2H ;列号送R2
AJMP CALKEY
LINE4: JB ACC.3, NEXTROW ;
MOV R2, #3H ;列号送R2
AJMP CALKEY
CALKEY: MOV B, R0 ;键号=4*行号+列号
MOV A, #04H
MUL AB
ADD A, R2
;PUSH ACC ;保存键号
ACALL KEYPROC ;只考虑最先按下的键,调用处理程序
AJMP KEY
NEXTROW: ;DEC R3 ;扫描完一行后,计数减一
DJNZ R3, NEXT ;没有扫描完,转NEXT继续扫描
AJMP KEY ; 扫描完4行后,转KEY
NEXT: INC R0 ;扫描行号加1
MOV A, R1 ;将上一次的扫描初值送A
CPL A ;A取反
RL A ;
CPL A ;
MOV R1, A ;新一行的扫描初值送R1
AJMP ROW ;
;----------------延时子程序--------------
DELAY: MOV R6, #6H
LOOP1: MOV R7, #0C8H ;200次
LOOP2: NOP
NOP
NOP
DJNZ R7, LOOP2 ; 内循环200*5=1ms
DJNZ R6, LOOP1 ; 共延时6ms
RET
;----------------键盘处理程序,用于LED的显示-------------
KEYPROC: MOV DPTR, #TABLE ;指向表首地址
;POP ACC ;取出键号
MOVC A, @A+DPTR ;取出LED段选码
MOV 40H, #8H ;计数
RLOOP: RLC A ;带进位循环左移
CLR P0.0 ;
MOV P0.1, C ;将进位输进P0.1
CPL P0.0 ;完成一位读取数据
DJNZ 40H, RLOOP ;8位数据是否读完,
RET
TABLE: DB 3FH
DB 06H
DB 5BH
DB 4FH
DB 66H
DB 6DH
DB 7DH
DB 07H
DB 7FH
DB 6FH
DB 77H
DB 7CH
DB 39H
DB 5EH
DB 79H
DB 71H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -