另外还有种常见的方法是电容消抖,就是在按键处并个小电容,按键按下时充电,充电完成后那个电容就视为断路
请参考这个http://m.wenda.so.com/q/1484595240494443?src=140
软件方法就是多次判断,每隔一小段时间查询一次,只要查询到未按下就视为未按下
第一、硬件消抖
采用电阻加电容构成T型低通滤波,可以减小抖动。
第二、软件消抖
1.在中断中添加延时,延时时间一般设置5到10ms(时间太长容易照成系统工作不稳定)
2.多次中断 添加一个全局变量,判断进中断多少次,再添加少量的延时
while(xx==0);
这样判断,xx是对应的那个引脚。
设置一个10ms的中断,和一个按键计数器,每次进去中断都判断一下按键的状态,如果按键按下则按键计数器+1,如果按键松开,计数器清0,然后就可以离开中断了,在main函数中,判断这个按键计数器,如果这个按键计数器>2,则可以判断这个按键被按下10ms以上了,可以判定为一次按压动作,当然这个方法也可以作为按键长按触发。
既然使用了中断,就不要使用延时机制了。
另外楼主如果说的是按键外部中断触发,也可以把外部中断触发一个定时器标志位作为按键开始的触发点,等到定时器10ms到达时再去做第二次判断达到消抖目的。这样比较省资源,不用一直开着定时器(对于单片机程序来讲,还是要有一个定时器心跳来执行任务机制的。。。。。所以第二种方法也就较少用了。。。。。。)
設置外部中斷時候是邊緣(EDGE)觸發的,其實抖動影響情況應該很少見的
1.在中断中添加延时,延时时间一般设置5到10ms
先判断是否有按键按下,延时十毫秒后,再次进行判断
2、采用电阻加电容构成T型低通滤波,可以减小抖动。