历史上的今天
返回首页

历史上的今天

今天是:2024年10月27日(星期日)

正在发生

2021年10月27日 | #51单片机#按键消抖

2021-10-27 来源:eefocus

按键消抖是为了保证实际应用效果

先看一段代码:

#include


unsigned char code LedChar[10]={//数码管显示的数字0~9

0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};


sbit KEY1 = P3^3;

sbit DigitalTube = P1^0;


bit backup = 1; //定义一个位变量,保存前一次扫描的按键值

unsigned char cnt = 0;//定义一个计数变量,记录按键按下次数


void main()

{

KEY1 = 1; //按键引脚输出高电平

while(1)

{

  DigitalTube = 0;

P0 = LedChar[cnt];

if(KEY1 != backup) //当前值不同于前一次的值

{

if(backup == 0) //如果前值为0,说明当前状态是0->1,即按键弹起

{

cnt++;

if(cnt>9)

{

cnt = 0;

}

}

backup = KEY1;//更新备份位当前值,以便进行下一次比较

}

}


理想的程序运行效果是按一下增加一个数字,但实际效果却是按一下增加了多个数字。


为什么会出现这个现象?


原因:按键开关内部具有机械弹簧。机械触点的弹性,使得开关在闭合时不会马上稳定接通,断开时也不会立刻彻底断开,导致开关在闭合与断开的瞬间产生一连串抖动,影响了实际效果。


按键抖动的时间通常在10ms以内。

而按一下开关的时间通常在100ms以上。即使刻意加快速度,也只能达到40~50ms。


为了确保操作效果,必须进行按键消抖。


按键消抖分为硬件消抖和软件消抖。


硬件消抖在实际应用中效果不好,这里主要介绍软件消抖的方法。


最简单粗暴的方法就是检测到按键状态变化后,等待10ms再操作。


修改代码如下:


#include


unsigned char code LedChar[10]={//数码管显示的数字0~9

0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};


sbit KEY1 = P3^3;

sbit DigitalTube = P1^0;


bit backup = 1; //定义一个位变量,保存前一次扫描的按键值

unsigned char cnt = 0;//定义一个计数变量,记录按键按下次数


void delay();


void main()

{

KEY1 = 1; //按键引脚输出高电平

while(1)

{

  DigitalTube = 0;

P0 = LedChar[cnt];

if(KEY1 != backup) //当前值不同于前一次的值

{

delay();

if(backup == 0) //如果前值为0,说明当前状态是0->1,即按键弹起

{

cnt++;

if(cnt>9)

{

cnt = 0;

}

}

backup = KEY1;//更新备份位当前值,以便进行下一次比较

}

}


//延时约10ms

void delay()

{

unsigned int i = 1000;


while(i--);

}


需要注意,在实际项目开发中,往往不会这样编写这段代码。


实际项目开发,程序量大,状态值多。


while(1)主循环需要不断检测各状态值,及时进行任务调度,而delay()函数在while(1)循环中占据了大量程序内存。


可能出现这种现象:某一事件发生时,程序正在进行delay延时操作。事件结束于delay运行过程中,最后程序错过了这一事件。

推荐阅读

史海拾趣

Decawave公司的发展小趣事

随着UWB技术的不断发展和应用领域的不断扩展,Decawave不断丰富和完善其产品和解决方案。除了UWB芯片外,公司还推出了与UWB芯片兼容的模块和开发工具,以及针对特定应用场景的解决方案。这些产品和解决方案不仅满足了客户的不同需求,也进一步巩固了Decawave在UWB技术领域的领先地位。

High Tech Chips Inc公司的发展小趣事

在2015年的微软室内定位大赛中,Decawave的UWB技术大放异彩。公司凭借其高精度、低误差的UWB定位解决方案,在激烈的竞争中脱颖而出,荣获最佳无线电定位解决方案奖。这一荣誉不仅证明了Decawave在UWB技术领域的领先地位,也为其在市场上的推广和应用奠定了坚实的基础。

Continental Industries公司的发展小趣事

在电子行业的初期,Continental Industries凭借其深厚的技术积累,成功研发出了一款固态继电器。这款继电器以其高度可靠性、长寿命和减少电磁干扰的特性,迅速在市场中占据了重要地位。公司不断投入研发资源,优化产品性能,逐渐在工业自动化和建筑环境控制领域树立起了技术领先的形象。

意华(CZT)公司的发展小趣事

自1995年成立以来,意华(CZT)始终秉持“诚信”的合作态度和“创新”的发展思路。在公司初创阶段,面对激烈的市场竞争,意华坚持高质量的产品和服务,赢得了客户的信赖。同时,公司不断投入研发,推出了一系列具有创新性的电子产品和连接器,迅速在市场上树立了良好的口碑。

Advanced Electronic Packaging公司的发展小趣事

Advanced Electronic Packaging公司自创立之初,便专注于电子封装技术的研发与创新。在一次关键的技术研讨会上,公司的研发团队成功突破了传统封装材料的限制,开发出了一种新型的、具有更高热导率和机械强度的封装材料。这一技术的突破,不仅提高了电子产品的性能和稳定性,还大幅降低了生产成本。凭借这一优势,Advanced Electronic Packaging公司迅速在电子封装材料市场占据了领先地位,为后续的发展奠定了坚实的基础。

Chauvin Arnoux公司的发展小趣事

进入上世纪三十年代,Chauvin Arnoux开始涉足摄影领域。1936年,公司成功开发了第一台摄影用曝光表,为摄影师提供了更为精确的曝光测量工具。这一产品的推出,不仅满足了摄影行业对精确测量的需求,也进一步扩大了Chauvin Arnoux在测量仪器领域的市场份额。

问答坊 | AI 解惑

CPLD的双向端口问题!毕设啊求助!

现在PCI数据线与CPLD相连,有一个功能是测速,首先用LAD0发一个控制信号,然后如入LAD[15..0]的数据。 由于LAD0需要双向,因此将LAD[15..0]都设为Bir(在顶层框图中)但是发现通过LAD0根本写入不了命令,不知为什么? 现在只能LAD0只作输入 其余1 ...…

查看全部问答>

请教WINCE动态库的问题

为什么PB编译的动态库通常要比EVC编译的动态库小一点呢?…

查看全部问答>

自制廉价的GPS外接天线

    有网友试过,效果确实不错:宿舍窗台上(11楼)不到20秒,显示了时间,再过几秒,就显示了经纬度,没调,就收到4颗心!!     材料: 同轴线 直径1mm的漆包线200mm以上 敷铜板:长:100mm; 宽:100mm; 敷铜条 ...…

查看全部问答>

电子产品总PCB的散热设计

PCB的热设计摘要:热分析、热设计是提高印制板热可靠性的重要措施.基于热设计的基本知识,讨论了PCB设计中散热方式的选择、热设计和热分析的技术措施.关键词:印制板;热设计;热分析  1、热设计的重要性  电子设备在工作期间所消 ...…

查看全部问答>

版主,咨询一个TIM分频的疑问

                                 APB主频是24MHz, timer 我想分频到100Hz。 但是分频寄存器是16位的,PSC无法一次分频到100Hz。如果不改变原APB主频 ...…

查看全部问答>

有没有人用过430读写sd卡呀?

不知道各位大虾有没有关于430读写sd卡方面的资料?小弟拜求了! Email:zwiceman@hotmail.com…

查看全部问答>

FPGA控制W5300

有没有大神做过这个项目呀,手头没什么资料,不知道从何下手。…

查看全部问答>

MSP430AFE221 读取SD24位极不稳定

本人最近在用AFE221,但是读取SD24的值很不稳定,后面有近16位的数在变动,这是为什么?望大家帮忙解决下,谢谢!…

查看全部问答>

急!!!〈德州仪器第三方员工招聘〉工作地点上海浦东(3个岗位)

新的一年开始啦,大神们是不是在看新机会呢!急招哦~~ TI 产品线亚太地区技术支持,主要负责TI 亚太区C2000/Interface/Power芯片的技术支持工作。 通过德州仪器平台邮件和论坛的回复,主要为亚太地区的研发工程师提供研发解决方案,包括产品选型 ...…

查看全部问答>