外部中断编写按键控制灯时出现单击识别出长按的现象
问题:中断函数在主函数运行中间改变了状态标志位的值
解决方案:状态标志物初始化要置0;
static void Run()
{
//运行状态机
// switch(STA_Machine.ucSTA_Machine_Status)
// {
// case STA1: STA_Machine.Fun_STA1(); break;
// case STA2: STA_Machine.Fun_STA2(); break;
// case STA3: STA_Machine.Fun_STA3(); break;
// case STA4: STA_Machine.Fun_STA4(); break;
// case STA5: STA_Machine.Fun_STA5(); break;
// default: STA_Machine.ucSTA_Machine_Status = STA1;
// }
KEY.Key_Detect();
// printf("按键扫描结束\r\n");
switch(KEY.KEY_FLAG)
{
case KEY1_NUM:
{
if(KEY.Click==KEY_TRUE)
{
LED.LED_Flip(LED1);
printf("按键1单击\r\n");
}
if(KEY.Press==KEY_TRUE)
{
LED.LED_Flip(LED1);
HAL_Delay(200);
LED.LED_Flip(LED1);
printf("按键1长按\r\n");
}
KEY.KEY_FLAG=NO_KEY;
KEY.Click=KEY_FALSE;
KEY.Press=KEY_FALSE;
break;
}
case KEY2_NUM:
{
if(KEY.Click==KEY_TRUE)
{
LED.LED_Flip(LED2);
printf("按键2单击\r\n");
}
if(KEY.Press==KEY_TRUE)
{
LED.LED_Flip(LED2);
HAL_Delay(200);
LED.LED_Flip(LED2);
printf("按键2长按\r\n");
}
//状态复位应该归零
KEY.KEY_FLAG=NO_KEY;
KEY.Click=KEY_FALSE;
KEY.Press=KEY_FALSE;
break;
}
}
}