独立按键之长按、短按、单击、双击

目录

一、长按与短按

二、单击与双击


一、长按与短按

在按键按下的时候,即key_down下降沿开始计时。给定一个计时时间,如果在这个计时时间之内检测到了key_up上升沿,即按键松开,则为短按。如果在这个定时时间内没有检测到key_up上升沿,则为长按。

uint8_t Key_Scan(void)
{
	uint8_t val=0;
	if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)==0)
		val =1;
	if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)==0)
		val =2;
	if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2)==0)
		val =3;
	if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==0)
		val =4;
	
	return val;
	
}


void key_proc(void)
{
	if(uwTick - key_uwTick<50)return ;
	key_uwTick = uwTick;
	
	
	key_val = Key_Scan();
	key_down = key_val & (key_old^key_val);
	key_up = ~key_val & (key_old^key_val);
	key_old = key_val;
	
	if(key_down)
	{
		key_time_uwTick = uwTick;
	}
	if(uwTick-key_time_uwTick<1000) // 短短
	{
		switch(key_up)
		{
			case 1:
				ucled =0xff;
				break;
			case 2:
				ucled =0x0;
				break;
		}
		
		
	}
	else    // 长按
	{
		switch(key_val)
		{
			case 1:
				ucled =0;
				break;
			case 2:
				ucled =0x01;
				break;
		}
		
	}
}

注:按键返回值一定要初始化为0

二、单击与双击

在第一次按键按下的key_down下降沿开始计时,给定一个计时时间,如果在这个计时时间之内检测到了key_up上升沿(代表按键松开),则为短按。如果在这个定时时间内没有检测到key_up上升沿,则为长按。

void key_proc(void)
{
	if(uwTick - key_uwTick<50)return ;
	key_uwTick = uwTick;
	
	key_val = Key_Scan();
	key_down = key_val & (key_old^key_val);
	key_up = ~key_val & (key_old^key_val);
	key_old = key_val;
	
	if(key_up)//当第一次按键按下抬起时
	{
		key_temp=key_up;  //记录按键按下抬起后的键值
		
		if(key_down_num == 0)
		{
			key_down_num = 1;  //记录第一次按键已经按下
			key_time_uwTick = uwTick; // 开始计时
		}
		else   //如果检测到双击后的第二次上升沿 将按键按下次数清理 以便于判断下一次按键的单击-双击
			key_down_num=0; 
	}
	if(key_down_num == 1)//当第一次按下并抬起时
	{
		if(uwTick - key_time_uwTick >= 1000)  //当按键按下1s时间后没有检测到第二次按键按下-单击
		{
			switch(key_temp)
			{
				case 1:
					ucled =1;
				break;
				case 2:
					ucled =0;
				break;
			}
			key_down_num =0; // 清零 以便下一次判断按键类型
		}
		else  //按键在1s内检测到按键按下-双击
		{
			switch(key_down)
			{
				case 3:
					ucled = 1;
				break;
				case 4:
					ucled = 0;
				break;	
			}
		}
	}
}

扫描二维码关注公众号,回复: 14136381 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_53144843/article/details/123801324