无延时按键程序精品文档15页_第1页
无延时按键程序精品文档15页_第2页
无延时按键程序精品文档15页_第3页
无延时按键程序精品文档15页_第4页
无延时按键程序精品文档15页_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在使用单片机搭建有人机交互的系统时需要用到键盘,因为单片机工作时间都是纳秒与毫秒级别,但是我们人体的反应时间最少要0.2 秒,之间差距很大,现实过程中也会不小心碰到按键,正常的按下按键应该是持续数十秒的稳定。 一、按键电路 常用的非编码键盘, 每个在使用单片机搭建有人机交互的系统时需要用到键盘,因为单片机工作时间都是纳秒与毫秒级别,但是我们人体的反应时间最少要 0.2 秒,之间差距很大,现实过程中也会不小心碰到按键,正常的按下按键应该是持续数十秒的稳定。一、按键电路常用的非编码键盘, 每个键都是一个常开开关电路。计数器输入脉冲最好不要直接接普通的按键开关,因为记数器的记数速度非常快, 按键、触

2、点等接触时会有多次接通和断开的现象。我们感觉不到,可是记数器却都记录了下来。例如,虽然只按了 1 下 , 记数器可能记了 3 下。因此,使用按键的记数电路都会增加单稳态电路避免记数错误。二、按键消抖通常的按键所用开关为机械弹性开关 , 当机械触点断开、闭合时,电压信号小型如下图。由于机械触点的弹性作用 , 一个按键开关在闭合时不会马上稳定地接通, 在 断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动 , 如下图。抖动时间的长短由按键的机械特性决定,一般为5ms10m$这是一个 很重要的时间参数,在很多场合都要用 到。按键稳定闭合时间的长短则是由操作人员的按键动作决定的 , 一

3、般为零点几秒至数秒。键抖动会引起一次按键被误读多次。为确保CPUM键的一次闭合仅作一次处理 , 必须去除键抖动。在键闭合稳定时读取键的状态 , 并且必须判别到键释放稳定后再作处理。按键的抖动 , 可用硬件或软件两种方法。三、硬件消抖在键数较少时可用硬件方法消除键抖动。下图所示的RS触发器为常用的硬件去抖。消抖电路如下图中两个“与非”门构成一个RS触发器。当按键未按下时,输出为 1; 当键按下时, 输出为 0。此时即使用按键的机械性能 , 使按键因弹性抖动而产生瞬时断开 (抖动跳开B) , 中要按键不返回原始状态A, 双稳态电路的状态不改变, 输出保持为 0, 不会产生抖动的波形。 也就是说 ,

4、 即使 B 点的电压波形是抖动的 , 但经双 稳态电路之后 , 其输出为正规的矩形波。这一点通过分析RS触发器的工作过程很容易得到验证。利用电容的放电延时,采用并联电容法,也可以实现硬件消抖:消抖电路如下四、软件延时消抖如果按键较多 , 常用软件方法去抖, 即检测出键闭合后执行一个延时程序,产生5ms10ms的延时,让前沿抖动消失后再一次检测键的状态如果仍保持闭合状态电平 , 则确认为真正有键按下。当检测到按键释放后也要给5m晓10ms的延时,待后沿抖动消失后才能转入该键的处理程序。五、无延时的软件消抖/*名称:键盘扫描子函数功能:在按键稳定期内判断键值,并返回键值*/uchar keysca

5、n(void)static char key_state = 0;static char key_value = 0;uchar key_press, key_return = 0;key_press=turn_left&turn_right;/ 读按键 I/O 电平switch (key_state)case 0 :/ 按键初始态if (key_press=0) key_state = 1; /键被按下,但需要确认是否是干扰break;case 1 :/ 按键确认态if (key_press=0)/ 如有键按下则不是干扰,判断键值if(turn_left=0)/ 判断是哪一个按键被按

6、下key_value=1;/ 按键较多时可采用 switch 选择结构else if(turn_right=0)key_value=2;elsekey_value=0;状态转换到键释放态按键已抬起,属于干扰,转换到按键初始key_state = 2; /elsekey_state = 0; /态break;case 2 :if (key_press=1)key_return=key_value;/ 按键释放后再输出键值, 如果按下键就输出则可省略key_valuekey_value=0;key_state = 0; / 如果按键释放,转换到按键初始态break;return key_retur

7、n; / 返回键值/*名称:按键处理子函数功能:*/void key_operation(void)switch (keyscan()/ 根据键值不同,执行不同的内容hight_votage-=1;if(hight_votage<5)hight_votage=5;break;case 2:hight_votage+=1;if(hight_votage>25)hight_votage=25;break;default :break;系统的信号输入中,键盘因其结构简单而被广泛使用。因此,对键盘的输入(逻辑 0 或 1 )进行准确采样,避免错误输入是非常有必要的。理想的键盘输入特性如图

8、1 所示:按键没有按下时,输入为逻辑1 ,一旦按下则输入立刻变为逻辑0,松开时输入则立刻变为逻辑1。图 1 理想键盘输入特性然而实际的键盘受制造工艺等影响,其输入特性不可能如图 1 完美。当按0 和 1 ,也就键按下时,在触点即将接触到完全接触这段时间里,键盘的通断状态很可能已经改变了多次。即在这段时间里,键盘输入了多次逻辑是输入处于失控状态。如果这些输入被系统响应,则系统暂时也将处于失控状态,这是我们要尽量避免的。在触点即将分离到完全分离这段时间也是一样的。实际键盘的输入特性如图 2 所示:图 2 实际键盘输入特性我们可以看到:键盘在输入逻辑转换时,实际上是产生了瞬时的高频干扰脉冲。按键消抖

9、的目的在于消除此干扰,以达到接近图 1 所示的理想输入特性。有两个阶段可以设法消除此干扰: 1. 在键盘信号输入系统之前(系统外); 2. 键盘信号输入系统以后(系统内)。在信号输入系统之前将抖动干扰消除,可以节省系统资源,提高系统对其他信号的响应能力,也就是硬件消抖。一种比较巧妙的硬件消抖电路结构如图 3 所示:图3用基本SR锁存器构成的消抖电路该电路利用基本SR锁存器的记忆作用消除开关触点振动所产生的影响。开关 S 每切换一次,输出端只有一次翻转,不存在抖动波形(读者可以根据SR锁存器功能自行分析,此处略)。但是使用SR锁存器消抖只适用于单刀双掷开关,实际应用当中常用的键盘多是两个接线端的

10、按键。对此类按键的常用硬件消抖电路如图 4 所示:图 4 常用键盘硬件消抖电路第 7 页此电路利用电容平波,再经过施密特反相器整形之后就得到了没有毛刺的 脉冲波。软件消抖要占用系统资源,在系统资源充足的情况下使用软件消抖更加简单。软件消抖的实质在于降低键盘输入端口的采样频率,将高频抖动略去。实际应用中通常采用延时跳过高频抖动区间,然后再检测输入做出相应处理。一般程序代码如下:if (value = 0)/ 一旦检测到键值Delay(); /延时20ms,有效滤除按键的抖动if (value = 0)/再次确定键值是否有效/执行相应处理这段软消抖程序从机理上看不会有什么问题,通常在软件程序不太&

11、quot;繁忙"的情况下也能够很好的消抖并做相应处理。但是如果在延时期间产生了中断,则此中断可能无法得到响应。对于硬件资源丰富的FPGA统,可以使用硬件来减轻软件工作量,通常 称之为“硬件加速"o在按键信号输入到软件系统前用逻辑对其进行一下简单的处理即可实现所谓的"硬件消抖",verilog 代码如下:/对输入信号inpio硬件滤波,每20ms采样一次当前值reg18:0 cnt; /20ms计数器always (posedge clk_25m or negedge rst_n)if(!rst_n) cnt <= 19'd0;else if

12、(cnt < 19'd500000) cnt <= cnt+1'b1;else cnt <= 19'd0;reg1:0 inpior; /当前inpio信号锁存,每20ms锁存一拍always (posedge clk_25m or negedge rst_n)if(!rst_n) inpior <= 2'b11;else if(cnt = 19'h7ffff) inpior <= inpior0,inpior;wire inpio_swin =inpior0 | inpior1;/ 前后 20ms两次锁存值都为0时才为0该

13、程序中设置了一个 20ms计数器,通过间隔20ms对输入信号inpio采样 两次,两次相同则认为键盘输入稳定,得到用硬件逻辑处理后的inpio_swin信号则是消抖处理过的信号。软件程序就不再需要 delay()来 滤波了,也不会出现使用纯软件处理出现的 "中断失去响应”的情况了,这 就是"硬件加速”的效果。上述verilog 代码采用间隔采样来达到消抖的目的,对于不同物理特性的 键盘,最佳的间隔时间采样时间也不同,因此还存在一些不稳定因素。下 面介绍一种更好的软消抖程序,同样采用"硬件加速",不同之处在于使用了有限状态机来实现,其 VHDL弋码如下:L

14、IBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;ENTITY xiaod IS/端口描述:clk输入检测时钟;reset复位信号;din原始按键信号输入;dout去抖动输出信号PORT(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 p

15、re_s, next_s: state;BEGINP0:PROCESS( reset, clk )BEGINif reset = '0' thenpre_s <= s0;elsif rising_edge( clk ) thenpre_s <= next_s;elsenull;end if;END PROCESS P0;P1:PROCESS( pre_s, next_s, din )BEGINcase pre_s iswhen s0 =>dout <= '1'if din = '1' thennext_s <= s0

16、;elsenext_s <= s1;end if;when si => dout <= '1'if din = '1' then next_s <= s0;else next_s <= s2;end if;when s2 => dout <= '1'if din = '1' then next_s <= s0;else next_s <= s3;end if;when s3 => dout <= '0'if din = '1' the

17、nnext_s <= s0;elsenext_s <= s1;end if;end case;END PROCESS P1;END RTL;该VHDL弋码描述了一个状态机,其状态转换图如图所示:图5状态转换图该状态机有4个状态:S0、S1、S2、S3,其中前3个状态输出高电平,最后一个状态输出低电平。初始状态为S0,设按键未按下时为高电平,按下则为低电平。在按键按下到完全生效期间有一系列的抖动,对于持续时间为1-2个时钟周期的低电平抖动将被消除,对于持续时间为3个或以上时钟周期的低电平则认为按键有效,输出一个时钟周期的低电平脉冲(读者可以根据状态转换图画出相应的时序图进行分析)。如果持续输入为低电平,则每隔两个时钟周期输出一个低电平,此时认为按键处于 "长按 "输入状态, 可以编程设置相应功能。 在按键松开阶段其抖动也可以一样被消除。适用于FPGA勺按键消抖方法还有一些,如计数器型、D触发器型等,在此就不作介绍了。通过上面一些按键消抖方法的介绍分析,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论