3.2.2 独立按键检测(消抖流程图)

合集下载

独立按键连按和长按处理技巧

独立按键连按和长按处理技巧

单片机按键处理技巧及编程方式2010-10-23 15:01从这一章开始,我们步入按键程序设计的殿堂。

在基于单片机为核心构成的应用系统中,用户输入是必不可少的一部分。

输入可以分很多种情况,譬如有的系统支持PS2键盘的接口,有的系统输入是基于编码器,有的系统输入是基于串口或者USB或者其它输入通道等等。

在各种输入途径中,更常见的是,基于单个按键或者由单个键盘按照一定排列构成的矩阵键盘(行列键盘)。

我们这一篇章主要讨论的对象就是基于单个按键的程序设计,以及矩阵键盘的程序编写。

◎按键检测的原理常见的独立按键的外观如下,相信大家并不陌生,各种常见的开发板学习板上随处可以看到他们的身影。

(原文件名:1.jpg)引用图片总共有四个引脚,一般情况下,处于同一边的两个引脚内部是连接在一起的,如何分辨两个引脚是否处在同一边呢?可以将按键翻转过来,处于同一边的两个引脚,有一条突起的线将他们连接一起,以标示它们俩是相连的。

如果无法观察得到,用数字万用表的二极管挡位检测一下即可。

搞清楚这点非常重要,对于我们画PCB的时候的封装很有益。

它们和我们的单片机系统的I/O口连接一般如下:(原文件名:2.jpg)引用图片对于单片机I/O内部有上拉电阻的微控制器而言,还可以省掉外部的那个上拉电阻。

简单分析一下按键检测的原理。

当按键没有按下的时候,单片机I/O通过上拉电阻R接到VCC,我们在程序中读取该I/O的电平的时候,其值为1(高电平); 当按键S按下的时候,该I/O被短接到GND,在程序中读取该I/O的电平的时候,其值为0(低电平) 。

这样,按键的按下与否,就和与该按键相连的I/O的电平的变化相对应起来。

结论:我们在程序中通过检测到该I/O口电平的变化与否,即可以知道按键是否被按下,从而做出相应的响应。

一切看起来很美好,是这样的吗?◎现实并非理想在我们通过上面的按键检测原理得出上述的结论的时候,其实忽略了一个重要的问题,那就是现实中按键按下时候的电平变化状态。

按键消抖

按键消抖

一、按键消抖1.1 计数器型消抖电路(一)计数器型消抖电路(一)是设置一个模值为(N+1)的控制计数器,clk在上升沿时,如果按键开关key_in='1',计数器加1,key_in='0' 时,计数器清零。

当计数器值为2时,key_out 输出才为1,其他值为0时。

计数器值为N时处于保持状态。

因此按键key_in持续时间大于N个clk时钟周期时,计数器输出一个单脉冲,否则没有脉冲输出。

如果按键开关抖动产生的毛刺宽度小于N个时钟周期,因而毛刺作用不可能使计数器有输出,防抖动目的得以实现。

clk的时钟周期与N的值可以根据按键抖动时间由设计者自行设定。

主要程序结构如下:图1是N为3的波形仿真图,当按键持续时间大于3个时钟周期,计数器输出一个单脉冲,其宽度为1个时钟周期,小于3个时钟周期的窄脉冲用作模拟抖动干扰,从图1可以看出,抖动不能干扰正常的单脉冲输出。

1 按键抖动产生原因分析绝大多数按键都是机械式开关结构,由于机械式开关的核心部件为弹性金属簧片,因而在开关切换的瞬间会在接触点出现来回弹跳的现象。

虽然只是进行了一次按键,结果在按键信号稳定的前后出现了多个脉冲,如图1所示。

如果将这样的信号直接送给微处理器扫描采集的话,将可能把按键稳定前后出现的脉冲信号当作按键信号,这就出现人为的一次按键但微处理器以为多次按键现象。

为了确保按键识别的准确性,在按键信号抖动的情况下不能进入状态输入,为此就必须对按键进行消抖处理,消除抖动时不稳定、随机的电压信号。

机械式按键的抖动次数、抖动时间、抖动波形都是随机的。

不同类型的按键其最长抖动时间也有差别,抖动时间的长短和按键的机械特性有关,一般为5~10 ms,但是,有些按键的抖动时间可达到20 ms,甚至更长。

所以,在具体设计中要具体分析,根据实际情况来调整设计。

2 按键消抖电路的设计按键消抖一般采用硬件和软件消抖两种方法。

硬件消抖是利用电路滤波的原理实现,软件消抖是通过按键延时来实现。

炼狱传奇3-2基于边缘检测的按键消抖之战

炼狱传奇3-2基于边缘检测的按键消抖之战

炼狱传奇-基于边缘检测的按键消抖
之战
按键开关是各种电子设备不可或缺的人机接口,在实际应用中很大一部分的按键是机械按键,在按键闭合或断开的时候都会产生抖动,为了系统能正确识别按键信号,我们就必须进行按键消抖处理。

实际的系统中有各种按键消抖的方法,在这里我们介绍一种基于信号边缘检测的消抖方法。

在较大型的系统设计中,为了避免过多的逻辑冗余和控制错误,我们一般会选择尖峰脉冲作为多个模块之间的握手信号或控制信号,我们此战的目的就是要将检测到的按键电平变化经过抖动消除以后转换成只有一个周期的尖峰脉冲输
系统功能说明:当系统第一次检测到按键按下以后,开始启动计数器计数,如果在20ms内没有再次检测到按键值跳变说明按键确实按下,而非噪声干扰,继而可以输出尖峰脉冲,控制其他模块动作。

否则计数器清零,等待下次按键到来。

具体代码如下:
测试代码如下:
测试波形如下:
由波形图可以看出,如果按键按下时间短就会被当做抖动处理,系统不做出反应,如果按键稳定时间足够长,系统输出key_come信号就会置高一个时钟周期,说明系统设计正确。

嵌入式独立键盘检测控制实验

嵌入式独立键盘检测控制实验

昆明理工大学信息工程与自动化学院学生实验报告(2013 —2014 学年第 2 学期)一、实验目的掌握单片机系统中独立键盘的编程控制方法,学会实时程序的调试技巧。

二、实验原理键盘是单片机应用中常用的输入设备,在应用系统中,操作人员可通过键盘向系统输入指令、地址和数据,实现简单的人机通信。

键盘实际上是一组按键开关的集合,平时总是处于断开状态,当按下键时它才闭合。

按键在闭合和断开时,触点会存在抖动现象,抖动时间一般为5-10ms,键盘的处理主要涉及以下3个方面的内容:➢按键的识别所接I/O口线是高还是低电平(根据连接情况)➢抖动的消除硬件消抖软件消抖(延时)➢判断键值实验板电路原理图如下:三、实验内容利用TX-1C实验板上的数码管前三位显示一个跑表,从000到999之间以1%秒速度运行,当按下独立键盘的S2时跑表停止,松开手后跑表继续运行。

(用定时器设计表)。

在上面的基础上,用另外三个独立键盘(S3、S4、S5)实现按下S3时计时停止,按下S4时计时开始,按下S5时计数值清零从头开始。

四、实验步骤1、按实验内容要求在µ Vision中创建项目,编辑、调试、编译程序。

2、将编译生成的目标码文件(后缀为.Hex)下载到实验板上。

3、观察实验运行结果并记录。

1.原理补充:在简单的单片机应用系统中,往往只需要几个功能键就能满足要求,此时,可采用独立式按键结构。

独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。

独立式按键的典型应用如图1.2.1所示。

独立式按键示意图独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。

程序开始,检测按键是否被按下,若按下,则移动机器人启动,未被按下,继续检测。

这里将程序分成三个部分,分别是延时子函数、按键子函数、主函数。

实验二

实验二

实验二 按键消抖 图T2.22 添加观察变量
实验二 按键消抖 ⑦ 在工具栏的红色标记编辑框中设置仿真时间,如图 T2.23所示,时间自行设定,建议设置为500 ms。
图T2.23 设置仿真时间
实验二 按键消抖 ⑧ 点击工具栏中红色标记框内的按钮,开始仿真,如 图T2.24所示。
图T2.24 开始仿真
图T2.19 双击“Simulate Behavioral Model”
实验二 按键消抖 图T2.20 进入“ModelSimSE 6.2b”仿真环境
实验二 按键消抖
⑥ 进入ModelSimSE后,观察在“wave-default”窗口中 有没有出现不想观看波形的端口,如果有此端口,请在此端 口上点鼠标右键,选择“Delete”选项,如图T2.21所示。
图T2.27 确定配置引脚
实验二 按键消抖 ③ 在Xilinx PACE中浏览“Design Object List-I/O Pins” 窗口,在Loc中输入对应的引脚。图T2.28为配置好的此实验 的引脚图表。
图T2.28 参考“lab1_ucf.txt”文件配置引脚
实验二 按键消抖 ④ 在Xilinx PACE窗口中,选择“File”→“Save”。在出 现的“Bus Delimiter”对话框里选择默认的“XST Default”形 式,点击“OK”按钮,如图T2.29所示。
实验二 按键消抖 图T2.3 启动ISE
实验二 按键消抖 ② 新建一个工程项目,选择菜单命令“File”→“New Project…”(如果打开ISE后,上面已经有存在的工程项目, 请选择“File”→“Close Project”),如图T2.4所示。
图T2.4 新建工程
实验二 按键消抖 ③ 在弹出的“Create New Project”对话框中,通过“ ” 按钮选择工程项目的存放路径(本实验以存放在 D 盘 EZboard_experi ment\labs\lab2\文 件夹下 为例,路 径可任意 更 改,但请确保所有路径都为英文名称)。在“Project Name” 编辑框中输入工程名称(这里以输入 project 为例),如图 T2.5 所示,然 后点击“Next”按钮。

一个即简单经济又稳定可靠的独立按键检测设计方案

一个即简单经济又稳定可靠的独立按键检测设计方案

一个即简单经济又稳定可靠的独立按键检测设计方案作者:罗立辉来源:《中国科技纵横》2015年第20期【摘要】本文首先简要介绍了独立按键检测主动查询与中断查询这两种方式的优缺点。

根据这两种方式的优缺点,本文着重讨论了具有跟大优势的中断查询方式的按键检测方案的实现原理和过程。

并且,针对按键普遍存在的抖动问题,本文由简单到复杂的过渡方式,详细深入地介绍进行方案的优化和改良的目的以及方法。

【关键词】按键延时抖动扫描1主动查询方式的优缺点对于主动循环查询方式,最大的优点在于原理简单,比较适合于MCU处理的任务不是特别多的情况。

如果MCU大循环的轮询周期较长,很有可能在按键按下的瞬间错过了。

这是主动查询方式的最大缺点。

另外,该方式比较浪费CPU的时间资源。

检测按键的处理程序需要有个延迟消抖的过程。

对于机械弹性开关,一般需要的的延迟消抖时间为10ms。

很多程序都是使用一般的延时函数来实现消抖的目的。

然而对于很多复杂的产品,CPU需要执行繁重的任务。

在10ms时间里,CPU可以执行上千上万条其他任务的汇编指令。

2中断查询的方式的优缺点中断查询方式主要缺点在于,该方式需要占用MCU一个外部中断功能(有些功能简单、价钱低廉的MCU,其IO引脚复用功能资源有限),以及处理程序稍微复杂一下。

与主动查询相比,中断查询方式则有响应时间短、稳定可靠等优点。

一旦有中断响应,CPU一定立即响应中断请求。

因此,中断查询方式不存在“错过”、“漏检”的情况。

按键检测的原理图设计图1所示:图1 按键检测的原理图设计图在原理图1设计中,为了检验按键被按下,MCU在中断服务程序里,通过程序翻转LED 亮灭状态,以便读者更容易理解其中的原理机制。

经过测试,每按一下按键,LDE灯都实现了翻转的动作。

该函数基本实现了预期的功能。

在中断函数里,笔者使用了简单的的概率统计方法,提高准确性。

这个中断服务程序运行的时间大概为5us*20=0.1ms,远远少于相对通常的软件延时方式所用的10ms,因此提高了CPU对资源的使用效率。

按键消抖

按键消抖

状态机实现去抖动原理:按键去抖动关键在弄提取键稳定的电平状态,滤除前沿、后沿抖动毛刺。

对于一个按键信号,可以用一个脉冲对它进行取样,如果连续三次取样为低电平,可以认为信号已经处于键稳定状态,这时输出一个低电平的按键信号。

继续取样的过程如果不能满足连续三次取样为低,则认为键稳定状态结束,这时输出变为高电平。

设计的状态转换图如图所示。

Reset信号有效时,电路进入复位状态s0,这时认为取样没有检测到低电平,在输入取样过程中,每次检测到一个低电平,发生依次向下的状态转移,直到连续检测到三个低电平时,进s3态,这时输出置低(按键信号稳定态),在中间状态s1,s2时,一旦检测到高电平,就进入s0状态,重新检测。

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity xiaod isport(clk : in std_logic ;reset : in std_logic ;din : in std_logic ;dout : out std_logic);end entity;architecture rtl of xiaod isTYPE state IS( s0,s1,s2,s3);SIGNAL pre_s, next_s: state;beginprocess( reset, clk )beginif reset = '0' thenpre_s <= s0;elsif rising_edge( clk ) thenpre_s <= next_s;elsenull;end if;end process;process( pre_s, next_s, din ) begincase pre_s iswhen s0 =>dout <= '1';if din = '1' thennext_s <= s0;elsenext_s <= s1;end if;when s1 =>dout <= '1';if din = '1' thennext_s <= s0;elsenext_s <= s2;end if;when s2 =>dout <= '1';if din = '1' thennext_s <= s0;elsenext_s <= s3;end if;when s3 =>dout <= '0';if din = '1' thennext_s <= s0;elsenext_s <= s1;end if;end case;end process ;end rtl;程序中din为要去抖动的热键信号,dou为去抖后输出的稳定信号。

实验23按键消抖冯冠玺

实验23按键消抖冯冠玺
wire clkout_100,key_pulse;
initial
begin
led=0;
end
Fenpin fp(clk_100m,clkout_100,reset);//分频模块,有100MHz的作为输入,输出是100Hz时钟
Xiaodou xd(reset,clkout_100,key,key_pulse);//消抖模块,接收100Hz时钟,输出是key_pulse
always@(posedge reset or posedge clk_100M)
begin
if(reset)
begin
counter<=19'd0;
clkout_100<=1'b0;
end
else if(counter==19'd500000)/*在counter为1M的一半时,反转状态,也就是每半个周期方波信号从0变为1,或从1变为0*/
第18,19个实验:郑凯
各模块示意图:
一.分频器模块
clk_100mclk_100m分频器
clk_10ms
clkout_100
resetreset
二.按键消抖模块
reset reset
按键消抖模块
clk_100 clk
key_pulse
keykey
三.计数器模块
计数器
resetreset
led
clkclk
S5:key_pulse<=key?1:0;
endcase
case(ST)
S0:ST<=key?S1:S0;
S1:ST<=key?S3:S2;
S2:ST<=key?S1:S0;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档