键盘防抖

时间:2022-04-28
本文章向大家介绍键盘防抖,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

按键大多是机械式开关结构,一个按键开关在闭合是不会马上接通,在断开时也不会一下在断开,而是会产生一系列的抖动现象。释放按键后,按键信号稳定前出现了多个段脉冲,如果将这样的信号直接送到计数器之类的时序电路,结果将可能发生计数超过一次以上的误动作,从而误以为键盘按了多次。因此,必须加上抖动消除电路,除去短脉冲。

常见的消抖方法可分为软件和硬件方式两大类。软件消抖通过计数器对键值进行判断,当某一键值保持一段时间不变时,才确认其为有效值。简单的硬件消抖主要通过电容的充放电来消除按键的毛刺。对于稳定性要求比较高的应用则需要借助专门的防抖芯片来实现消抖。不同开关的最长抖动时间也不同。抖动时间的长短和机械开关特性有关,一般为5ms到10ms。但是,某些开关的抖动时间长达20ms,甚至更长。一般按键按下去的时间由操作人员决定,通常为零点几秒至数秒。

在实现时需要注意计数器门限的取值,如果门限值太大,即采样时间过长,将漏掉正确的信号;如果计数器的门限值过小,即采样时间太短,则会将毛刺误认为是正确信号。一般我们认为按键按下的时间在100ms以上,假设稳定时间的占空比为50%,也就是说在图11-28所示场景中,前沿抖动的时间和稳定的时间各为50ms。因此稳定时间大于50ms的信号为正确信号,而稳定时间小于50ms的为毛刺。因此计数器的门限值n为:50ms/系统采样时钟周期。在上例中,系统的采样时钟为100MHz,所以计数器的门限值为50ms*100MHz=24'h4C4B40。

module anti_shake(
clk_100MHz,PB_UP,PB_OUT,count_sel
    );
 input clk_100MHz;
 input PB_UP;
 output PB_OUT;
 output [1:0]count_sel;//the counter out
 reg [23:0]count_high=0;//the high level counter
 reg [23:0]count_low=0;//the low level counter
 reg PB_reg=0;
 reg [1:0]count_sel_reg=0;
 assign PB_OUT=PB_reg;
 assign count_sel=count_sel_reg;
 always @ ( posedge clk_100MHz )
 begin
if(PB_UP==1)
count_high<=count_high+1;
else
count_high<=0;
 end
 always @ ( posedge clk_100MHz )
 begin
if(PB_UP==0)
count_low<=count_low+1;
else
count_low<=0;
 end
 always @ ( posedge clk_100MHz )
 begin
if(count_high==24'h4C4B40)
PB_reg<=1;
else
if(count_low==24'h4C4B40)
PB_reg<=0;
else
PB_reg<=PB_reg;
 end
 always @ ( posedge clk_100MHz )//the counter out
 count_sel_reg<=count_sel_reg+1; 
endmodule