按键扫描代码
/*******************************************************************************
**函数名称:u8 Key_Scan(void)
**功能描述:按键检测函数
**入口参数:无
**返回:按键事件状态
**使用本函数的注意点:需要用一个定时中断来定时执行
*******************************************************************************/
u8 Key_Scan(void)
{
if (BUTTON_PIN == ACTIVE_LEVEL)
{
if (Press_Counter >= LONG_COUNT) //长按未松开
{
return KEY_STATUS_NO_LOOSEN;
}
// 计数
Press_Counter++;
// 按键按下
while (Press_Counter >= SHORT_COUNT)
{
//检测到松开、超时的时候,则处理
if ((BUTTON_PIN != ACTIVE_LEVEL) || (Press_Counter >= LONG_COUNT))
{
// 长按键
if (Press_Counter >= LONG_COUNT)
{
return KEY_STATUS_TRIGGER_LONG;
}
// 短按键
else
{
return KEY_STATUS_TRIGGER_SHORT; //3s内的按键松开为短按
}
}
//计数判断长短按
Press_Counter++;
delay_ms(1);
}
}
else
{
Press_Counter = 0; //计数清零
}
return KEY_STATUS_IDLE;
}
定时执行代码(示例)
INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 25)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
switch (Key_Function)
{
//空闲
case KEY_STATUS_IDLE:
{
//检测按键当前状态
Ret = Key_Scan();
//短按键触发时
if (Ret == KEY_STATUS_TRIGGER_SHORT)
{
Key_Function = KEY_SHORT_EVENT;
}
//长按键触发时
else if (Ret == KEY_STATUS_TRIGGER_LONG)
{
Key_Function = KEY_LONG_EVENT;
}
break;
}
//短按键处理
case KEY_SHORT_EVENT:
{
LED_Fast_Flash();
// do something
//返回空闲状态
Key_Function = IDLE_EVENT;
TIM4_Cmd(DISABLE);
break;
}
//长按键处理
case KEY_LONG_EVENT:
{
LED_Slow_Flash();
// do something
//返回空闲状态
Key_Function = IDLE_EVENT;
TIM4_Cmd(DISABLE);
break;
}
//其他
default:
{
//返回空闲状态
Key_Function = IDLE_EVENT;
// TIM4_Cmd(DISABLE);
break;
}
}
/* 清除中断标志位 */
TIM4_ClearITPendingBit(TIM4_IT_Update);
}