📄 18
字号:
;本程序需要观看LED显示,请将CZ2和P1口用排线连接起来
org 00h
mov p1,#0
mov p2,#0
cpl p2.0;发声的蜂鸣器不能长时间加直流电,用USB供电时会电压不足不停的自动复位
cpl p2.1;关掉继电器,用USB供电时无法驱动继电器,并且电压不足
cpl p2.2;关掉继电器,用USB供电时无法驱动继电器,并且电压不足
mov r1,#0
main:
call key
;关于按键消抖动,其实非常简单,大家只要做到两次键盘扫描的时间不要太短就行了.实际应用中,两次按键扫描的间隔100MS左右也是很好的
;第二条就是,要保证按键只执行一次,即按键长按时,不要不停的执行(当然,需要长按执行时另议)
run:mov a, r1
cjne a,30h,rend0 ;看看和上次扫描的键值是否相等?不相等就跳到run1,确保下次时键值是相等;相等的话就往下面执行.
jb 00h,rend1 ;保证只执行一次,高电平跳过全部的功能执行
setb 00h ;保证只执行一次,以下是跟据键值执行
run1:cjne r1,#0,run2
cpl p1.0
run2:cjne r1,#1,run3
cpl p1.1
run3:cjne r1,#2,run4
cpl p1.2
run4:cjne r1,#3,run5
cpl p1.3
run5:cjne r1,#4,run6
cpl p1.4
run6:cjne r1,#5,run7
cpl p1.5
run7:cjne r1,#6,run8
cpl p1.6
run8:cjne r1,#7,run9
cpl p1.7
run9:cjne r1,#8,run10
cpl p2.0
run10:cjne r1,#9,run11
cpl p2.1
run11:cjne r1,#10,run12
cpl p2.2
run12:cjne r1,#11,run13
cpl p2.3
run13:cjne r1,#12,run14
cpl p2.4
run14:cjne r1,#13,run15
cpl p2.5
run15:cjne r1,#14,run16
cpl p2.6
run16:cjne r1,#15,run17
cpl p2.7
run17:jmp rend1
rend0:mov 30h,r1 ;这里很关键,当按键放开后,或者按了键后,总会执行到这里来,
clr 00h;将00h变低,允许下一次程序执行,因此,本程序总是会可靠的只执行一次,达到消抖动和防止执行多次的目的
rend1:
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
djnz r6,$;延时,让两次的键盘扫描时间间隔长一些,大于10ms比较好,但不要太长,以免有时按键时间太短检测不到有按键
jmp main
key:;这是站长后来经常用的键盘扫描程序,现在也只用了四种指令,以前的要占58行,现在的程序只有39行
;;说明:五一电子提供的本例子程序不是从书上和网上抄的,甚至思路都是原创的,写程序是想到哪儿就写到哪儿,最后才写成这样,
;所以,请大家学习和理解这其中的思路,如果跟某些书上、网上的思路或者代码有相同或者近似,纯属巧合!
mov p0,#00001111b
mov a,p0
mov p0,#11110000b
add a,p0
mov r1,#51
kn0:cjne a,#01110111b,kn1
mov r1,#0
kn1:cjne a,#10110111b,kn2
mov r1,#1
kn2:cjne a,#11010111b,kn3
mov r1,#2
kn3:cjne a,#11100111b,kn4
mov r1,#3
kn4:cjne a,#01111011b,kn5
mov r1,#4
kn5:cjne a,#10111011b,kn6
mov r1,#5
kn6:cjne a,#11011011b,kn7
mov r1,#6
kn7:cjne a,#11101011b,kn8
mov r1,#7
kn8:cjne a,#01111101b,kn9
mov r1,#8
kn9:cjne a,#10111101b,kn10
mov r1,#9
kn10:cjne a,#11011101b,kn11
mov r1,#10
kn11:cjne a,#11101101b,kn12
mov r1,#11
kn12:cjne a,#01111110b,kn13
mov r1,#12
kn13:cjne a,#10111110b,kn14
mov r1,#13
kn14:cjne a,#11011110b,kn15
mov r1,#14
kn15:cjne a,#11101110b,kend
mov r1,#15
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 + -