📄 键盘扫描程序.asm
字号:
KEY1:ACALL KS1 ;掉用判断有无键按下子程序
JNZ LK1 ;有键按下时,(A)=!,转消抖延时
AJMP KEY1 ;无键按下返回
LK1: ACALL T12MS ;延时12秒子程序
ACALL KS1 ;查有无键按下,若有则为键确认按下
JNZ LK2 ; 键按下 ,(A)!=0,转逐列扫描
AJMP KEY1 不是键按下就返回
LK2: MOV R2,#0FEH ;首列扫描字入R2
MOV R1,#00H ;首列号入R1
T12MS:MOV R7,#18H ;延时12ms子程序
LK4: MOV DPTR,#7F01H ;列扫描字送8155PA口
MOV A,R2 ;第一次列扫描
MOVX @DPTR,A ;使第0列线为0
INC DPTR ;指向8155PC口
INC DPTR
MOVX A,@DPTR ;8155PC口读入行状态
JB ACC.0,LONE ;第0行无键按下,转查第1行,ACC.0=0时为 有键按下
MOV A,#00H ;第0 行有键按下,该行首键号#00H送A
AJMP LKP ;转求键号
LONE:JB ACC.1,LTWO ;第1行无键按下,转查第2行
MOV A,#08H ;该行有键按下 ,该行首键号#08H送A
AJMP LKP
LTWO:JB ACC.2,LTHR ;第2行无键按下,转查第3行
MOV A,#10H ;若该行有键按下,该行首键号#10H送A
AJMP LKP
LTHR:JB ACC.3,NEXT ;若第3行无键按下,改查下一列
MOV A,#18H ;若该行有键按下,该行首键号#18H送A
LK3:ACALL KS1 ;等待键释放
JNZ LK3 ;若未释放,等待
POP ACC ;键释放,缄好送A
RET ;键扫描结束,出口状态:(A)=键号
NEXT:INC R4 指向下一列,列号加1
MOV A;R2 ;判断8列扫描完没有
JNB ACC,KND ;8列扫描完,返回
RL A ;扫描字左移一位,转变为下一列扫描字
MOV R2,A ;扫描字入R2
AJMP:LK4 ;转向下一列扫描
KND:AJMP KEY1
LKP: ADD A,R4 ;键号=行首键号+列号
PUSH ACC ;键号进栈保护
KS1: MOV DPTR,#7F01H ;指向PA口
MOV A,#00H ;全扫描字#00H=00000000B
MOVX @DPTR,A ;全扫描字送PA口
INC DPTR 指向PC口
INC DPTR
MOVX A,@DPTR ;读入PC口行状态
CPL A ;变正逻辑,以高电平表示有键按下
ANL A,#0FH ;屏蔽高四位
RET ;出口状态:(A)!= 0时有键按下
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -