原理
按键抖动示意图如图所示(图中的按键信号默认为低电平, 按下为高电平。 如按键信号默认为高电平, 按下为低电平, 则按键信号的前沿为下降沿, 后沿为上升沿) 。 抖动时间的长短由按键的机械特性决定, 一般为 5ms~20ms。 这是一个很重要的时间参数, 在很多场合都要用到。
根据按键产生的实际信号特性, 可以采用下面的思路实现消抖功能。
- 初次检测到按键动作时, 前沿计数器开始计数, 且持续计至 20ms;
- 当前沿计数器计满 20ms 后, 检测松开按键的动作, 如检测到松开按键的动作, 则后沿计数器开始计数, 且持续计满 20ms 后清零;
- 当前沿计数器及后沿计数器均计满 20ms 时, 前沿计数器清零, 开始下一次按键动作的检测。
根据上述设计思路, 每检测到一次按键动作, 前沿计数器和后沿计数器均会有一次从 0持续计数至 20ms 的过程。 根据任意一个计数器的状态, 如判断前沿计数器为 1 时, 输出一个时钟周期的高电平脉冲, 即可用于标识一次按键动作。
代码
module keyshape(