按键抖动原理
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动。想要消除按键的抖动,可以使用软件的方法,通过延时来跳过抖动的过程再检测按键的状态。
消抖思路
当检测到按键的第一次按下的时候,开始进行计时,一般按键的抖动在按下按键后的5ms到10ms,我们可以进行10ms的延时来跳过抖动,检测10ms后的按键状态并把这个状态作为按键的最终状态。
代码示例
reg[30:0] cnt2;//计数2,用来控制状态2和状态3的时间
reg[19:0] cnt3;//按键消抖计数10ms
always@(posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0)
cnt3 <= 'd0;
else if(key1 == 1'b1 || key2 == 1'b1)
begin
if(cnt3 == 'd1000000)
cnt3 <= cnt3;
else
cnt3 <= cnt3 + 1'b1;
end
else
cnt3 <= 'd0;
end
always@(posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0)
begin
key_1 <= 1'b0;
key_2 <= 1'b0;
end
else if(key1 == 1'b1)
key_1 <= (cnt3 == 'd999999)? 1'b1:1'b0;
else if(key2)
key_2 <= (cnt3 == 'd999999)? 1'b1:1'b0;
else
begin
key_1 <= key_1;
key_2 <= key_2;
end
end
这里做的是两个按键的消抖,是为我的SG90模块服务的(优化)
SG90
其中key1和key2是按键的真实状态(存在抖动),key_1和key_2是按键消抖后的可应用状态。