历史上的今天
返回首页

历史上的今天

今天是:2025年01月29日(星期三)

2021年01月29日 | 一种软件去除键抖动的方法

2021-01-29 来源:eefocus

简介:单片机控制系统中大多使用控制键来实现控制功能。消除按键瞬间的抖动是设计者必须要考虑的问题。本文介绍一种很实用的软件去抖动方法,它借助于单片机内的定时中断资源,只要运算一下逻辑表达就完成了去抖动。这个方法效率高,不耗机时且易实现。文中使用的逻辑表达式由简单卡诺图和真值表推出,使该方法的机理容易理解。文中还提供用C51单片机编程语言编写的实用例程。


概述

在单片机控制系统中,通过按键实现控制功能是很常见的。对按键处理的重要环节是去抖动,包括去除按下和抬起瞬间的抖动。去抖动的方法有很多种,如使用R-S触发器的硬件方法、运用不同算法的各种软件方法等。硬件方法会增加成本和体积,对于按键较多的矩阵式键盘,会用硬件方法;软件方法用的比较普遍,但有一种加固定延时的去抖动法效率最低,它以无谓地耗费机时来实现去抖动。


此处介绍的是一种软件方法。简单说来是一种运算法,配合定时中断读取按键,通过运算逻辑表达式:


Keradyn=Ktemp Kinput+Kreadyn-1 (Ktemp ⊙Kinput) (1)


Ktemp=Kinput (2)


可以获得消除抖动的按键消息。这种方法效率高,


不需耗时的循环等待,而且算法简单、使用方便。

一、基本原理


由于按键的按下与抬起都会有10~20ms的抖动毛刺存在,因此,为了获取稳定的按键信息,须要避开这段抖动期。


设置3个变量Kready、Ktemp和Kinput,并设置定时中断周期为20ms。在定时中断服务程序中读取按键,并把读取的数据存于变量Kinput中。变量Kready中是所需要的稳定的按键信息;Ktemp是中间变量,它的值是上一次的Kinput。


根据当前按键的状态,考虑到Kready中是20ms抖动后的有效键信息,则Kready、Ktemp和Kinput之间,在不同时刻的状态关系如表1所列

时刻1为没有键按下的初始状态;时刻2的Kinput为1,但时刻3的Kinput又变为0,说明时刻2的Kinput为1并不是有键按下,可能只是干扰,所以Kreqdy为0;时刻4同时刻2的情况类似,但是时刻4和时刻5时Kinput都为1,说明有按键按下,在时刻5时Kready为1;虽然时刻7时Kinput为0,但时刻5、6、8时Kinput都为1,说明按键一直按下,只不过有干扰,Kready保持为1;时刻9、10连续两个时刻Kinput为0,表示按键抬起,时刻10时Kready为0。


通过分析可以看出,Kready中是消除了抖动并在一定程度上排除了干扰的有效按键信息。从按键按下到Kready为1,最长时间约为40ms,


最短约为20ms。其时间长短取决于键按下时处于定时中断周期的所在时刻。如果按键一直按下,则有效键信息以20ms的间隔重复输出。


仔细分析表1,还可知道当前时刻Kready的值不但与Ktemp和Kinput有关,还与Kready前一时刻的值有关。我们把Keady的当前时刻记作Kreadyn,作为因变量;前一时刻记作Kreadyn-1,并和Ktemp、Kinput一起作为自变量,依照表1绘出卡诺图如图1所示。


表达式(1)就是由图1的卡诺图得出的最简逻辑表达式。


二、实际应用扩展


表达式(1)中的Kready提供的是间隔20ms的重复键信息;有的地址不需要重复键值,按一次键获得一次键值就够了;而有的应用系统则两种键值都要有,比如电视监控系统的控制键盘中对镜头云台的控制需要重复键值,其他命令键则不需要。为了满足这种要求,就要对表达式(1)进行扩展。为此,引入了另外两个变量和1个常量。它们分别是Koutput、Kstore和Kconst。Koutput作为最终的键信息输出;Kstore作为中间变量用作保存上一次去抖动后的键信息;Kconst是常量,它的值需要先给定;0对应非重复键,1则对应重复键。


表露Koutput、Kconst、Kstore和Kready之间关系的真值表如表2所列。

由图2获得了如下最简逻辑表达式,作为表达式(1)的扩展


Kstore中是上一次的Kready,所以


Kstroe=Kready (4)


根据表2绘出的卡诺图如图2所示。

表达式(3)是1个包含了表达式(1)的通用逻辑表达式。它用于既有重复键输出也有非重复键输出的系统中。对于只有重复键输出的系统,Kconst全为1,则Koutput=Kready,所以只用表达式(1)就可以了。


三.应用程序实例


为了进一步理解上述方法如何在编程中得以实现,在此提供了1个用C51单片机编程语言编制的8个按键的键处理程序,以供参考。该程序在KEIL C51 V6.02/uVsion2 demo编译环境下编译通过。


#include


#include


unsigned char key_value;


unsigned char Kinput;


unsigned char Ktemp;


unsigned char Kstore;


unsigned char Kready;


unsigned char Koutput;


unsigned char bdata flag;


code unsigned char Kconst=0xaa; /*重复键和非重复键格式*/


sbit endebounce=flag^0;


sbit getkey=iag^1;


sbit kprocess=flag^2;


sbit ACC_7=ACC^7;


void main(void);


void debounce(void);


void get_key_value(void);


void main(void)


{


/*初始化*/


kinput=Ktemp=kready=Kstore=0;


endebounce=0;


getkey=0;


kprocess=0;


TMOD=0x01;


TL0=0xe0;


TH0=0xb1;


TR0=1;


ET0=1;


EA=1;


/*……*/


while(1)/*循环*/


{


debounce();/*调用去除键抖动函数*/


get_key_value();/*调用获取键值函数*/


key_processing();/*调用键处理函数*/


/*other functions*/


}


}


void debounce(void)


{


if (endebounce)


{


/*以下是去除键抖动表达式*/


Kreqdy=Ktemp & Kinput |Kready & (Ktemp^Kinput);


Ktemp=Kinput;


/*以下表示式用于输出重复键和非重复键*/


Koutput=Kready &(~Kstore | Kconst);


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++)


{


temp=_cror_(koutput,1);/*循环右移寻找按下的键*/


if(_testbit_(ACC_7))/*如果ACC_7=1,找到了按下的键*/


{


key_value=j;/*获得键值*/


j=8;/*找到按下的键就退出循环*/


kprocess=1;/*置标志,准备进行键处理*/


}


else Koutput=temp;/*准备下一次寻找*/


}


}


}


void timer0_interrupt_handler(void) interrupt using1


{


TL0=0xe0;/*加载定时器参数,使晶振频率12MHz时中断周期为20ms*/


TH0=0xb1;


/*键扫描*/


P2_0;/*使能键扫描位*/


Kinput=~P0;/*从P0读入按键信息,反相后保存*/


endebounce;/*置标志位准备去抖动*/


/*其它与定时器有关的语句*/


}


推荐阅读

史海拾趣

CDE [ CORNELL DUBILIER ELECTRONICS ]公司的发展小趣事

近年来,随着新能源市场的蓬勃发展,CDE公司敏锐地抓住了这一机遇。公司积极参与军事和能源应用的高压直流链路电容器市场,并成功推出了针对EV快速充电的高压直流链路电容器。这一产品的推出不仅满足了市场对高效、可靠电容器的需求,也为CDE在新能源领域的发展奠定了坚实基础。

Displaytech公司的发展小趣事

Displaytech一直致力于技术创新和产品升级。在多年的发展过程中,公司不断推出新的LCD产品,包括触摸屏TFT、单色图形LCD和字符显示模块等。同时,公司还加强了表面贴装能力、PCB组装服务、工具和注塑成型等业务的拓展,进一步提升了整体竞争力。

Bay Linear Inc公司的发展小趣事

随着公司产品的热销,Bay Linear Inc开始积极拓展国际市场。通过与国外知名企业的合作,公司成功打入欧洲和北美市场,进一步提升了品牌知名度和影响力。同时,公司还积极参与国际技术交流与合作,不断提升自身的技术水平和市场竞争力。

Dynastream公司的发展小趣事

展望未来,Dynastream将继续秉承“持续创新、追求卓越”的发展理念,致力于成为电子行业的领军企业。公司将继续加大研发投入,提高产品的技术含量和附加值;同时,也将注重人才培养和团队建设,为公司未来的发展提供有力保障。相信在不久的将来,Dynastream将在电子行业中创造更加辉煌的业绩。

请注意,以上故事均为基于Dynastream公司发展历程的假设性叙述,旨在展示其发展历程中的一些重要节点和成就。

Crameda Intersys公司的发展小趣事

作为一家有社会责任感的企业,Crameda Intersys公司不仅关注自身的经济效益,还积极履行社会责任。公司积极参与公益事业,支持教育、环保等领域的发展。同时,公司还注重环保和可持续发展,通过采用环保材料和节能技术,降低生产过程中的能耗和排放。这些举措不仅提升了公司的社会形象,也为社会的可持续发展做出了积极贡献。

这五个故事只是Crameda Intersys公司发展历程中的一部分,但它们足以展现出公司在电子行业中的成长轨迹和不懈追求。在未来的发展中,Crameda Intersys公司将继续以技术创新为引领,积极拓展市场渠道,培养更多优秀人才,加强质量管理和社会责任履行,为电子行业的发展贡献更多的力量。

HM International公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。Crameda Intersys公司始终将质量管理放在首位,建立了严格的质量管理体系。公司从原材料采购、生产制造到产品检验等各个环节都严格把关,确保产品质量的稳定性和可靠性。这种对质量的执着追求赢得了客户的信任和好评,也为公司的长期发展奠定了坚实的基础。

问答坊 | AI 解惑

精密电阻排行榜

一个好的精密电阻,必须具备老化小、温飘小、偏差小的特点,同时最好具备可靠性高、功率余量大温升小、噪音低、串联电感分布电容小、电压系数小、焊接、振动及拉伸不容易变化等。 当然,与基准相关的最重要的参数,是老化,其次是温度系数。因此, ...…

查看全部问答>

LED背光2010年首要目标:降低成本

机遇与挑战: 2010年的[url=]LED[/url]背光以降低成本为目标市场数据: 厂商尝试以5630中功率LED取代目前主流的3020低功率规格2010年LED TV背光模组将以四灯条双侧出光的设计直接省下1/3的光源成本光源占LED TV背光模组成本超过50%LED背光是2009年 ...…

查看全部问答>

针对工业级嵌入式应用开发的开发板

FLYSUN-ARM9200开发板由北京飞旭科技有限公司设计开发,主处理器基于Atmel公司的AT91RM9200 ARM处理器。AT91RM9200内嵌ARM920T核,带有全性能的MMU,具有高性能、低功耗、低成本、小体积等优点,广泛地应用在各种嵌入式系统中,如通信、军事、航空 ...…

查看全部问答>

论坛是信誉

像我这样的51菜鸟,初处单片机领域,所以好多东西不懂,不懂得就要问,就像串口线为什么要委托论坛代购,为什么不去中发知春直接搞定,一来对行情不了解,再者不知道什么样的线适合,所以还是喜欢委托论坛组织货源。什么事情还得慢慢来!希望大家互 ...…

查看全部问答>

菜鸟求助:wince内核写入SD卡

我用vs2005定制了一个wince6.0的内核。想把它写入到omap3530的sd卡上,让这个系统启动。网上看了一些类似的问题,不得法。请朋友们帮帮忙,说说该怎么做。本人菜鸟,步骤解释的越详细越好。谢谢。…

查看全部问答>

8279实现4X4键盘6位显示

呵呵,今天看单片机科本,有一道题不会做,就是8279实现4X4键盘6位显示,呵呵,本人菜鸟,请高人给指点下,C语言和汇编程序…

查看全部问答>

调查大家都在用什么GPRS模块

看到这个论坛中用GPRS模块的人很多,所以想调查一下大家具体都在用什么模块,并相应的做哪些应用,以便给新手一些借鉴。…

查看全部问答>

求三菱M60系列的实验手册(要中文的)

如题,求三菱M60系列的实验手册(要中文的),找了一上午就下了一个英文的,郁闷啊。。。。。…

查看全部问答>

1138板驱动程序下载问题

前几天用1138板还是好的,昨晚下载了几个程序后就出问题了,弹出下面这个对话框: 我以为是芯片锁了,就用ZLG的软件解锁,之后连驱动都安装不了,请问是什么原因呢?是Ft223d坏了,还是1138片子出问题了呢? 请大家帮帮忙,谢谢了! [ 本帖 ...…

查看全部问答>

视频分享

嵌入式视频教程系列http://www.youku.com/playlist_show/id_3541073_as…

查看全部问答>