中断程序错误

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

外部中断编写按键控制灯时出现单击识别出长按的现象
问题:中断函数在主函数运行中间改变了状态标志位的值
解决方案:状态标志物初始化要置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;
		}
	
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值