键盘防抖
时间: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
- Docker系列教程15-Docker容器网络
- 数据挖掘
- Docker系列教程14-Docker数据持久化
- Docker 学习系列二之基本管理
- Docker系列教程13-Docker可视化管理工具
- Ubuntu 16.04 安装VNC
- 使用Feign实现Form表单提交
- Ubuntu 16.04 Install OpenCV
- Spring Cloud各组件调优参数
- 手把手教你设置 IntelliJ IDEA 的彩色代码主题
- 实用技巧:Hystrix传播ThreadLocal对象(两种方案)
- OpenDaylight与Mininet应用实战之流表操作
- 使用Spring Cloud Feign上传文件
- 用 TensorFlow 让你的机器人唱首原创给你听
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法