以下是不使用定时器处理按键的单击双击长按
需要定义一个标志位,和两个变量。
还需要关注短按30ms函数大概执行600次,长按3s 大概60000次,具体次数可以根据硬件和软件做相应修改。
typedef struct
{
uint8_t KEY_FLAG;
uint32_t Key_press_cnt;
uint32_t Key_nopress_cnt;
} KEY_STR;
KEY_STR SW1_S;
void KEY_Scan(void)
{
if(BSP_PB_GetState(SW1)==SET)
{
SW1_S.Key_nopress_cnt =0;
SW1_S.Key_press_cnt ++;
if(SW1_S.Key_press_cnt >= 600 && SW1_S.Key_press_cnt < 1000)
{
if(SW1_S.KEY_FLAG == 2 ||SW1_S.KEY_FLAG == 3)
{
SW1_S.KEY_FLAG = 3;
SW1_S.Key_nopress_cnt = 0;
}
else
{
SW1_S.KEY_FLAG = 1;
}
}
else if(SW1_S.Key_press_cnt >= 60000) //长按处理
{
BSP_LED_Toggle(LED1);
SW1_S.KEY_FLAG = 0;
SW1_S.Key_press_cnt = 1000;
}
}
else
{
SW1_S.Key_press_cnt =0;
SW1_S.Key_nopress_cnt ++;
if(SW1_S.KEY_FLAG == 1)
{
SW1_S.KEY_FLAG = 2;
}
else if(SW1_S.KEY_FLAG == 2)
{
if(SW1_S.Key_nopress_cnt >= 6000) //单击处理
{
SW1_S.KEY_FLAG = 0;
BSP_LED_Toggle(LED3);
}
}
else if(SW1_S.KEY_FLAG == 3) //双击处理
{
BSP_LED_Toggle(LED2);
SW1_S.KEY_FLAG = 0;
}
}
}