历史上的今天
返回首页

历史上的今天

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

2021年10月26日 | #51单片机#中断实现按键消抖

2021-10-26 来源:eefocus

在实际工程中常用到中断的算法来实现按键消抖。


思路:启动一个定时中断,每2ms进一次中断扫描按键状态并储存。连续扫描8次后,观察这8次按键状态是否一致。如果一致,即按键没有发生动作,处于稳定状态。


被监测到的按键动作,通常如下图所示:

在这里插入图片描述

具体代码如下:


#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 KeySta = 1; //当前按键状态。


void main()

{

bit backup = 1;//按键值备份,保存前一次扫描的值。

unsigned char cnt = 0;//按键计数,记录按键按下的次数。


EA = 1;//中断总开关。

ET0 = 1;//使能中断。

TH0=0XF8;//定时器设定,定时2ms。

TL0=0XCD;

TR0 = 1;//启动T0。


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


while(1)

{

  DigitalTube = 0;

P0 = LedChar[cnt];

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

{

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

{

cnt++;

if(cnt>9)

{

cnt = 0;

}

}

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

}

}

//T0中断服务函数,用于扫描按键状态

void InterruptTimer0()interrupt 1

{

static unsigned char keybuf = 0XFF; //扫描缓冲区,保存一段时间内的扫描值。


TH0=0XF8;

TL0=0XCD;

keybuf = (keybuf<<1)|KEY1; //缓冲区左移一位,并将当前扫描值移入最低位。

if(keybuf == 0X00)

{ //连续8次扫描值为0,即16ms内都只检测到按下状态,可认为按键已按下。

KeySta = 0;

}

else if(keybuf == 0XFF)

{ //连续8次扫描值为1,即16ms内都只检测到弹起状态,可认为按键已弹起。

KeySta = 1;

}

else

{}    //其他情况。按键状态不确定,不更新KeySta变量值。

}

推荐阅读

史海拾趣

问答坊 | AI 解惑

单片机硬件设计的经验总结

单片机硬件设计的经验总结…

查看全部问答>

汽车电子行业杂谈

今天前同事请吃饭,一起很好的兄弟,一个学校,一个学院的校友,08年一起进的公司,刚跳槽去了整车厂,工资涨了不少,工作也算轻松。晚上见到了几个前同事,感叹一桌子人,半年前还都在一个公司,半年后一半都已经各奔东西了。   09年初 ...…

查看全部问答>

请问如何在STARTUP.S中打印信息

想在OAL层的STARUP.S中添加点打印信息看看程序死在哪,怎么添加呢,该调用哪个函数? 汇编不是很明白…

查看全部问答>

有关乘法器、加法器的问题

乘法器、加法器直接使用了Verilog语言中的乘法、加法算术运算符,由于频率不是很高,FPGA验证通过。不知在Asic中,这样的写法可不可行。因为我自己用超前进位写的加法器和用Booth算法写的乘法器综合出的面积都比用Verilog语言中的乘法、加法算术运 ...…

查看全部问答>

工作纠结中

本人研三即将毕业,在找工作的浪潮中摸爬滚打几个月? 心里很是纠结?   一是自己找到了一个比较喜欢的职位,但薪资不是很高,公司不是很大。当看到别人找到了大公司,拿到了好的待遇薪资,心里有点不舒服?觉得自己也可拿到,但是我现在的 ...…

查看全部问答>

请高手帮忙!!脱离不了JTAG

timer A做的软件串口程序,用485芯片传数, JTAG调试的时候程序还很正常,但是脱离JTAG直接接电的时候,就收不到数据了 不知道为什么 请高手指教, 谢谢!!!!…

查看全部问答>

failed to write memory 0x1100是什么意思?

在做硬件方真时,连接不上,提示我 failed to write memory 0x1100 哪位高手能指导下是什么意思啊?…

查看全部问答>

基于NRF905的无线模块编程代码

//#include #include //#include //#define MULTITX_PROGRAM in Target->Options->C51 #include \"def.h\" #include \"nRf905\\nRF905.h\" #include \"elseFiles\\func.h\"               & ...…

查看全部问答>