历史上的今天
返回首页

历史上的今天

今天是:2025年02月05日(星期三)

正在发生

2021年02月05日 | 51单片机按键电平读取程序

2021-02-05 来源:eefocus

按键电平的读取通常我们都是通过延时函数或者循环延时来降低抖动时间,来读取正确的按键电平。


示例:

#include "reg52.h"

sbit SysKey P0^0

sbit LED P0^1

#define SET 1

#define RESET 0

void Delay1ms(unsigned int ms)

{

unsigned char a,b,c;

while(ms--)

{

for(c=17;c>0;c--)

for(b=134;b>0;b--)

for(a=2;a>0;a--);

}

}

bit ReadKey(void)

{

if(SysKey == RESET)//有按键被按下

{

Delay1ms(10);//延时10ms

if(SysKey == RESET)// 再次判断按键被按下

return 1;

}

return 0;

}

int main(void)

{

SysKey = SET;//输出高电平

LED = 1;//关闭LED

while(1)

{

if(ReadKey == SET)//读取到按键被按下

LED = 0; //点亮LED小灯

Delay1ms(1000)//延时1S

LED = 1; //关闭LED小灯

}

}

以上程序对于简单试验还使用,但对于稍微复杂一点的程序就显得太浪费单片机资源了。单片机在读取到第一个按键下降沿的时候就开始延时10ms,单片机处于循环状态,不能处理其它事件造成资源浪费。

其实我们可以通过一个时间来扫描按键,当单片机读取到按键下降沿的时候,使用一个计数器来进行消抖操作。

示例:www.dgzj.com

#include

sbit SysKey P0^0

sbit LED P0^1

#define SET 1

#define RESET 0

unsigned int TIMTABLE[2] = {0};

void InitTimer0(void)

{

TMOD = 0x01;

TH0 = 0x0FC;

TL0 = 0x018;

EA = 1;

ET0 = 1;

TR0 = 1;

}

bit ReadKey(void)

{

static unsigned char KeyCnt = 0;//定义一个存储读取按键次数的静态变量

switch(KeyCnt)

{

case 0:

{

if(SysKey == RESET)//读取到当前按键被按下

KeyCnt = 1;

}

break;

case 1:

{

if(SysKey == RESET)//读取到当前按键被按下

{

KeyCnt = 2;

return 1;

}

}

break;

case 2:

{

if(SysKey == SET)//读取到当前按键被被释放

KeyCnt = 0;

}

break;

default:KeyCnt = 0;break;

}

return 0;

}

void main(void)

{

InitTimer0();

SysKey = SET;

LED = 1;//关闭LED灯

while(1)

{

if(TIMTABLE[0] >= 10)//10ms扫描时间到了

{

TIMTABLE[0] = 0;//必须清零

if(ReadKey == SET)//读到按键被按下

{

TIMTABLE[1] = 0;

LED = 0;//点亮LED

}

}

else if(TIMTABLE[1] >= 500)//500ms到了

{

TIMTABLE[1] = 0;

LED = 1;//关闭LED小灯

}

//添加其它代码,无软件延时

}

}

void Timer0Interrupt(void) interrupt 1 //1ms定时中断

{

unsigned char i = 0;

TH0 = 0x0FC;

TL0 = 0x018;

for(i=0;i

TIMTABLE++;

}

以上示例程序可以有效解决按键读取抖动,通过主函数每10ms扫描一次按键状态,读取到按键状态后跳出等待10ms判断按键是否被按下。可大大提高单片机资源使用效率。


附原理图:


推荐阅读

史海拾趣

AURORA公司的发展小趣事

在自动驾驶技术快速发展的同时,AURORA公司也积极寻找商业化突破口。公司创始人认为,自动驾驶卡车商业化是一个具有巨大潜力的市场。因此,AURORA优先瞄准了自动驾驶卡车商业化领域,与FedEx、Paccar、Schneider、Werner和Xpress等多家平台公司建立了试点合作关系。通过在实际场景中测试和验证自动驾驶技术,AURORA不断积累经验和数据,为未来的商业化落地奠定了坚实基础。

这五个故事展示了AURORA公司在电子行业中的发展历程和取得的成就。从初创时期的挑战与机遇到技术实力的不断提升,再到与汽车制造商的深度合作、垂直产业链的整合与布局以及自动驾驶卡车商业化的探索,AURORA公司凭借其卓越的技术实力和前瞻性的战略眼光,在电子行业中逐渐崭露头角。未来,我们有理由相信AURORA将继续在自动驾驶领域取得更多突破和创新。

Cermetek Microelectronics公司的发展小趣事

在追求经济效益的同时,Cermetek Microelectronics公司也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和生产工艺,减少对环境的影响。此外,公司还积极参与社会公益事业,为社会做出贡献。这种负责任的态度不仅赢得了社会各界的认可,也为公司的长远发展注入了正能量。

这五个故事展示了Cermetek Microelectronics公司在电子行业中的发展历程和取得的成就。通过技术积累、品质管理、持续创新、国际化战略和社会责任等方面的努力,公司逐渐在微电子领域树立起了自己的品牌形象和市场地位。

Digi International公司的发展小趣事

为了庆祝公司成立30周年,Digi International推出了全新的品牌标识。这一品牌升级不仅展现了公司的创新精神和市场地位,也为其未来的发展注入了新的活力。同时,品牌升级也反映了公司对市场趋势的敏锐洞察和对客户需求的深入理解。

EOZ Secme公司的发展小趣事

EOZ Secme公司自创立之初,就致力于电子安全技术的研发。在2010年代初,随着物联网技术的兴起,EOZ Secme敏锐地捕捉到这一机遇,投入大量资源进行物联网安全技术的研发。经过数年的努力,公司成功开发出了一系列具有自主知识产权的物联网安全解决方案,并在市场上获得了广泛应用。这些技术的创新不仅提高了EOZ Secme的市场竞争力,也奠定了其在电子安全领域的领先地位。

FEI Microwave Inc公司的发展小趣事

FEI Microwave Inc公司自成立以来,始终致力于微波技术的创新与发展。在早期,公司研发团队成功研发出了一款具有突破性的微波收发模块,该模块以其高频率、低噪声和出色的稳定性迅速在市场上崭露头角。随着技术的不断完善,FEI Microwave Inc公司逐渐在微波通信领域建立了自己的技术壁垒,成为业界的佼佼者。

Fanstel公司的发展小趣事

Fanstel公司一直将产品质量视为企业的生命线。公司建立了严格的质量管理体系,从原材料采购到产品生产、检测等各个环节都进行严格控制。此外,Fanstel还不断引进先进的生产设备和检测技术,确保产品质量的稳定性和可靠性。这种对品质管理的坚持赢得了客户的信任和好评,也为公司赢得了更多的市场份额。

问答坊 | AI 解惑

sopc软件编程

一个基于sopc的实例,希望对大家有帮助…

查看全部问答>

高分求助!MotoQ9h 刷机问题!

需求:MotoQ9h手机刷Windows Mobile 6.5 操作系统(.nb0文件),通过USB把手机模拟成网卡,获得独立IP,然后通过与PC机桥接成功后,利用platform 刷机 问题: PC机是Windows XP SP3在微软的fareast域内,但同时也加入到了Test OU network PC机 ...…

查看全部问答>

请教

请教调试这个程序的时候 每次到延时子程序Delay的for(k=0;k…

查看全部问答>

WinCE下如何开发HP打印机的驱动程序

HP打印机并没有提供WinCE下的驱动程序 如何自己开发呢? 有什么开发包可以用吗? 新手,刚刚接触嵌入式不久…

查看全部问答>

初学者理解中断控制串口通讯及例程

相信这方面的理解困惑初学者很久了吧,给点意见!还是想高清中断控制串口通讯。。。接收中断控制串口通讯比如在串口调试软件上面发送一数据,stm32接受后产生中断,进而给该软件回复显示刚所接收到的数据!!这个过程是接收中断控制串口通讯对吧。 ...…

查看全部问答>

实验4.1:usb_dev_serial程序示例?

一.实验目的 学习使用串口和USB 相互通信的方法 二.实验设备 计算机(window xp 系统) LM3S9B96 实验评估板 USB A 型公口转 Mini B 型5Pin 数据线2 条(即电脑连接MP3 等设备的数据线) 5VDC 电源 三.实验原理 本例程中评估板实际是充 ...…

查看全部问答>

关于Arduino 蓝牙串口

各位大侠 有谁用过Arduino 蓝牙串口? 本人想用 STM32F4 接蓝牙串口CP2012来传送数据。 原本已经可以用USART进行传送, 请问串口程序是否需要更改? [ 本帖最后由 lis 于 2013-2-22 02:54 编辑 ]…

查看全部问答>

LCD AND TOUCH BOOSTERPACK进展(近照)

谢谢坛友们的支持,大家都很关心LCD AND TOUCH BOOSTERPACK的进度。 今天是周末,赶紧拍了照片传上来,这是我焊接出来的第一个BOOSTERPACK的照片,就是在下面这个帖子中的那个: LCD AND TOUCH BOOSTERPACK成功点亮(更新)https://bbs.eeworld.c ...…

查看全部问答>

三星四核Cortex A9 Exynos 4412公开资料下载(无需签署NDA)

三星四核Cortex A9 Exynos 4412公开资料下载(无需签署NDA),这是公开部分,不是完整版,下载之前请慎重,三星网站应该可以下到这个。 [ 本帖最后由 gooogleman 于 2013-10-26 23:35 编辑 ]…

查看全部问答>