外部中断编写按键控制灯时出现单击识别出长按的现象
问题:中断函数在主函数运行中间改变了状态标志位的值
解决方案:状态标志物初始化要置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;
}
}
}
在实现外部中断控制按键灯效的程序中,遇到一个问题:单击操作被错误地识别为长按。问题源于中断函数在主函数运行期间改变了状态标志位的值。解决方案是对状态标志位进行初始化设置为0,确保每次检测到按键时都能正确判断其是单击还是长按。在按键处理代码中,针对每个按键,清空点击和长按标志位,避免状态残留导致的误判。
3785

被折叠的 条评论
为什么被折叠?



