单片机开发中经常使用按键进行人机交互。由于按键的机械特性,会在按下和松开的瞬间发生抖动,通常持续10-20ms,如下图所示,
如果程序不采取一些算法进行消抖,会出现一次按下,多次检测到按键的情况,造成识别异常。常见的消抖算法如下:
if(key == 0) //假设按键低电平有效
{
delay_ms(10); //延时10ms,进行消抖
if(key == 0)
{
do_thing();
while(key == 0);//松手判断
}
}
以上的代码可以起到良好的消抖作用,在一些小项目中经常运用。但是由于该方式,在消抖延时期间和松手判断期间都会长时间占用CPU,有可能影响其他功能,对系统的实时性造成影响。
再来看下面代码文章来源:https://www.toymoban.com/news/detail-612297.html
void Timer_ISR() //定时中断,10ms进一次中断
{
static u8 ReadData=0,Trg=0,Cont=0;
static u16 long_pree_cnt=0;
ReadData=0;
if(KEY == 0) ReadData |= 0x01;
Trg = 0;
Trg = ReadData & (ReadData ^ Cont);
Cont = ReadData;
if(Trg & 0x01) //按键短按
{
key_press_flag = 1; //按键按下标志位
}
if(Cont & 0x01) //按键长按10s
{
if (++long_pree_cnt == 1000)
{
long_pree_cnt = 0;
key_long_press_flag = 1
}
}
else
long_pree_cnt = 0;
}
void main()
{
while(1)
{
if(key_press_flag) //按键按键,执行对应的处理函数
{
key_press_flag = 0;
key_press();
}
if(key_long_press_flag)
{
key_long_press_flag = 0;
key_long_press();
}
}
}
以上代码,基本逻辑就是设置一个10ms的定时中断,在中断扫描按键。按键的消抖、按下、松开、长按都可以在中断中快速检测,不会有延时函数长时间占用CPU。在中断中将标志位置一,在主循环中执行处理函数,避免因执行处理函数,占用中断过长时间。文章来源地址https://www.toymoban.com/news/detail-612297.html
到了这里,关于按键消抖、长按的处理方案(中断法、延时法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!