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

目录

一、长按与短按

二、单击与双击


一、长按与短按

在按键按下的时候,即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;	
			}
		}
	}
}

STM32HAL库提供了一些函数方法来实现按键按、短按双击功能。下面是一种常见的实现方式: 1. 首先,需要初始化按键引脚相关的外部中断。可以使用HAL库提供的GPIO_Init()函数来初始化按键引脚,并使用HAL库提供的HAL_GPIO_EXTI_Callback()函数来处理外部中断的回调函数。 2. 在回调函数中,可以使用HAL库提供的HAL_GetTick()函数获取当前系统的滴答计数值,用于计算按键的按下时间。 3. 当按键按下时,记录下按下的时间,并在松开按键时计算按键按下的时间差。根据时间差的不同,可以判断出是按、短按还是双击。 4. 根据判断结果,执行相应的操作。例如,如果是按,则执行按操作;如果是短按,则执行短按操作;如果是双击,则执行双击操作。 下面是一个示例代码,演示了如何使用STM32HAL库实现按键按、短按双击功能: ```c #include "stm32f4xx_hal.h" #define BUTTON_PIN GPIO_PIN_0 #define BUTTON_PORT GPIOA #define LONG_PRESS_TIME 1000 // 按时间阈值 #define DOUBLE_CLICK_TIME 300 // 双击时间阈值 uint32_t buttonPressTime = 0; uint8_t buttonClickCount = 0; void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == BUTTON_PIN) { if (HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN) == GPIO_PIN_SET) { // 按键按下 buttonPressTime = HAL_GetTick(); } else { // 按键松开 uint32_t buttonReleaseTime = HAL_GetTick(); uint32_t buttonPressDuration = buttonReleaseTime - buttonPressTime; if (buttonPressDuration >= LONG_PRESS_TIME) { // 按 // 执行按操作 } else if (buttonPressDuration <= DOUBLE_CLICK_TIME) { // 短按 buttonClickCount++; if (buttonClickCount == 2) { // 双击 // 执行双击操作 buttonClickCount = 0; } } else { // 单击 // 执行单击操作 buttonClickCount = 0; } } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Super.Bear

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值