因为按键内部使用的是机械式弹簧片来进行通断的,所以按下和松手的瞬间会有一连串的抖动,所以这里使用的是延时函数来消抖,延时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。

记录一下自己的学习过程。


 

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐