关注+星标公众号,不错过精彩内容!
while(1)
{
if(KeyGpio == 0)
{
DelayMs(10); //延时10ms
if(KeyGpio == 0)
{
//按键处理代码
}
}
//其它代码
}
代码实现2:按键GPIO初始化为中断方式,按键按下后产生外部中断事件,进入中断处理函数中,延时消抖,最终调用按键处理函数,或者设置标志位去主循环里调用按键处理函数。这种在中断中延时消抖的方法不少人使用,其性能还不如第一种方法,缺点很明显,中断中延时会导致低优先级中断阻塞,也导致主循环阻塞,实时性更差。
void KeyGpio_IrqHandler(void)
{
if(KeyGpio == 0)
{
//延时10ms
DelayMs(10);
if(KeyGpio == 0)
{
//按键处理代码
KeyFunction();
}
}
ClearIrqFlag();
}
代码实现3:按键GPIO初始化为中断方式,按键按下后产生外部中断事件,进入中断处理函数中,不采用延时消抖,而是开启了一个定时器,定时器设定为10ms后产生中断,定时器中断后再次检测按键GPIO,如果仍然是按下状态则调用按键处理函数。中断中只是开启了定时器,并未阻塞,主循环也没有阻塞,从性能上最优,但是这种方法用到了一个定时器,占用了处理器资源。
void KeyGpio_IrqHandler(void)
{
if(KeyGpio == 0)
{
//未开启定时情况下进入,防止重复开启定时器
if(isTimerStart() == 0)
{
// 设置定时器时间为10ms
InitTimer(10);
// 开启定时器
StartTimer();
}
}
ClearKeyIrqFlag();
}
void Timer_IrqHandler(void)
{
StopTimer();
if(KeyGpio == 0)
{
//按键处理代码
KeyFunction();
}
ClearTimerIrqFlag();
}
以上示例伪代码采用10ms延时,使用时可根据实际情况调整。