简洁的c代码实现按键长按、短按、单击、双击程序

 uint8_t  key_state_curr 		= 0;
 uint8_t  key_state_last 		= 0;
 uint8_t  key_press_cont  		= 0;
 uint16_t key_release_time  	= 0;
 uint16_t key_long_press_time  	= 0;
 
 //10ms执行1次
 void key_porc(void)
 {
	//key_state_curr 是已消抖的按键状态,0按下,1松开,这里不提供消抖部分逻辑
	 
	//按键状态变化
	if(key_state_last != key_state_curr)
	{
		//当前是按下,下降沿
		if(key_state_curr == 0)
		{
			//处理按下相关
			
			key_long_press_time=0;
			key_release_time=0;			
			key_press_cont++;
		}
		//当前是松开,上升沿
		else
		{
			//处理松开相关
		}
		
		key_state_last = key_state_curr;
	} 
	
	
	//长按下检测
	if(key_state_curr == 0)
	{
		if(key_press_cont)
		{
			key_long_press_time++;
			
			//长按2秒
			if(key_long_press_time >= 200)
			{
				//处理长按相关
				
				key_long_press_time=0;
				key_press_cont=0;
			}				
		}
	}
	//长松开检测
	else
	{
		if(key_press_cont)
		{
			key_release_time++;
			
			//松开500ms,处理按键值
			if(key_release_time >= 50)
			{
				//当前是单击
				if(key_press_cont == 1)
				{
					//处理单击相关
				}
				//当前是双击
				else if(key_press_cont == 2)
				{
					//处理双击相关
				}	
				
				key_press_cont = 0;
				key_release_time = 0;
			}
		}
	}
 }

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
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; } } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

dear_Wally

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

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

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

打赏作者

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

抵扣说明:

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

余额充值