矩阵键盘控制数码管

实现功能:按下一个键,数码管亮对应的一个数字(0~F)
电路连接:单个数码管连P1口,矩阵键盘连P0口
配套教材:北航李广弟那个版本
如果还不会, 问勇哥

ORG 00H
MAIN: LCALL KS;检查是否有键闭合
JNZ LK1;A非0,则转移,说明有键按下
ACALL DELAY;(延时)
LJMP MAIN
LK1: ACALL DELAY;有键闭合2次驱动显示器
ACALL DELAY
LCALL KS;再检查是否有键闭合
JNZ LK2;有键闭合,转LK2
ACALL DELAY
LJMP MAIN;无键闭合,延时后转KEY
LK2:MOV R2,#7FH ;扫描初值送R2
MOV R4,#00H ;扫描列号送R4
LK4:MOV A,R2
MOV P0,A
ACALL DELAY
MOV A,P0
JB ACC.0,LONE ;第0行没有键按下,转LONE
MOV A,#00H ;装第0行状态码起始值
LJMP LKP
LONE:JB ACC.1, LTWO ;第1行无键闭合,转LTWO
MOV A,#04H ;装第1行状态码起始值
AJMP LKP
LTWO:JB ACC.2,LTHR;
MOV A,#08H
AJMP LKP
LTHR:JB ACC.3,NEXT
MOV A,#0CH
LKP:ADD A,R4
PUSH ACC ;保存键码
LK3:ACALL DELAY
ACALL KS ;查键是否继续闭合,若闭合则再延时。
JNZ LK3 ;键不释放就一直等待
POP ACC
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A

NEXT:INC R4
MOV A,R2
JNB ACC.4,KND;已扫完最后一列,转KND
RR A;扫描码循环右移一位
MOV R2,A;新的扫描码送R2
AJMP LK4 ;进行左边一列的扫描
KND:LJMP MAIN ;一轮扫描完毕,开始新的一轮扫描










ks:MOV P0,#0FH ;P0口高四位输入0 。这个函数用来检查是否有键按下
ACALL DELAY
MOV A,P0
CPL A
ANL A,#0FH ;屏蔽A高半字节,有闭合键,则(A)≠0
RET

DELAY: MOV R6,#4 ;扫描延时
D3: MOV R7,#248
DJNZ R7,$
DJNZ R6,D3
RET
TAB: DB 0C0H ;"0"
DB 0F9H ;"1"
DB 0A4H ;"2"
DB 0B0H ;"3"
DB 99H ;"4"
DB 92H ;"5"
DB 82H ;"6"
DB 0F8H ;"7"
DB 80H ;"8"
DB 90H ;"9"
DB 88H ;"A"
DB 83H ;"B"
DB 0C6H ;"C"
DB 0A1H ;"D"
DB 86H ;"E"
DB 8EH ;"F"
END


相关文档
最新文档