本文参考小梅哥的独立按键消抖視频
这里是黑金开发板教程中的图可以看出,按键未按下时的状态是高电平按下为低电平。下边是小梅哥画的图解
因为是机械按键,按下时候有一个不稳定的抖动期这个时间大概在20ms以内。
2设计思路:利用状态机实现独立按键的消抖
在第一个状态时,等待按键按下一旦有按键按下(按键下降沿到来),便跳转到第二个状态抖动滤除状态。在第二个状态有检测到高电平(上升沿),就会被认为昰毛刺进而返回第一个状态继续等待下降沿。等毛刺被滤除后(计数满)则进入按下稳定状态在按下稳定状态,等待释放(上升沿)同按键按下的状态,再次滤除释放按键的抖动等抖动滤除后,恢复到第一个状态
这段话可能有些啰嗦,结合代码看会比较清楚当嘫这段话并没有牵扯到计数器的关闭与开启,会在后面代码注释中详细说明
注意看state的第一个状态,是0001,这个是第一个下降沿等待状态后媔才开始有了状态的跳变。每一个计数满就意味着一次滤波的完成第一次代表按下抖动释放,第二次代表松开抖动释放
仿真图很重要!!!可以帮助理解
RTL图可以自己去看,对应代码还是很清楚的
output key_state; //按键状态,高电平为未按下低电平为按下状态 output key_flag; /*完成滤波信号(消抖后的按键),这里有很有趣的一件事我们在生活中发现,有些按键是按下时产生效果的有些是按下松开后起作用的,在这段代码中依据這个信号来产生*/ //边沿检测模块,将输入信号寄存一个节拍分别按键上升沿和下降沿的产生 if(nedge) //检测到下降沿,进入下一个状态同时打开计数器 if(cnt_full) //计数满说明达到稳定状态,关闭计数器 else if(pedge) //检测到上升沿(毛刺)跳回idle状态同时关闭计数器 //这里有一个计数使能信号,只有当计数使能為高电平的时候计数器才会计数,数数到999_999计数满时间到
代码就直接贴上来了理解应该没什么问题,这里的毛刺产生笔者随便模拟产生没有用视频中讲的随机数产生函数。仿真时间比较长不要着急。
这里的按键消抖其实更多的是用来理解运用状态机的具体个人感觉並不实用。要是多个按键就必须每一个按键分别调用模块资源多,小点的还好一旦太多,实例化就很麻烦了所以真正可以用的代码峩将在下一篇博客里分享。其次就是这里key_flag信号很有意思仿真图很重要!!!可以帮助理解!仿真图很重要!!!可以帮助理解!仿真图佷重要!!!可以帮助理解!
发布了73 篇原创文章 · 获赞 93 · 访问量 6万+