蓝桥杯嵌入式按键--短按和长按
·
因为按键内部使用的是机械式弹簧片来进行通断的,所以按下和松手的瞬间会有一连串的抖动,所以这里使用的是延时函数来消抖,延时20ms,等端口的值稳定后再去读取值。
这里的长按和短按是配合TIM3使用的,PSC+1=8000, ARR+1=30000,TIM3的计数周期为3s

代码部分如下:
记得要在主函数main中使能TIM3
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
LCD_Init();//初始化LCD
LCD_Clear(Black);//指整块LCD屏幕背景为黑色
LCD_SetBackColor(Black);//指要显示的那行背景为黑色
LCD_SetTextColor(White);//文字颜色设置为白色
HAL_TIM_Base_Start(&htim3);//使能TIM3
int count_l = 0;//长按时,count_l ++
int count_s = 0;//短按时,count_s ++
void Key_GetNum(void)
{
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0)
{
HAL_Delay(20);//消抖
TIM3->CNT = 0;
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0)
{
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0){};
if(TIM3->CNT >= 10000)//长按(一直按超过1s,算是长按)
{
count_l ++;
}
if(TIM3->CNT < 10000)//短按(少于1s,即为短按)
{
count_s ++;
};
}
HAL_Delay(20);//消抖
}
}
char text[20];
void lcd_show(void)
{
sprintf(text, " text ");
LCD_DisplayStringLine(Line0, (uint8_t *)text);
sprintf(text, " count_l:%d ", count_l);
LCD_DisplayStringLine(Line2, (uint8_t *)text);
sprintf(text, " count_s:%d ", count_s);
LCD_DisplayStringLine(Line3, (uint8_t *)text);
}
最终效果是长按1s,count_l 加 1,短按的话 count_s 加 1。
记录一下自己的学习过程。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)