码迷,mamicode.com
首页 > 其他好文 > 详细

按键消抖

时间:2020-05-27 18:52:54      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:外部   0ms   图片   pos   parameter   代码   机械   amp   inpu   

按键消抖原因

使用机械弹性开关,当机械触点闭合/断开时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定的接通,在断开时也不会马上断开。而是会在闭合/断开的瞬间伴随一连串的抖动,为避免这种现象带来的问题,需要进行按键消抖。

技术图片

硬件消抖

按键个数较少时可以使用硬件方法消除抖动。下图所示为使用RS触发器进行硬件消抖,当按键未按下时,输出为0;当按键按下时,输出为1。此时,即使按键因为弹性抖动而产生瞬时断开(抖动从B跳开),只要按键不回到原始状态A,双稳态触发器的状态也不会改变(保持为0),从而不产生抖动的波形。

技术图片

软件消抖

原理

按键数量较多的情况下,通常采用软件方法进行消抖。在检测到按键闭合后开始执行一个延时程序,根据抖动的时间通常为5~10ms,去产生一个20ms的延时,让前沿抖动消失后再一次检测按键的状态。如果仍保持闭合状态电平,则认定为真正有键按下。

按键消抖代码

技术图片
 1 module key_fileter #(parameter CNT_MAX=20d999_999)(
 2     input        sys_clk        ,    // 系统时钟50MHz
 3     input        sys_rst_n    ,    // 全局复位
 4     input        key_in        ,    // 按键输入信号
 5     output    reg    key_flag        // 为1时表示消抖后检测到按键被按下,为0表示没有检测到被按下
 6 );
 7     reg    [19:0]    cnt_20ms;
 8     // cnt_20ms:如果时钟的上升沿检测到外部按键输入的值为低电平时,开始计数
 9     always @(posedge sys_clk or negedge sys_rst_n)
10         if(!sys_rst_n)
11             cnt_20ms <= 20b0;
12         else if(key_in)
13             cnt_20ms <= 20b0;
14         else if(cnt_20ms==CNT_MAX && key_in)
15             cnt_20ms <= cnt_20ms;
16         else
17             cnt_20ms <= cnt_20ms + 1b1;
18     
19     // key_flag:当计数满20ms后产生按键有效标志位,且key_flag在999_999时拉高,维持一个周期的高电平
20     always @(posedge sys_clk or negedge sys_rst_n)
21         if(!sys_rst_n)
22             key_flag <= 1b0;
23         else if(cnt_20ms== CNT_MAX-1b1)
24             key_flag <= 1b1;
25         else
26             key_flag <= 1b0;
27             
28 endmodule
key_filter

按键消抖tb

按键消抖

标签:外部   0ms   图片   pos   parameter   代码   机械   amp   inpu   

原文地址:https://www.cnblogs.com/lizhiqing/p/12974922.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!