📄 15动态按键扫描方法1.asm
字号:
;本程序需要观看LED显示,请将CZ2和P1口用排线连接起来
org 00h
mov dptr,#ledtab
mov r1,#0
main:
mov a,r1 ;累加器读入按键值,中放入多少数,数码管将会显示几,只要在你的表中定义了LED的点亮规则,改9为4就显示4
movc a,@a+dptr ;这是唯一的查表指令,作用就是读出DPTR中的表名中的第几个数的数据.
cpl a ;可以显示阴文或者阳文,ledtab是顺序存放的0123456789abcdef的LED笔画关系,根据数码管的共阴或者共阳,有时高电平是点亮,有时低电平是点亮.
mov p1,a ;放到P1口,显示出字符
call key
jmp main
key:;这是站长初学单片机时写的键盘扫描程序,总共只用了mov、jb、jmp、ret四条命令,总共58行,实际上,将jmp指令用ret代替(本子程序中的jmp指令的作用就是要ret)。
;不过,后来,后来站长都不用这个程序了,因为后来站长想了另一办法总共只需要38行就完成键盘扫描了。详情见另一例子。
;不过,很多产品中,不需要用到这么多按键,因此,那还是用这种方法好。
;本程序不包含按键消抖动、按键动作一次、长按键等功能,具体的完整的程序,请大家自行创作,或者花钱购买。
;说明:五一电子提供的本例子程序不是从书上和网上抄的,甚至思路都是原创的,写程序是想到哪儿就写到哪儿,最后才写成这样,所以,请大家学习和理解这其中的思路,如果跟某些书上、网上的思路或者代码有相同或者近似,纯属巧合!
mov p0,#00001111b
k10:jb p0.0,k20
k11:mov p0,#11101111b
jb p0.0,k12
mov r1,#15
k12:mov p0,#11011111b
jb p0.0,k13
mov r1,#14
k13:mov p0,#10111111b
jb p0.0,k14
mov r1,#13
k14:mov p0,#01111111b
jb p0.0,kend
mov r1,#12
jmp kend
k20:jb p0.1,k30
k21:mov p0,#11101111b
jb p0.1,k22
mov r1,#11
k22:mov p0,#11011111b
jb p0.1,k23
mov r1,#10
k23:mov p0,#10111111b
jb p0.1,k24
mov r1,#9
k24:mov p0,#01111111b
jb p0.1,kend
mov r1,#8
jmp kend
k30:jb p0.2,k40
k31:mov p0,#11101111b
jb p0.2,k32
mov r1,#7
k32:mov p0,#11011111b
jb p0.2,k33
mov r1,#6
k33:mov p0,#10111111b
jb p0.2,k34
mov r1,#5
k34:mov p0,#01111111b
jb p0.2,kend
mov r1,#4
jmp kend
k40:jb p0.3,kend
k41:mov p0,#11101111b
jb p0.3,k42
mov r1,#3
k42:mov p0,#11011111b
jb p0.3,k43
mov r1,#2
k43:mov p0,#10111111b
jb p0.3,k44
mov r1,#1
k44:mov p0,#01111111b
jb p0.3,kend
mov r1,#0
kend:ret
ledtab: db 11101101b,00000101b,11100011b,01100111b,00001111b,01101110b,11101110b,00100101b,11101111b,01101111b,10101111b,11001110b,11101000b,11000111b,11101010b,10101010b
end
;最后告诉大家:矩阵键盘有一个致命的弱点,即不能有效的解决多键同时按的问题,这可是我的心得\理论验证和实践验证的结果
;如果大家需要实时性强,并且需要检测多键同时按状态的话,就不能用矩阵键盘了.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -