按键去抖动程序

合集下载

io按键消抖算法

io按键消抖算法

io按键消抖算法
IO按键消抖算法是电子设备中常用的一种技术,用于处理按键在按下或释放时可能出现的抖动现象。

抖动现象是由于机械开关在接触或断开时,由于物理原因(如弹性、接触电阻等)导致电路状态瞬间不稳定,从而产生多个快速的电平变化。

如果不进行消抖处理,这些快速变化可能会被设备误识别为多次按键操作,导致程序逻辑混乱。

消抖算法的主要目的是识别并过滤这些快速的电平变化,确保设备只响应一次按键操作。

一种常用的消抖算法是延时消抖法。

当检测到按键被按下时,程序会先等待一段时间(通常是几十毫秒),然后再读取按键状态。

如果按键仍然处于按下状态,则认为是有效的按键操作;如果按键已经释放,则认为是抖动现象,忽略这次操作。

同样地,当检测到按键被释放时,也需要进行类似的延时处理。

除了延时消抖法外,还有其他一些消抖算法,如软件定时器消抖、硬件消抖等。

软件定时器消抖是通过在程序中设置一个定时器,在定时器到期后再读取按键状态,从而过滤掉抖动现象。

硬件消抖则是通过外部电路实现消抖功能,例如使用施密特触发器、RC滤波器等。

需要注意的是,消抖算法的实现方式和参数选择需要根据具体的硬件环境和应用场景来确定。

在实际应用中,可能需要根据按键的特性和使用频率来调整消抖时间和算法复杂度,以确保程序的稳定性和响应速度。

总之,IO按键消抖算法是电子设备中不可或缺的一部分,它能够提高设备的可靠性和用户体验。

在实际应用中,需要根据具体情况选择合适的消抖算法和参数,以确保设备的正常运行。

Verilog写的按键消抖程序

Verilog写的按键消抖程序

前几天看了特权同学用Verilog写的按键消抖程序,感觉很经典。

在这里将程序贴出来分享一下。

module lcd_button2(clk,rst,seg,wei,sw1,sw2,sw3,sw4);//按键按下,数码管依次显示0-9input clk;input rst;input sw1,sw2,sw3,sw4;output [3:0] wei;output[7:0] seg;reg [7:0] seg;reg [3:0] wei;integer num;initial beginnum = 0;endreg[3:0] key_rst;always @(posedge clk or negedge rst)if(!rst)key_rst <= 4'b1111;elsekey_rst <= {sw4,sw3,sw2,sw1};reg[3:0] key_rst_r;always @(posedge clk or negedge rst)if(!rst)key_rst_r <= 4'b111;elsekey_rst_r <= key_rst;wire[3:0] key_an = key_rst_r & (~key_rst);reg[19:0] cnt;always @(posedge clk or negedge rst)if(!rst)cnt <= 0;else if(key_an) cnt <= 0;else cnt <= cnt+1'b1;reg [3:0] low_sw;always @(posedge clk or negedge rst)if(!rst)low_sw <= 4'b1111;else if(cnt==10'hfffff)low_sw <= {sw4,sw3,sw2,sw1};reg[3:0] low_sw_r;always @(posedge clk or negedge rst)if(!rst)low_sw_r <= 4'b1111;elselow_sw_r <= low_sw;wire [3:0] led_ctrl = low_sw_r[3:0] & (~low_sw[3:0]);reg d1,d2,d3,d4;always @(posedge clk or negedge rst)if(!rst) begind1 <= 0;d2 <= 0;d3 <= 0;d4 <= 0;endelse beginif(led_ctrl[0]) beginnum <= num+1;if(num==9)num <= 0;endendalways @(posedge clk ) beginwei <= 4'b1111;case(num)0: seg <= 8'hfc;1: seg <= 8'h60;2: seg <= 8'hda;3: seg <= 8'hf2;4: seg <= 8'h66;5: seg <= 8'hb6;6: seg <= 8'hbe;7: seg <= 8'he0;8: seg <= 8'hfe;9: seg <= 8'hf6;default: seg <= 8'h02;endcaseendendmodule参考了特权的代码。

使用按键控制LED灯亮—按键控制LED灯亮灭程序编写

使用按键控制LED灯亮—按键控制LED灯亮灭程序编写

9课Βιβλιοθήκη 任务编写由一个按键按制一个 LED 灯,当 按键按下时,LED 灯亮再按时 LED 灯 灭的 C 语言程序。
单片机技术及应用
单片机技术及应用
1
工作任务
任务要求:
当独立按
键 key 按下时, 发光二极管
LED 点亮,松 开按键 key 时 发光二极管
LED 熄灭。
任务分析:
按下
P3.0端口为“0”


按键Key
序 控
松开
P3.0端口为“0”


2
程序设计流程
一、流程图
二、按键软件延时消抖
1.延时程序编写
void delay(uint x)//ms延时函数 { uchar i; while(x--) for(i=0;0<i<123;i++)
下载程序及硬件调试
1.下载程序
2.连接电路
电路连接表
控制端口
连接位置
P1.0
VD26
P3.0
KEY1
3.硬件调试
7
成果展示及评价
•学生进行作品展示
8
任务小结
•学生小结:小组代表总结本组的学习心得,学会了什么, 还有什么没有理解等等。 •教师小结:教师对每组的成果进行点评,并对本节课的知识 点进行总结。
while(1) {
if(key==0) { delay(10); if(key==0) { 灯亮;} } } else {灯灭;} }
4 程序仿真调试
一、利用Proteuse软件绘制电路图
步骤: 打开Protues 软件 创建工程 创建文件 放置元件 连接电路 保存
二、装载Hex文件并仿真

经典按键程序

经典按键程序
{
switch(Key)
{
case _KEY_F2:
if(Times < 200) //长按 2s
{
return _REENTER; //2s内允许长按
}
BYTE KeyDownCallBack2(WORD Key, WORD Times);
//按键处理数据结构
static struct_KeyInfo g_KeyInfo1 = {0, 0, 0, 0, KeyDownCallBack};
static struct_KeyInfo g_KeyInfo2 = {0, 0, 0, 0, KeyDownCallBack2};
#include "Key.h"
//定时消抖的按键处理函数, 通常在定时中断中调用,
void DitherlessKey(struct_KeyInfo* pInfo)
{
switch(pInfo->KeyState)
{
case _HAS_NO_KEY:
WORD CurKey; //当前检测到的键, 用于处理长按的情况
BYTE (*KeyDownCallBack)(WORD, WORD); //键确认按下的回调函数指针
void (*KeyUpCallBack)(WORD); //键抬起的回调函数指针
WORD PreDownKey; //上次检测到的键
BYTE KeyState; //状态
WORD SameKeyCntr; //同一键检测到按下的次数
g_KeyInfo2.CurKey = temp & 0xFF00; //同一个消抖函数处理不同的按键

按键消抖

按键消抖

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

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

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

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

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为去抖后输出的稳定信号。

51单片机按键消抖程序原理

51单片机按键消抖程序原理

51单片机按键消抖程序原理一、引言按键消抖是嵌入式系统编程中常见的问题之一,尤其是在使用51单片机时。

51单片机是一款常用的微控制器,广泛应用于各种嵌入式系统中。

按键作为常见的输入设备,在51单片机应用中经常被使用。

由于按键的机械特性,当按键按下或释放时,会产生机械抖动,给系统带来误操作。

因此,了解并编写按键消抖程序对于保证系统的正常运行至关重要。

二、消抖原理按键消抖,简单来说,就是通过一定的算法,消除按键产生的机械抖动,从而准确识别按键的状态。

其原理主要基于以下两点:1.机械抖动的特点:按键的机械抖动主要表现为按键触点之间的快速开关,产生一系列微小的电信号。

这些信号通常包含真实的按键输入信号和噪声信号。

2.消抖算法:通过分析这些信号,识别出真实的按键输入信号,并忽略噪声信号,从而达到消除机械抖动的目的。

常用的消抖算法有阈值比较法、防抖延时法、防抖滤波法等。

三、消抖程序实现下面以51单片机为例,介绍一种简单的阈值比较法消抖程序实现:```cvoidkey_debounce(intkey_pin){//定义按键引脚intdebounce_time=50;//消抖时间,单位毫秒intthreshold=5;//阈值,可以根据实际情况调整intkey_state=0;//按键状态,初始化为0(未按下)intlast_key_state=0;//上一次的按键状态while(1){//读取按键状态key_state=digitalRead(key_pin);last_key_state=key_state;//判断按键是否按下if(key_state==LOW){//按键按下,开始消抖if(millis()-last_key_state>=debounce_time){//经过一定时间,确定按键状态if(key_state==digitalRead(key_pin)){//检测到真实的按键输入信号//这里可以进行相应的操作,例如点亮LED灯等}else{//检测到噪声信号或其他干扰,忽略}}else{//消抖时间不足,忽略当前状态}}else{//按键释放,忽略当前状态}}}```上述程序中,通过设置一个阈值和消抖时间,来判断按键状态是否发生变化。

一种软件去除键抖动的方法

一种软件去除键抖动的方法
在实际应用中,1个比特表示1个键。C51中的字符变量可以处理8个键,如果系统需要更多的键,可选用整型变量、长整型变量或数组。如果系统的按键数量过多,则会占用较多单片机宝贵的内部寄存器,这是该方法的不足之处。
三.应用程序实例
为了进一步理解上述方法如何在编程中得以实现,在此提供了1个用C51单片机编程语言编制的8个按键的键处理程序,以供参考。该程序在KEIL C51 V6.02/uVsion2 demo编译环境下编译通过。
关键词:单片机 键处理 控制系统 去抖动 键盘
概述
在单片机控制系统中,通过按键实现控制功能是很常见的。对按键处理的重要环节是去抖动,包括去除按下和抬起瞬间的抖动。去抖动的方法有很多种,如使用R-S触发器的硬件方法、运用不同算法的各种软件方法等。硬件方法会增加成本和体积,对于按键较多的矩阵式键盘,会用硬件方法;软件方法用的比较普遍,但有一种加固定延时的去抖动法效率最低,它以无谓地耗费机时来实现去抖动。
Kstore=Kready;
if (Koutput ! =0)/*如果有键按下,置标志准备获取键值*/
getkey=1;
}
}
void get_key_value(void)
{
if(getkey)
{
unsigned char temp;
unsigned char j;
getkey=0;/*清标志*/
for(j=0;j<8;j++)
TL0=0xe0;
TH0=0xb1;
TR0=1;
ET0=1;
EA=1;
/*……*/
while(1)/*循环*/
{
debounce();/*调用去除键抖动函数*/
get_key_value();/*调用获取键值函数*/

单片机按键去抖动程序设计思路

单片机按键去抖动程序设计思路

单片机按键去抖动程序设计思路1.硬件电路设计为了能够较好地去抖动按键,我们可以在按键的输入引脚上加一个RC组合电路,以延迟触发信号的上升沿和下降沿,从而消除抖动。

RC组合电路一般由一个电阻R和一个电容C组成,其原理是通过RC的时间常数来控制信号的上升和下降过程。

2.软件设计在单片机程序中,我们需要采取一定的算法来检测按键的真实触发信号,下面是一个简单的按键去抖动的程序设计思路:(1)初始化首先,我们需要对按键的输入引脚进行初始化,配置为输入模式,并设置为上拉电阻模式。

这样可以确保在按键未按下时,输入引脚保持高电平。

(2)读取按键状态通过读取按键的输入引脚状态,来判断当前按键是否处于按下状态。

一般来说,输入引脚为高电平时表示按键未按下,为低电平时表示按键已按下。

(3)去抖动算法当检测到按键状态发生变化时,即从未按下到按下或从按下到未按下,可以认为触发了一次按键操作。

在这个过程中,我们需要使用去抖动算法来过滤掉抖动信号。

常见的去抖动算法有两种:软件延时法和状态延时法。

软件延时法是通过在检测到按键状态发生变化后,延时一段时间,再次读取按键状态来判断是否真正触发了按键操作。

通过调整延时时间,可以达到去抖动的效果。

但是使用软件延时法会占用较多CPU时间,因此在需要很高响应速度的系统中不适用。

状态延时法是通过引入一个状态变量,用来保存按键的状态。

在检测到按键状态发生变化后,将状态置为相反的值,并延时一段时间。

在延时结束后,读取按键状态和状态变量的值,如果相等则认为触发了按键操作,否则不触发。

需要注意的是,为了防止按键的持续震动导致多次触发,我们一般会设置一个最小的按键触发间隔。

即在两次按键操作之间需要间隔一段时间,才能再次触发。

(4)执行按键操作当确认触发了按键操作后,我们可以执行相应的操作,如触发一个中断、改变LED灯的状态等。

通过上述程序设计思路,可以实现按键去抖动的功能,从而得到准确的按键触发信号。

当然,具体的实现还需要根据具体的单片机平台和开发环境来进行调整。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

按键去抖动
一、实验目的
1、学习基于VHDL 描述状态机的方法;
2、学习 VHDL 语言的规范化编程,学习按键去抖动的原理方法。

二、实验平台
微机一台(Windows XP 系统、安装QuartusⅡ等相关软件)、CPLD 学习板一块、5V 电源线一个、下载线一条。

三、设计要求
机械式轻触按键是常用的一种外围器件,由于机械原因导致的抖动会使得按键输入出现毛
刺。

设计一个按键去抖动电路,并用按键作为时钟,结合计数器观察去抖动前后的效果有什么不同。

四设计方案
思路提示:按键去抖动通常采用延时判断的方法,去除按键过程中出现的毛刺。

其实现过程是:当查询到按键按下时,延时一段时间再去判断按键是否仍然被按下,若是则此次按键有
效,否则看作是干扰。

这可以利用状态机来实现,
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity qudou is
port(
clk, en: in std_logic;
sp: out integer range 0 to 7);
end qudou ;
architecture behave of qudou is
type state is (S0,s1,s2);
signal z: std_logic;
signal q: integer range 0 to 2; signal a: integer range 0 to 7; signal s: state;
begin
p1:process(clk)
begin
if(clk'event and clk = '1') then
if en='1' then
if q=2 then
q<=q;
else q<=q+1;
end if;
else q<=0;
end if;
if q=2 then
z<='1';
else z<='0';
end if;
case s is
when s0=>
if (z = '0') then
s<=s0;a<=a;
else
s<=s1;a<=a+1;
end if;
when s1=>
if (z='0') then
s<=s0;a<=a;
else
s<=s2;a<=a;
end if;
when s2=>
if (z='0') then
s<=s0;a<=a;
else
s<=s2;a<=a;
end if;
end case;
sp<=a;
end if;
end process p1;
end behave;
五.实验结果:。

相关文档
最新文档