按照教材,昨天学到了检测按键的程序,也很明确昨天学那个程序难登大雅之堂,因为它没有实现按键在闭合和开关时的电压信号抖动。
如图示,键按下试产生多个抖动的波形,也就是产生了多个101010,而我们实际中只是两个状态只是1,或只是0。所以收集了干扰信号。于是就有今天我学的“去抖动程序”如下:
去抖原理:收到第一个低电平信号(按下的信号)后,开始延迟再次收集信号,再确认是否低电平(一直被按下)这时收集的信息就来自抖动波形图的中间部分,所以只要这个时间段是低电平,按键就肯定被按下了,不会再有抖动。这时就跳到指令检测这个按键引脚什么时候变为高电平(表示释放按键),不断循环检测,直至按键被释放。检测到释放信号后,就有cpl指令修改相应led灯的开关状态。所以这个程序通过 延时和 检测到按键被释放后才控制led灯的亮灭 而实现了去抖的功能。准确地实现按一下就真正等于单片机收集到一个信号而不是多个抖动的信号。
需要提一下的是如果没有 检测到按键被释放后才控制led灯的亮灭 的指令的话(27--33行指令),而只有延时,经实验证明,是无法实现去抖的。因为这样在波形中间时段就已经不断控制led的亮灭,而那么长的波段,led不断闪烁,当按键释放的时候,led是亮还是灭,就听天由命了。。。
无 检测到按键被释放后才控制led灯的亮灭 指令程序如下:
这个程序虽然有缺陷,但很值得分析 。。