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
博主狠狠的往里面跳了,难受。