历史上的今天
今天是: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运行过程中,最后程序错过了这一事件。
上一篇:#51单片机#中断实现按键消抖
下一篇:#51单片机#按键
史海拾趣
|
现在PCI数据线与CPLD相连,有一个功能是测速,首先用LAD0发一个控制信号,然后如入LAD[15..0]的数据。 由于LAD0需要双向,因此将LAD[15..0]都设为Bir(在顶层框图中)但是发现通过LAD0根本写入不了命令,不知为什么? 现在只能LAD0只作输入 其余1 ...… 查看全部问答> |
|
有网友试过,效果确实不错:宿舍窗台上(11楼)不到20秒,显示了时间,再过几秒,就显示了经纬度,没调,就收到4颗心!! 材料: 同轴线 直径1mm的漆包线200mm以上 敷铜板:长:100mm; 宽:100mm; 敷铜条 ...… 查看全部问答> |
|
PCB的热设计摘要:热分析、热设计是提高印制板热可靠性的重要措施.基于热设计的基本知识,讨论了PCB设计中散热方式的选择、热设计和热分析的技术措施.关键词:印制板;热设计;热分析 1、热设计的重要性 电子设备在工作期间所消 ...… 查看全部问答> |
|
APB主频是24MHz, timer 我想分频到100Hz。 但是分频寄存器是16位的,PSC无法一次分频到100Hz。如果不改变原APB主频 ...… 查看全部问答> |
|
急!!!〈德州仪器第三方员工招聘〉工作地点上海浦东(3个岗位) 新的一年开始啦,大神们是不是在看新机会呢!急招哦~~ TI 产品线亚太地区技术支持,主要负责TI 亚太区C2000/Interface/Power芯片的技术支持工作。 通过德州仪器平台邮件和论坛的回复,主要为亚太地区的研发工程师提供研发解决方案,包括产品选型 ...… 查看全部问答> |




