单片机键盘消抖,用延时消抖,汇编语言

单片机键盘消抖,用延时消抖,汇编语言,第1张

RESTART:

JB    START,$        ;第一次检测(检测的位置在抖动的过程中)

DELAY(延时程序)        延时消抖

JB    START,RESTART再次检测(检测位置在稳定阶段

……

第一次检测有可能会检测到抖动的波峰“尖点”处,信号为1,此时第一条语句会原地踏步,不往下执行,直到检测到波谷“地点”处,信号为0,才开始执行第二条语句,调用延时子程序,延时子程序会持续一段时间(当然这时间自己定,带笑大概就行),来到第三条御羡语句,再次检测信号(稳定阶段),信号为0(前后检测一致),继续往下执行……如果第二次检测是高电平1,说明(①按键没有被按下,只是信号单纯地抖动而已)或者(②延时太短,第二次检测的位置还在前沿抖动阶段)或者(③延时太长,检测位置在后沿抖动阶段)此时就执行跳转回RESTART,继续重新扫描信号,看按键有没有被按下。

看了n多解释,没有一个是我(新手)觉得通俗易懂的,想了很久才恍然大悟,虽然是18年提出的镇行拍问题,还是希望能帮助到不理解的同学。不喜勿喷,谢谢!

一般是延时40ms到80ms之间,你可以取60ms试一下。用汇编或者C语言写一个延时程序就行,如果系统还要干别的时,比如扫描数码管显示什么的,等不了这么常时间,为了提高CPU的利用效率,你可以用定时器中断来延时,这样在定和核时器计数的时间内只要把键盘扫描使能关了,就可以让处理器干别的事了。延时到了再打开键盘使能就行了。

下边普通延时程序,晶振12M,一个时钟周期是12个机器周期的情冲下的延时60ms汇编子程序如下:

DELAY: 延时胡渗60ms误差 0us

MOV R7,#07H

DL1:

MOV R6,#0A8H

DL0:

MOV R5,#18H

DJNZ R5,$

DJNZ R6,DL0

DJNZ R7,DL1

RET

下裤棚脊边同样硬件的情况下,C语言的延时子程序:

void delay(void) //延时60ms误差 0us

{

unsigned char a,b,c

for(c=7c>0c--)

for(b=168b>0b--)

for(a=24a>0a--)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12464123.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存