0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

系统的信号输入中,键盘因其结构简单而被广泛使用

单片机 来源:未知 作者:李倩 2018-04-28 11:48 次阅读

系统的信号输入中,键盘因其结构简单而被广泛使用。因此,对键盘的输入(逻辑0或1)进行准确采样,避免错误输入是非常有必要的。理想的键盘输入特性如图1所示:按键没有按下时,输入为逻辑1,一旦按下则输入立刻变为逻辑0,松开时输入则立刻变为逻辑1。

图 1理想键盘输入特性

然而实际的键盘受制造工艺等影响,其输入特性不可能如图1完美。当按键按下时,在触点即将接触到完全接触这段时间里,键盘的通断状态很可能已经改变了多次。即在这段时间里,键盘输入了多次逻辑0和1,也就是输入处于失控状态。如果这些输入被系统响应,则系统暂时也将处于失控状态,这是我们要尽量避免的。在触点即将分离到完全分离这段时间也是一样的。实际键盘的输入特性如图2所示:

图 2实际键盘输入特性

我们可以看到:键盘在输入逻辑转换时,实际上是产生了瞬时的高频干扰脉冲。按键消抖的目的在于消除此干扰,以达到接近图1所示的理想输入特性。有两个阶段可以设法消除此干扰:1.在键盘信号输入系统之前(系统外);2.键盘信号输入系统以后(系统内)。

在信号输入系统之前将抖动干扰消除,可以节省系统资源,提高系统对其他信号的响应能力,也就是硬件消抖。一种比较巧妙的硬件消抖电路结构如图3所示:

图 3用基本SR锁存器构成的消抖电路

该电路利用基本SR锁存器的记忆作用消除开关触点振动所产生的影响。开关S每切换一次,输出端只有一次翻转,不存在抖动波形(读者可以根据SR锁存器功能自行分析,此处略)。但是使用SR锁存器消抖只适用于单刀双掷开关,实际应用当中常用的键盘多是两个接线端的按键。对此类按键的常用硬件消抖电路如图4所示:

图 4常用键盘硬件消抖电路

此电路利用电容平波,再经过施密特反相器整形之后就得到了没有毛刺的脉冲波。

软件消抖要占用系统资源,在系统资源充足的情况下使用软件消抖更加简单。软件消抖的实质在于降低键盘输入端口的采样频率,将高频抖动略去。实际应用中通常采用延时跳过高频抖动区间,然后再检测输入做出相应处理。一般程序代码如下:

if(value == 0)//一旦检测到键值
{
Delay();//延时20ms,有效滤除按键的抖动
if(value == 0)//再次确定键值是否有效
{
……//执行相应处理
}
}

这段软消抖程序从机理上看不会有什么问题,通常在软件程序不太"繁忙"的情况下也能够很好的消抖并做相应处理。但是如果在延时期间产生了中断,则此中断可能无法得到响应。

对于硬件资源丰富的FPGA系统,可以使用硬件来减轻软件工作量,通常称之为"硬件加速"。在按键信号输入到软件系统前用逻辑对其进行一下简单的处理即可实现所谓的"硬件消抖",verilog代码如下:

//对输入信号inpio硬件滤波,每20ms采样一次当前值
reg[18:0] cnt; //20ms计数器
always @(posedge clk_25m or negedge rst_n)
if(!rst_n) cnt <= 19'd0;
else if(cnt < 19'd500000) cnt <= cnt+1'b1;
else cnt <= 19'd0;
reg[1:0] inpior;//当前inpio信号锁存,每20ms锁存一拍
always @(posedge clk_25m or negedge rst_n)
if(!rst_n) inpior <= 2'b11;
else if(cnt == 19'h7ffff) inpior <= {inpior[0],inpior};
wire inpio_swin =inpior[0] | inpior[1];//前后20ms两次锁存值都为0时才为0

该程序中设置了一个20ms计数器,通过间隔20ms对输入信号inpio采样两次,两次相同则认为键盘输入稳定,得到用硬件逻辑处理后的inpio_swin信号则是消抖处理过的信号。软件程序就不再需要delay()来滤波了,也不会出现使用纯软件处理出现的"中断失去响应"的情况了,这就是"硬件加速"的效果。

上述verilog代码采用间隔采样来达到消抖的目的,对于不同物理特性的键盘,最佳的间隔时间采样时间也不同,因此还存在一些不稳定因素。下面介绍一种更好的软消抖程序,同样采用"硬件加速",不同之处在于使用了有限状态机来实现,其VHDL代码如下:

LIBRARY 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 IS
TYPE state IS( s0,s1,s2,s3);
SIGNAL pre_s, next_s: state;
BEGIN
P0:PROCESS( reset, clk )
BEGIN
if reset = '0' then
pre_s <= s0;
elsif rising_edge( clk ) then
pre_s <= next_s;
else
null;
end if;
END PROCESS P0;
P1:PROCESS( pre_s, next_s, din )
BEGIN
case pre_s is
when s0 =>
dout <= '1';
if din = '1' then
next_s <= s0;
else
next_s <= s1;
end if;
when s1 =>
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' then
next_s <= s0;
else
next_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触发器型等,在此就不作介绍了。

通过上面一些按键消抖方法的介绍分析,我们可以看到,传统单片机等系统大多是串行处理,即顺序执行,只能并行处理一些中断程序。对于这样的系统,只能采用单纯软件或硬件消抖,但都不那么完美。而对于FPGA等并行处理的系统,其优势就很明显,只要片内逻辑资源够用,通过硬件加速软件消抖的处理,完全可以做到按键消抖并行化,不影响系统的实时性。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 电路
    +关注

    关注

    172

    文章

    5825

    浏览量

    171741
  • 键盘
    +关注

    关注

    4

    文章

    858

    浏览量

    39535
  • 锁存器
    +关注

    关注

    8

    文章

    904

    浏览量

    41417

原文标题:按键原理和软硬件按键消抖动

文章出处:【微信号:aidanpianji,微信公众号:单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    矩阵键盘原理与结构

    矩阵式结构键盘识别要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的
    发表于 10-25 13:42 1.4w次阅读

    电脑键盘结构介绍

    超薄的膝上型电脑上使用。只是与薄膜接触式键盘相比,这种结构的寿命更短,所以现在除了在某些特殊用途以外,已经在逐渐消失。电脑键盘  这种通过查表获得按键编码的方式称之为“非编码式
    发表于 12-30 11:56

    电脑键盘内部结构及电脑键盘常见分类

    等等。当一个键按下时,微处理器便根据其位置,将字符信号转换成二进制码,传给主机和显示器。如果操作人员的输入速度很快或CPU正在进行其它的工作,就先将键入的内容送往内存的电脑
    发表于 12-30 14:18

    事件结构如何扫描键盘输入呢?

    事件结构如何扫描键盘输入呢?求教
    发表于 01-13 10:35

    计算机测试系统结构与原理

    ;③ 智能化系统与非智能化系统。一、信号输入通道的基本结构
    发表于 01-04 17:04

    嵌入式系统键盘接口设计

    中断处理子模块完成的。当系统有按键按下时,驱动程序先关掉中断,然后扫描键盘,确定哪个键按下,键盘按下和抬起都有中断发生,这样可以为用户提
    发表于 05-22 05:01

    单片机学习一键盘接口方式详解

    简单,容易实现,因此广泛应用于单片机系统。独立式键盘是由若干个机械触点开关构成的,将其与单
    发表于 08-25 10:00

    小型键盘结构与接口

    键盘是一个由开关组成的矩阵,是重要的输入设备,在小型微机系统,如单板微计算机、带有微处理器的专用设备
    发表于 12-09 11:45 19次下载

    矩阵键盘产生PC机键盘信号的应用设计

    PC104 总线嵌入式系统在工程设计上得到了广泛应用,而其主要的人机交互设备——PC机标准键盘则因不适应工业环境受到了限制。我们希望自己设计的薄膜式矩阵
    发表于 04-16 13:48 43次下载

    智能键盘字符输入及LCD显示系统设计

    提出了一种基于单片机的智能键盘字符输入及LCD显示系统设计方案。详细阐述了系统硬件设计各模块接口电路和工作原理,介绍了点阵字符型液晶显示模块(LCD)和
    发表于 12-23 15:36 64次下载

    单片机显控系统的汉字输入

    单片机显控系统的汉字输入 对于PC机来说,输入汉字是非常简单的,但在一些单片机人机接口系统
    发表于 12-08 15:25 2973次阅读
    单片机显控<b class='flag-5'>系统</b><b class='flag-5'>中</b>的汉字<b class='flag-5'>输入</b>

    25课:单片机键盘接口程序设计

    ,使用灵活等特点,因此广泛应用于单片机系统。 按钮开关的抖动问题 组成键盘的按钮有触点式和非触点式两种,单片机应用的一般是由机械触点组成
    发表于 11-22 12:03 863次阅读
    25课:单片机<b class='flag-5'>键盘</b>接口程序设计

    51单片机汇编语言教程之单片机键盘接口程序设计的详细资料说明

    据。一般单片机系统采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构
    发表于 06-05 16:30 19次下载
    51单片机汇编语言教程之单片机<b class='flag-5'>键盘</b>接口程序设计的详细资料说明

    单片机键盘输入的程序

    应该说键盘输入是单片机外部指令输入的重要途径,因此如何设计键盘以及键盘的工作原理、读键盘的方法、键盘
    的头像 发表于 06-21 11:38 4945次阅读

    键盘瑕疵检测系统简单介绍

    在3c产品检测过程键盘瑕疵检测是最常见的一种检测产品,通过键盘瑕疵检测系统来检测键盘上的瑕疵可以大大提高生产效率和产品质量。那么接下来我
    发表于 08-10 16:52 839次阅读