按键开关消抖程序

合集下载

io按键消抖算法

io按键消抖算法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

按键消抖

按键消抖

一、按键消抖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 按键消抖电路的设计按键消抖一般采用硬件和软件消抖两种方法。

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

vhdl按键消抖程序

vhdl按键消抖程序

1.vhdl按键消抖程序一:延时性消抖在本例子中,input是按键的输入,output是消抖之后的按键输出是clk经历8个上升沿之后就让output输出一个CLK周期的高电平library ieee;use ieee.std_logic_1164.all;entity PWlock isport(clk:in std_logic;input:in std_logic;output:out std_logic);end PWlock;architecture one of PWlock issignal a:std_logic;signal count:integer range 0 to 9;beginprocess(clk)beginif input=‘0’ thencount<=0;elsif (clk‘event and clk=’1‘)thenif count=9 thencount<=count;elsecount<=count+1;end if;end if; -if count=8 thena<=’0‘;elsea<=’1‘;end if;end process;output<=a;end one;2.vhdl按键消抖程序二一般按键延时在20ms左右,根据时钟频率决定你的计数范围。

程序非常简单,但经常用到,对于FPGA初学者要好好学习这部分。

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity reseter isport(clk,reset_in:in std_logic; --按键按下时为0reset_out:out std_logic:=‘0’);end reseter;architecture behav of reseter isbeginPROCESS(clk,reset_in)VARIABLE COUNT1 :INTEGER RANGE 0 TO 100000;BEGINIF reset_in=‘0’ THENIF RISING_EDGE(clk)THENIF COUNT1<10000 THEN COUNT1:=COUNT1+1;ELSE COUNT1:=COUNT1; END IF;IF COUNT1<=9999 THEN reset_out<=‘1’;ELSE reset_out<=‘0’; END IF;END IF;ELSE COUNT1:=0;reset_out<=‘1’;END IF;END PROCESS ;end behav;3.vhdl按键消抖程序三:计数器型消抖电路(一)计数器型消抖电路是设置一个模值为(N+1)的控制计数器,clk在上升沿时,如果按键开关key_in=‘1’,计数器加1,key_in=‘0’时,计数器清零。

完全释放CPU按键消抖程序

完全释放CPU按键消抖程序

//本程序仅个人想法,供参考与共同探讨,考虑到按键的实时性,此程序用到一个外部中断0,其实也可不用外部中断的,但思路是一样的
//功能:不需要按键延时等待消抖程序,检测到按键按下,屏蔽抖动,马上执行按键功能程序,不会误动作,即按键按一次,不管时间多长,都动作一次
#include <reg51.h> //包含单片机寄存器的头文件
sbit S=P3^2; //将S位定义为P3.2,外部中断0管脚
void main(void)
{
unsigned int ajsn;
EA=1; //开总中断
IT0=1; //选择负跳变来触发外中断0
EX0=1; //允许使用外中断0
while(1)
{
……
主程序
……
if(S==0) //按键按下中断程序优先执行后再执行以下语句
{
ajsn++; //加一后立马执行主程序,不需要傻瓜式等待,释放CPU,提高CPU执行有效指令的效率
if(ajsn==8000) //此值可以根据主函数的执行时间与按键的机械抖动时间,人为按键频率,来确定一个完美值,当然给一个合理的就ok
{ //此处不要考虑理论太深,实际按键动作都能满足
ajsn=0;
S=1; //将接按键的管脚P3.2拉高,使按键功能恢复
}
}
}
}
/**********函数功能:外中断T0下降沿触发中断服务程序*********/
void int0(void) interrupt 0 //外中断0的中断编号为0
{
S=0; //消抖——暂时将接按键的管脚P3.2拉低,从而使单片机检测不到抖动的高电平,无法再次触发中断
……
按键功能程序
……
}。

按键开关的抖动与消除方法

按键开关的抖动与消除方法
I C 1 采用双列直插式 8 脚集成块
由于充电后期,蓄电池内部的电压 之,就作为分频器使用。8脚为集成块输
UC3842 或KA3842AP;IC4可采用双列直
图 3 然而短路仅维持几十毫微秒,门的输出
从高电平跳到低电平。此后,如开关触点
该电路是利用 R-S 触发的保持功能完成 抖动离开Vss 时,输出因输入是低电平而
文采用的是低电平有效。
按键开关的动作情况
现以三种开关为例,一种是上海生
图 2
产的 6P 型双刀双位无锁开关,一种是
作原理为:由于充电电流与该电流在R21 经VD10、R22使VT2快速导通,发光二极 很小占空比状态,同时,黄色发光二极管
CD4541BD;IC3几乎所有8脚运算放大集
压控制。 初始状态为高电平;反之,当9脚加低电
成块都可代替;RW2为带开关的电位器。
上电压降成正比,当充电电流因故增大 管亮度增强,通过 IC2 的3、4脚电流也会 LED3 点亮,表示定时控制电路进入延时
到最大允许值时,R21上电压经R20使加 增大。同样,经R6加在 IC1 的2脚负反馈 工作状态。此状态下电路对蓄电池不对
在 IC3 的5脚上的电压也相应增大,并高 输入端的电压也增大,IC1 的6 脚输出脉 充。经过定时时间 T 小时后,8 脚输出由
反馈,开关每闭合一次,电容C1 上的电 软件去抖
去抖作用的。设K键按下前处于R端,按 仍保持在原有的低电平上。此电路的优
下K 键时,尽管触点在S端来回跳动,只 图 7 点是可以省掉外接电阻,电路简单。
要该触点不回到 R-S 触发器的另一个输
抖动,轻者会造成电路的 “连击”响应, 由图可知,机械开关抖动存在三种情 生抖动。单触点按键开关通常为前沿存

c语言按键消抖常用方法

c语言按键消抖常用方法

在C语言中,按键消抖是指处理物理按键在按下或释放时可能产生的抖动或不稳定信号的问题。

常用的方法包括软件延时消抖和状态机消抖。

1. 软件延时消抖:- 当检测到按键按下或释放时,可以通过在代码中添加一个短暂的延时来过滤掉按键可能产生的抖动信号。

例如,在按键检测到变化后,延时几毫秒以确保按键信号稳定后再进行状态读取。

```cvoid delay(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 300; j++);}// 在按键检测中使用延时if (button_pressed && !last_button_state) {delay(10); // 等待10毫秒if (button_pressed) {// 执行按键按下后的操作last_button_state = button_pressed;}}```这种方法简单易行,但需要根据具体硬件和按键特性调整延时时间,且可能会造成按键响应速度变慢。

2. 状态机消抖:- 利用状态机来跟踪按键状态变化,并在一定持续时间内保持一致的状态才认定为有效按键按下或释放。

这可以通过一个状态变量和定时器结合实现。

```cenum ButtonState {IDLE, PRESSED, RELEASED};enum ButtonState current_state = IDLE;unsigned int debounce_timer = 0;// 在按键检测中使用状态机void button_check() {switch (current_state) {case IDLE:if (button_pressed) {current_state = PRESSED;debounce_timer = 10; // 设定10毫秒的延时}break;case PRESSED:if (!button_pressed) {current_state = RELEASED;debounce_timer = 10; // 设定10毫秒的延时}break;case RELEASED:if (button_pressed) {current_state = PRESSED;debounce_timer = 10; // 设定10毫秒的延时}break;}if (debounce_timer > 0) {debounce_timer--;} else {if (current_state == PRESSED) {// 执行按键按下后的操作} else if (current_state == RELEASED) {// 执行按键释放后的操作}current_state = IDLE; // 处理完毕后返回IDLE状态 }}```这种方法相对于延时消抖更加灵活,可以根据具体需求设置不同的延时时间,并且不会影响整体的按键响应速度。

单片机按键去抖

单片机按键去抖

单片机按键去抖
我们首先要清楚为什么要按键去抖。

先看先按键按下的波形图
通过这个图形就很清楚为什么要按键去抖了,要是不去抖的话,当按下按键的时候就会在0~5ms 内出现抖动,相当于在不停地按下按键而就不是只按了一次了。

稳定闭合时间大约是10ms,松手抖动的时间和按下抖动的时间差不多。

去抖的方法有硬件去抖和软件去抖
我们常用牺牲CPU 的时间来软件去抖,就是按下按键后延时5~10ms 时间后再来检查是否有按键按下,松手检测也一样。

硬件去抖的方法如图所示
独立按键的去抖方法很简单,就是在按下和松手后分别加一小段延时再来判断。

例:
sbit key=P1;
........................
.......................
if(!key) //如果有按键按下
{
delay(10); //延时一小段时间
if(!key) //真有按键按下
{。

// 执行按键按下后的操作
}
while(!key); // 松手检测,要是没有松手的话就一直执行while 循环。

按键消抖动电路的原理

按键消抖动电路的原理

按键消抖动电路的原理
按键消抖电路的原理是通过添加一个延时电路来消除按键开关接通和断开时产生的抖动信号。

当按键按下时,开关接通,导致电流流过该开关。

但由于机械结构和接触电阻等原因,按键可能会在被按下或断开的瞬间反复接通和断开,产生多个开关状态变化的短暂信号。

这样的信号可能会对数字电路产生误操作或干扰。

为了解决这个问题,可以通过添加一个简单的延时电路来实现按键消抖。

延时电路可以使用稳压二极管和电容器等元件来构建。

当按键被按下时,电容器开始充电,此时可以认为开关已经稳定接通。

当按键被断开时,电容器开始放电,此时可以认为开关已经稳定断开。

通过延时电路,可以过滤掉按键状态变化的短暂信号,只保留稳定的按键状态信号。

简单的按键消抖电路可以是一个RC电路,其中R代表电阻,C代表电容。

如果按键被按下,电容器开始充电,充电时间取决于RC时间常数(τ)。

常见的RC 时间常数可以设置在10ms到50ms之间。

当充电时间超过设定的时间后,电容器被认为已经充电完成,此时可以确定开关已经接通,可以将稳定的开关状态传递到数字电路中。

同样,当按键被释放,电容器开始放电,放电时间也取决于RC时间常数。

当放电时间超过设定的时间后,电容器被认为已经放电完成,此时可以确定开关已经断开,可以将稳定的开关状态传递到数字电路中。

通过添加延时电路,按键消抖电路可以有效地稳定按键的开关状态,减少误操作和干扰对数字电路的影响。

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

按键开关消抖程序
实践中,单片机端口在连接开关器件时都要考虑消抖的问题,或在硬件上
增加延迟,或是增加软件延迟查询的功能模块。

这里,我们考虑这样一个检测
电路:单片机连接一个开关和两个LED。

程序是这样的,如果开关的消抖正确,
就点亮LED1,否则就闪亮LED2。

按下开关,点亮LED1,释放开关,LED1
即熄灭。

我们加入20 毫秒的消抖延迟时间。

当检测到开关为低电平时,单片
机在延迟20 毫秒后再次检测开关的状态。

如果此时开关状态为高,则LED2
就闪亮,如为低则点亮LED1。

源代码:
led1bitP2.0led2bitP2.1switch1bitP1.0ORG 0000hsetb switch1//initialize switch 1 as inputsetb led1//Turn OFF LED1setb led2//Turn OFF LED2
wait:jb switch1,wait// Wait till switch1 has been pressedcall debounce_delayjb switch1,c1_wait//switch low even after debouncing period//switch has been succesfully debouncedclr led1//Turn ON LED1jnb switch1,$//wait till switch has been releasedsetb led1//Turn OFF LED1ajmp wait
c1_wait://Switch PIN high after debounce period so error in debouncingcpl led2ajmp wait
debounce_delay://Subroutine for generating 20ms delaymov r7,#245l1_debounce_delay:mov r6,#40djnz r6,$djnz r7,l1_debounce_delayret
END
tips:感谢大家的阅读,本文由我司收集整编。

仅供参阅!。

相关文档
最新文档