2025-11-28 06:12:04

按键消抖、长按的处理方案(中断法、延时法)

单片机开发中经常使用按键进行人机交互。由于按键的机械特性,会在按下和松开的瞬间发生抖动,通常持续10-20ms,如下图所示,

如果程序不采取一些算法进行消抖,会出现一次按下,多次检测到按键的情况,造成识别异常。常见的消抖算法如下:

if(key == 0) //假设按键低电平有效

{

delay_ms(10); //延时10ms,进行消抖

if(key == 0)

{

do_thing();

while(key == 0);//松手判断

}

}

以上的代码可以起到良好的消抖作用,在一些小项目中经常运用。但是由于该方式,在消抖延时期间和松手判断期间都会长时间占用CPU,有可能影响其他功能,对系统的实时性造成影响。

再来看下面代码

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。在中断中将标志位置一,在主循环中执行处理函数,避免因执行处理函数,占用中断过长时间。

又部(又字旁)
2016年女排世俱杯:參賽球隊,分組情況,賽事規則,賽程賽果,小組賽階段,決賽階段