【蓝桥杯嵌入式】stm32按键单击消抖

文章讨论了在51单片机开发中,使用定时器中断而非回调函数处理按键消抖的问题,通过定时10ms判断按键状态,避免了按键抖动导致的显示异常和键盘扫描问题。作者分享了关键代码片段并强调了正确处理单击事件的重要性。
摘要由CSDN通过智能技术生成

2024_2_14补充:不要在回调函数里放lcd的显示代码,否则会出现lcd显示异常,键盘扫描也会异常

1. 开始要说的

        博主使用51单片机的消抖不好用,如:按下后,hal_delay(10),再判断,博主实测不好用。该抖的还是得抖。

        需要打开定时器中断,10ms进入一次判断,然后使用以下代码在定时器的回调函数中调用。实测真的很好用。

Key_Stru key[4]={0,0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
	if (htim->Instance == TIM3){
		key[0].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
		key[1].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
		key[2].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
		key[3].key_sta = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
	}
	for (int i=0;i<4;i++){
		switch(key[i].cur_sta){
			case 0:{
				if(key[i].key_sta == 0) 
					key[i].cur_sta = 1;
			}
			break;
			case 1:{
				if (key[i].key_sta == 0) {
					key[i].cur_sta = 2;
					key[i].single_flag = 1;					
				}
				else {
					key[i].cur_sta = 0;
					key[i].single_flag = 0;
				}
			}
			break;
			case 2:{
				if (key[i].key_sta == 1){
					key[i].cur_sta = 0;
					key[i].single_flag = 0; // 这个很重要,我看其他博客有点错误
				}
			}	
		}
	}
}

这是其他博客参考过来的,代码中的那个注释前的语句必须的加上,要不然会有bug

博主狠狠的往里面跳了,难受。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值