对于按键的单双击、长按等设计,需要使用一些定时器代替延时,提高效率,设计方法有很多种,下面介绍一种中断的处理方法:
1、中断后触发该函数
void Board_keyCallback()
{
if (PIN_getInputValue(Board_KEY_BUTTON))
{
//release button
if (isLastButtonValueLongPress == 1)
{
//skip it
isLastButtonValueLongPress = 0;
return ;
}
sendButtonValue++;
isRefreshButtonValue = BUTTON_REFRESH_MULTICLICK;
}
else
{
//press button
isRefreshButtonValue = BUTTON_REFRESH_LONGPRESS;
isLongPressTimes = 0;
}
此处添加定时器程序代码,定时触发下面的函数。
}
2:、1中定时器触发下面的函数
void Board_keyChangeHandler()
{
if (appKeyChangeHandler == NULL)
{
return;
}
if (isRefreshButtonValue == BUTTON_REFRESH_MULTICLICK)
{
if (sendButtonValue > BUTTONVALUE_TRIPLE_CLICK)
sendButtonValue = BUTTONVALUE_TRIPLE_CLICK;
//此处发送按键状态点击次数给应用函数
(*appKeyChangeHandler)(sendButtonValue);
sendButtonValue = 0;
isRefreshButtonValue = BUTTON_REFRESH_NO_ACTION;
isLongPressTimes = 0;
isLastButtonValueLongPress = 0;
}
else if (isRefreshButtonValue == BUTTON_REFRESH_LONGPRESS)
{
isLongPressTimes++;
if (isLongPressTimes > BUTTON_LONG_PRESS_TIMES)
{ //此处发送按键状态长按给应用函数
(*appKeyChangeHandler)(BUTTONVALUE_LONG_PRESS);
sendButtonValue = 0;
isRefreshButtonValue = BUTTON_REFRESH_NO_ACTION;
isLongPressTimes = 0;
isLastButtonValueLongPress = 1;
}
else
{
Util_restartClock(&keyChangeClock, KEY_DEBOUNCE_TIMEOUT);
}
}
}
以上方法可实现单按键的长按以及多次点击事件。