单片机按键消抖处理方法
按键消抖与时间按键
第5个问题实际上前面已经说了,有硬件消抖肯定对CPU占用最少,软件消抖当然就是尽量不要用些没用的语句,分配好时序
Unsignedchar keyscan()//这里是用的P2口作为按键的输入口
{
Static T=0;
Unsigned char key;//定义按键的键值变量
if(P2!=0xff)
{
key=P2;
while(P2!=0xff)
;
if(TR0=0)
TR0=1;
if(T>100)
TR0=0;
if(TR0=1&&T<100)
用写好的其他函数作为延时时间控制时序,执行一次扫描后执行其他函数占用100ms左右
这个历程因为有其他函数,只有在编程序的时候才来考虑了用些什么函数语句,这里就不列了哈
第一种方法是大多数情况都能用,这种方法是利用CPU效率比较高的一种(说不定谁做出更牛的,所以就不说最牛的了,当然希望大家能做出更高效率的程序了,哈哈),因为CPU没有执行空语句之类的一些没用的语句,但是必须控制后面所执行的程序是百ms级的所以不是每个程序都能用
按键开关消抖程序
按键开关消抖程序
实践中,单片机端口在连接开关器件时都要考虑消抖的问题,或在硬件上
增加延迟,或是增加软件延迟查询的功能模块。这里,我们考虑这样一个检测
电路:单片机连接一个开关和两个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
第六课按键的硬件消抖
51单片机进阶篇
---按键的硬件消抖
本文作者:Cepark
更新时间:2010/07/20
作者博客:
按键的硬件消抖
在上一节课中,我们介绍了使用软件延时的方法来进行消抖从而进行按键的检测,软件延时的优点是硬件电路简单,但是程序相对来讲会复杂,而且一般的延时函数是使用计数延时,这会增加CPU的负担。硬件消抖电路可以简化程序的编写,但是需要额外的器件支持。两种方法各有利弊,在不同的情况下根据不同的情况来选择使用哪一种消抖方法,这一节课我们主要介绍一下常见的硬件消抖电路。
1、RS触发器构成的消抖电路的主要原理
用R-S触发器形成消抖电路时单片机外围电路设计中的常用手段,它可以减少单片机软件对按键动作的延时和计算。要使用R-S触发器形成的消抖电路,首先用了解R-S触发器的基本工作原理图和工作特点。
R-S触发器的基本构成如图所示,它是由两个与非门交叉耦合而成,S和R是信号的输
Q既表示触发器的状态,又是触发器的输出端。
入端,低电平有效,Q和
在启动过程中,S端一旦下降到开门电平,Q端电平就会上升,反馈到门B的输入端,
Q端的电平下降,反馈到门A的输入端,进一步促使门A截止,促使B由截止转向导通,
Q的电平进一步下降,这样的过程,是Q端电平进一步上升,Q端电平上升的结果又会使
的门A很快截止、门B很快导通,触发器在极短的时间内完成由截止到导通的转换。通过R 段的复位时也有类似的正反馈过程发生,从而完成按键开关的消抖功能。
典型的硬件消抖方法是在单片机和检测管脚之间加入由74LS02或者其他的门电路组成的R-S触发器消抖电路。如下所示。
单片机的消抖
单片机的消抖
机械抖动:按键按下时,电平的变化并不是马上到位,而是会有一个不稳定的状态过程,再进入电平稳定状态。软件消抖:如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,产生5ms~10ms 的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms 的延时,待后沿抖动消失后才能转入该键的处理程序可以在去抖程序里加入检测松手程序例如if(!key) //检测键盘是否按下delay()://去抖延时一般是50ms if(!key)//再次检测键盘是否按下乘以乘以乘以++: //这里写数码管加”1”程序while(key);//加入写句,目的是等待key 变为原来的状态才会执行下一条指令!1、按键在按下的时候、由于机械连接的不稳定,导致刚刚被按键连通的电路中出现电平抖动。2、在某些情况下,例如系统受到外部震动,也会在按键电路中出现电平抖动,但这种抖动不是控制者所希望的操作,如果没有防抖动程序,那么系统会因这种不希望出现的干扰而错误动作。3、为了避免系统误判,可以编写防抖动程序。程序流程的文字说明如下(假设按键按下后,低电平送到单片机):(1)是否有低电平输入(按键电路按键被按下了吗)?如果是,到(2)步执行;不是,继续执行(1)(2)延时等待(可以使用定时器或非定时器都可以),然后执行(3)步(3)是否有低电平输入?是的话,执行后面的其他程序;不是,则跳转到(1)步执行4、说明:干扰抖动的持续时间很短,为了防止(1)中的低电平是系统内的干扰抖动,则延时等待一会,然后判断是否真的按键按下。并联电容消抖:用10K 的上拉电阻与按键串联,然后按键并联一个去抖电容,以用来消除按键的机械抖动电容的计算方法如下:电容的容值是根据机械按键的触点抖动频率而定,一般机械按键的抖动频率为100Hz 左右,当按键闭合抖动时
vivado按键消抖原理
vivado按键消抖原理
按键消抖是指在数字电路中,当按键按下或释放时,由于按键机械开关的特性,会导致电路出现不稳定的信号状态。这种不稳定状态可能会导致错误的触发,例如出现多次触发或漏触发。因此,为了确保按键信号的稳定性和可靠性,需要进行按键消抖处理。
按键消抖的原因主要有两个方面。首先,按键机械开关的接触面存在微小的弹跳现象,当按键按下或释放时,接触面会在短时间内反复接触和分离,导致电路信号出现多次变化。其次,由于电路中存在的噪声干扰,也会使得按键信号产生抖动。
为了解决按键消抖问题,可以采用硬件和软件两种方法。硬件方法主要通过添加滤波电路或使用稳定的按键开关来消除按键弹跳现象。滤波电路可以通过RC电路或者使用专用的按键消抖芯片来实现。而软件方法主要通过在数字电路中添加按键消抖算法来处理按键信号。
在Vivado中,按键消抖可以通过使用状态机来实现。状态机是一种用于描述系统行为的模型,可以根据输入信号的状态变化来改变系统的状态和输出。在按键消抖中,可以使用状态机来检测按键信号的变化,并根据一定的状态转换规则来消除按键弹跳现象。
具体实现时,可以将按键信号作为输入,将按键状态和输出作为状
态机的状态和输出。当按键信号发生变化时,状态机会根据一定的状态转换规则进行状态转换,并输出消抖后的按键信号。常用的状态转换规则包括按键按下时状态转换为按下状态,按键释放时状态转换为释放状态,以及连续按键时状态不变。
在Vivado中,可以使用Verilog或VHDL等硬件描述语言来编写状态机代码。首先,需要定义状态机的输入、输出和状态变量,并初始化各个变量的初始值。然后,需要编写状态转换规则和输出逻辑,根据输入信号的状态变化来改变状态和输出。最后,需要将状态机代码综合生成对应的逻辑电路,并进行仿真和验证。
单片机按键消抖方式详解
通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹 性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开, 而是在闭合和断开的瞬间伴随了一连串的抖动,如图 8-10 所示。
图 8-10 按键抖动状态图 按键稳定闭合时间长短是由操作人员决定的,通常都会在 100ms 以上,刻意快速按 的话能达到 40-50ms 左右,很难再低了。抖动时间是由按键的机械特性决定的,一般都 会在 10ms 以内,为了确保程序对按键的一次闭合或者一次断开只响应一次,必须进行按 键的消抖处理。当检测到按键状态变化时,不是立即去响应动作,而是先等待闭合或断开稳 定后再进行处理。按键消抖可分为硬件消抖和软件消抖。
利用这种方法,就可以避免通过延时消抖占用单片机执行时间,而是转化成了一种按键
状态判定而非按键过程判定,我们只对当前按键的连续 16ms 的 8 次状态进行判断,而
不再关心它在这 16ms 内都做了什么事情,那么下面就按照这种思路用程序实现出来,同
样只以 K4 为例。 #include <reg52.h>
}
} /* 软件延时函数,延时约 10ms */ void delay(){
unsigned int i = 1000; while (i--); } 这个程序用了一个简单的算法实现了按键的消抖。作为这种很简单的演示程序,我们可 以这样来写,但是实际做项目开发的时候,程序量往往很大,各种状态值也很多, while(1) 这个主循环要不停的扫描各种状态值是否有发生变化,及时的进行任务调度,如果程序中间 加了这种 delay 延时操作后,很可能某一事件发生了,但是我们程序还在进行 delay 延 时操作中,当这个事件发生完了,程序还在 delay 操作中,当我们 delay 完事再去检查 的时候,已经晚了,已经检测不到那个事件了。 为了避免这种情况的发生,我们要尽量缩短 while(1)循环一次所用的时间,而需要进 行长时间延时的操作,必须想其它的办法来处理。
单片机按键消抖的方法,硬件软件都可以实现
单片机按键消抖的方法,硬件软件都可以实现
不管设计一个什么作品,按键总是少不了的,对于按键你知道那些呢?
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
图1
抖动时间
抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。这是一个很重要的时间参数,在很多场合都要用到。
按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒,大家可以用示波器测试一下。键抖动会引起一次按键被误读多次。为确保CPU对键的一次闭合仅作一次处理,必须去除键抖动。在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。
下面是两种消抖方法:
一、硬件消抖:
按键防抖电路控制电路
所示利用RC 积分电路来达成杂波的滤除与波形修整的电路(如图1 )。
在S1 ON 的瞬间由于接触弹跳的关系,会使A 点电压呈现高速的断续现象,再S1 OFF 时亦然,详(如图2所示),然而由于电容两端电压需由电压经电阻慢慢充电才会上升,使得B 点电位缓步上升情形:S1 OFF 时亦然,电容电压经R 放电,使B 点电压缓缓下降。此一变化,经史密特反相修整后,可得一标准负脉波输出,如波形图C 点所示。
用其他的各类触发器,锁存器亦可达到消抖效果。
二、软件消抖:
单片机按键处理方式(一)——典型的按键处理方式
单⽚机按键处理⽅式(⼀)——典型的按键处理⽅式
前⾔
按键处理是学习单⽚机的必修课之⼀。⼀次按键的过程,并⾮是⼀个理想的有⼀定宽度的电平脉冲,⽽是在按下、弹起过程中存在抖动,只有在中间阶段电平信号是稳定的。⼀次典型的按键过程是酱紫的:
在抖动过程中,电平信号⾼低反复变化,如果你的按键检测是检测下降沿或上升沿或者是⽤外部中断检测按键,都可能在抖动时重复检测到多次按键。这就是在未消抖的按⼀次键显⽰值加1的程序中,出现按⼀次键显⽰值+2、+3甚⾄加更多的原因。
对于按键消抖,常⽤的有硬件消抖和软件消抖。本⽂是我个⼈对按键处理的⼀些常见⽅法的总结,由于我本⼈不太懂硬件,所以这⾥只讨论独⽴按键的软件消抖实现。⽔平有限,如有错误请不吝指正。
硬件环境
本⽂代码均在单⽚机STC90C516RD+、晶振12.0MHz硬件环境下试验通过。
带消抖的简单的按键处理
最简单的消抖处理就是在⾸次检测到电平变化后加⼀个延时,等待抖动停⽌后再次检测电平信号。这也是⼤多数单⽚机教程讲述的消抖⽅式。但在实际应⽤中基本不⽤这种⽅式,原因后⾯讲,先看代码:
//⽅法⼀:带消抖的简单的按键处理
#include <reg52.h>
#define GPIO_KEY P1 //8个独⽴按键IO⼝
#define GPIO_LED P0 //8个LED灯,⽤于显⽰键值
unsigned char ScanKey();
void DelayXms(unsigned char x);
void main()
{
unsigned char key;
详解MCU独立按键消抖原因、方法
详解MCU独立按键消抖
简单的说,进入了电子,不管是学纯模拟,还是学单片机,DSP、ARM等处理器,或者是我们的FPGA,一般没有不用到按键的地方。按键:人机交互控制,主要用于对系统的控制,信号的释放等。因此在这里,FPGA 上应用的按键消抖动,也不得不讲!
一、为什么要消抖动
在按键被按下的短暂一瞬间,由于硬件上的抖动,往往会产生几毫秒的抖动,在这时候若采集信号,势必导致误操作,甚至系统崩溃;同样,在释放按键的那一刻,硬件上会相应的产生抖动,会产生同样的后果。因此,在模拟或者数字电路中,我们要避免在最不稳定的时候采集信号,进行操作。
对此一般产用消抖动的原理。一般可分为以下几种:
(1)延时
(2)N次低电平计数
(3)低通滤波
在数字电路中,一般产用(1)(2)种方法。后文中将详细介绍。
二、各种消抖动
1. 模拟电路按键消抖动
对于模拟电路中,一般消抖动用的是电容消抖动或者施密特触发等电路,再次不做具体介绍。
2. 单片机中按键消抖动
对于单片机中的按键消抖动,本节Bingo根据自己当年写过的单片机其中的一个代码来讲解,代码如下所示:
unsigned char key_sCAN(void)
{
if(key == 0) //检测到被按下
{
delay(5); //延时5ms,消抖
if(key != 0)
retrurn 0; //是抖动,返回退出
while(!key1); // 确认被按下,等下释放
delay(5); //延时5ms,消抖
while(!key1); //确认被释放
return 1; //返回按下信号
单片机按键去抖原理
单片机按键去抖原理
在单片机系统中,按键的应用非常广泛,无论是控制还是交互,经常需要使用按键来进行操作。然而,由于按键的特性,往往会带来按键抖动的现象,这就需要对按键进行去抖处理。本文将详细介绍单片机按键去抖的原理和方法。
1.按键抖动的原因及影响因素
按键抖动是指按下或释放按键时,按键触点会产生不稳定的接触,导致按键信号在短时间内多次切换,造成系统误判。按键抖动的原因主要有以下几点:
(1)按键机械结构问题:按键存在接触不良、触点弹簧不稳定等机械问题,会导致接触突变。
(2)外部干扰:如按键线路附近的磁场、电源干扰等,会引发按键误触。
(3)按键的弹性和灵敏度:按键材料和设计的不同,会导致按键的弹性和灵敏度不一致,进而引发抖动。
按键抖动会带来以下几个问题:
(1)误判:按键抖动会使系统误判按键的按下或释放,导致错误的逻辑操作。
(2)数据错误:抖动会造成按键信号的短时间内多次切换,可能导致数据传输错误、丢失等问题。
(3)系统性能下降:由于抖动会产生大量的开关信号,会占用系统资源,影响系统的运行速度和响应时间。
2.去抖的原理
去抖的原理是通过软件或硬件的方式对按键信号进行滤波,消除了按
键抖动信号,从而得到稳定的按键信号。
软件去抖的原理是通过软件算法对按键信号进行处理,主要有两种方法:软件延时去抖和状态机去抖。
(1)软件延时去抖:
软件延时去抖的原理是在按键按下后,通过添加延时来屏蔽抖动信号。当检测到按键按下后,先延时一段时间,并再次检测按键的状态,如果按
键仍然处于按下状态,则确认按键按下有效。
软件延时去抖的优点是简单易行,只需通过软件延时来实现,无需额
单片机按键消抖方式详解
keybuf = (keybuf<<1) | KEY4; //连续 8 次扫描值都为 0,即 16ms 内都只检测到按下状态时,可认为按键已按下 if (keybuf == 0x00){
KeySta = 0; //连续 8 次扫描值都为 1,即 16ms 内都只检测到弹起状态时,可认为按键已弹起 }else if (keybuf == 0xFF){
单片机按键消抖方式详解
通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹 性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开, 而是在闭合和断开的瞬间伴随了一连串的抖动,如图 8-10 所示。
图 8-10 按键抖动状态图 按键稳定闭合时间长短是由操作人员决定的,通常都会在 100ms 以上,刻意快速按 的话能达到 40-50ms 左右,很难再低了。抖动时间是由按键的机械特性决定的,一般都 会在 10ms 以内,为了确保程序对按键的一次闭合或者一次断开只响应一次,必须进行按 键的消抖处理。当检测到按键状态变化时,不是立即去响应动作,而是先等待闭合或断开稳 定后再进行处理。按键消抖可分为硬件消抖和软件消抖。
那么消抖操作所需要的延时该怎么处理呢?
举个例子:我们启用一个定时中断,每 2ms 进一次中断,扫描一次按键状态并且存储 起来,连续扫描 8 次后,看看这连续 8 次的按键状态是否是一致的。8 次按键的时间大 概是 16ms,这 16ms 内如果按键状态一直保持一致,那就可以确定现在按键处于稳定的 阶段,而非处于抖动的阶段,如图 8-12。
单片机的消抖
原文地址:单片机的消抖作者:小哈
机械抖动:按键按下时,电平的变化并不是马上到位,而是会有一个不稳定的状态过程,再进入电平稳定状态。
软件消抖:如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms 的延时,待后沿抖动消失后才能转入该键的处理程序
可以在去抖程序里加入检测松手程序例如…… …… if(!key) //检测键盘是否按下 delay()://去抖延时一般是50ms if(!key)//再次检测键盘是否按下
×××++: //这里写数码管加"1"程序 while(key);//加入写句,目的是等待key 变为原来的状态才会执行下一条指令!
1、按键在按下的时候、由于机械连接的不稳定,导致刚刚被按键连通的电路中出现电平抖动。
2、在某些情况下,例如系统受到外部震动,也会在按键电路中出现电平抖动,但这种抖动不是控制者所希望的操作,如果没有防抖动程序,那么系统会因这种不希望出现的干扰而错误动作。
3、为了避免系统误判,可以编写防抖动程序。程序流程的文字说明如下(假设按键按下后,低电平送到单片机):(1)是否有低电平输入(按键电路按键被按下了吗)?如果是,到(2)步执行;不是,继续执行(1)(2)延时等待(可以使用定时器或非定时器都可以),然后执行(3)步(3)是否有低电平输入?是的话,执行后面的其他程序;不是,则跳转到(1)步执行
单片机按键处理技巧及编程方式
单片机按键处理技巧及编程方式
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口电平的变化与否,即可以知道按键是否被按下,从而做出相应的响应。一切看起来很美好,是这样的吗?
按键的硬件消抖电路原理
为什么要进行按键消抖
按键消抖通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
按键的抖动对于人类来说是感觉不到的,但对单片机来说,则是完全可以感应到的,而且还是一个很"漫长"的过程,因为单片机处理的速度在"微秒"级,而按键抖动的时间至少在“毫秒"级。
一次按键动作的电平波形如下图。存在抖动现象,其前后沿抖动时间一般在5ms-10ms之间。由于单片机运行速度非常快,经过A时刻的时候会检测到低电平判断按键被按下。当到了B时刻的时候,单片机同样会检测到高电平,误以为松开按键,然后又到了C时刻检测到低电平,判断到按键被按下。周而复始,在5-1Oms内可能会出现很多次按下的动作,每一次按键的动作判断的次数都不相同。
按键闭合或者释放稳定时再读取按键的状态。
硬件消抖电路
硬件消抖一般有两种实现方式:
ORS触发器
O电谷滤波
RS触发器
利用RS触发器来吸收按键的抖动。一旦有键按下,触发器立即翻转,触电的抖动便不会再对输出产生影响,按键释放时也一样。RS触发电路消抖电路图如下。
电容滤波
将电容并联在按键的两端,利用电容的放电的延时特性。将产生抖动的电平通过电容吸收掉。从而达到消抖的作用,电容消抖电路图如下图所示。
3V3
Keyl
6Sl
sw-PBzzLcι
'O.IuF
GND
总结
实际上,在没有MCU的情况下,对按键进行消抖通常是通过硬件消抖电路来实现。而在嵌入式开发中,大多数情况下都是通过程序来实现按键消抖。简单说就是加合适的延迟,显然这实现成本要比硬件电路方式低得多。
单片机消除按键抖动的方法
单片机消除按键抖动的方法
单片机中,当按键被按下时,可能会出现按键抖动的现象,即按下按键后,按键会不断地重复触发,导致程序的不稳定性等问题。为了消除按键抖动,可以采取以下方法:
1. 软件消抖法:在程序中通过延时、多次采样等方法,对按键
进行去抖处理。但这种方法需要占用一定的CPU资源,容易影响程序的稳定性和响应速度。
2. 硬件消抖法:通过外部电路对按键进行去抖处理,如添加 RC 滤波器、加电容等组合电路,可稳定按键的电平信号,避免按键的震动和干扰。
3. 系统延时法:在按键按下后,延时一段时间再读取按键的状态,可消除按键的抖动。但这种方法需要根据实际情况设置合适的延时时间,否则会影响系统的响应速度。
4. 确认法:在按键按下后,通过程序对按键的状态进行多次确认,只有当确认多次读取的状态一致时,才认为按键的状态是有效的。这种方法需要设置合适的确认次数和时间,才能达到较好的去抖效果。
总之,消除按键抖动是单片机程序开发中的一个重要问题,需要根据实际情况选择合适的去抖方案,保证程序的稳定性和可靠性。
- 1 -
单片机的高级按键消抖核心算法
新型高级按键消抖算法
还在用延时消抖的方式检测按键是否被按下??这一招太out啦!!
大家都知道,机械按键在被按下的瞬间,是会发生机械抖动的,这个执行过程对于高灵敏度的单片机来讲,识别的可能是杂波或者一大堆上下突变的高低电平的组合。很可能造成指令误接收,从而导致误动作输出。
在网上查阅大量资料,基本无外乎传统的延时消抖,也就是教科书上说的,延时个几十毫秒,然后再判断一下是否真的被按下。这种做法在程序中大量使用时钟的情形(比如多层定时器中断)下,会表现出按键响应非常笨拙的情况,甚至有时候触发一些小概率事件,还是无法完全避免误动作的情况。
今天介绍一种全新的分层思想,在单片机当中也是相当有用的,也是本文的重中之重的技术要点。这些在学校是学不到的,也是工程从业人员与大学生代码风格的区别。
以C语言来论述,因为纯粹的C语言描述比较容易被接受,也容易懂。
记住下面3个语句:
u8 TRG;
u8 CONT;
void P0_KEY_CORE_READ(void)
{
u8 READ_CORE = P0^0xff;
TRG = READ_CORE & (READ_CORE ^ CONT);
CONT = READ_CORE;
}
上面就是核心的算法了,下面解释一下:
TRG(trigger)代表的是触发,CONT(continue)代表的是连续按下。
P0_KEY_CORE_READ()函数的涵义是:先取反,然后送到READ_CORE临时变量里面保存起来。然后,提取设置TRG作为触发标志位变量,通过位的与操作和异或操作得出。之后TRG作为全局变量,其它程序可以直接引用。最后一句类同第二句,用来计算连续按下标志位变量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机按键消抖处理方法(非软件延时)
以STC89C51单片机为例,STC89C51的P1.0、P1.1、P1.2分别接了3个按键。下面代码为按键扫描处理部分函数,此部分代码通俗易懂,方便移植。
简单解释一下代码的含义:
定义一个含有3个元素的整形数组(静态变量),分别储存3个按键连续16次的状态。
Main函数不断的循环执行本函数刷新KeyDelay数组的状态,以KeyDelay[0]对应的P1.0为例,当按键没有按下的时候,KeyDelay[0]为0,即KeyDelay[0]变量的所有位均为0,
当该按键按下的时候,连续16次扫描便会使KeyDelay[0]变为0xffff(所有位都是1),
而当按下或者释放产生抖动时,那么连续16次扫描后不可能所有位都为0或都为1。
所以便可以用这种方法来进行软件消抖。
文档由胡保进编写。