蓝桥杯嵌入式(G4系列):定时器长按

前言:

        在之前的博客按键短按里,我已经介绍了按键短按,在这里,记录一下按键长按的代码

代码部分:

        首先在原有的按键结构体变量的基础上,我们先加入几个成员变量

struct keys
{
	unsigned char judge_sta;
	bool key_sta;
	bool single_flag;
	unsigned int key_time;
	bool long_flag;
};

         然后,我们进入到中断回调函数中,简单修改一下,因为在我的STM32Cubemx里,我是定义了1ms中断,所以在这个回调函数里,key_time的识别,我就设定到了1000ms

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM4)
	{
		if(++TIM4_count == 1000)TIM4_count = 0;
		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].judge_sta)
			{
				case 0:
				{
					if(key[i].key_sta == 0)
					{
						key[i].judge_sta = 1;
						key[i].key_time = 0;
					}
				}break;
				case 1:
				{
					if(key[i].key_sta == 0)
					{
						key[i].judge_sta = 2;
					}
					else
					{
						key[i].judge_sta = 0;
					}
				}break;
				case 2:
				{
					if(key[i].key_sta == 1)
					{
						key[i].judge_sta = 0;
						if(key[i].key_time< 1000)
						{
							key[i].single_flag = 1;		//松开手的时候再确认
						}
					}
					else												//在没有松手的时候,让时间不停的累加
					{	
						if(++key[i].key_time == 1000)//按下时长达到1秒后,判定位长按
						{
							key[i].long_flag = 1;
						}
					}
				}break;
			}
		}
	}
	
}

按键服务函数没啥大的区别,无非是多了一点东西:

void key_serve(void)
{
	if(key[0].single_flag == 1)
	{
		sprintf(text,"key0down            ");
		highlight((unsigned char *)text,Line8,3);
//		LCD_DisplayStringLine(Line8,(uint8_t *)text);
		LED_disp(0x01);
		key[0].single_flag = 0;
	}
	else if(key[1].single_flag == 1)
	{
		sprintf(text,"key1down            ");
//		LCD_DisplayStringLine(Line8,(uint8_t *)text);
		highlight((unsigned char *)text,Line8,3);
		LED_disp(0x02);
		key[1].single_flag = 0;
	}
	else if(key[2].single_flag == 1)
	{
		sprintf(text,"key2down            ");
//		LCD_DisplayStringLine(Line8,(uint8_t *)text);
		highlight((unsigned char *)text,Line8,3);
		LED_disp(0x04);
		key[2].single_flag = 0;
	}
	else if(key[3].single_flag == 1)
	{
		sprintf(text,"key3down            ");
//		LCD_DisplayStringLine(Line8,(uint8_t *)text);
		highlight((unsigned char *)text,Line8,3);
		LED_disp(0x08);
		key[3].single_flag = 0;
	}
	else if(key[0].long_flag == 1)
	{
		sprintf(text,"key5down");
		LCD_DisplayStringLine(Line8,(uint8_t *)text);
		LED_disp(0x10);
		key[0].long_flag = 0;
	}
	else if(key[1].long_flag == 1)
	{
		sprintf(text,"key6down");
		LCD_DisplayStringLine(Line8,(uint8_t *)text);
		LED_disp(0x20);
		key[1].long_flag = 0;
	}
	else if(key[2].long_flag == 1)
	{
		sprintf(text,"key7down");
		LCD_DisplayStringLine(Line8,(uint8_t *)text);
		LED_disp(0x40);
		key[2].long_flag = 0;
	}
	else if(key[3].long_flag == 1)
	{
		sprintf(text,"key8down");
		LCD_DisplayStringLine(Line8,(uint8_t *)text);
		LED_disp(0x80);
		key[3].long_flag = 0;
	}
	
}

猜你喜欢

转载自blog.csdn.net/weixin_51651698/article/details/129447130