STM32按键的短按/长按/双击

上一篇文章已经写好了定时器,并且实现了按键长按。

现在狭隘的用一下:

https://mp.weixin.qq.com/s?__biz=MzUyOTM0NDkyMA==&mid=2247484014&idx=1&sn=b07bde8a1d5b15467b2c80dfd7ae3547&chksm=fa633299cd14bb8f8e9334282059930bafabf44dfcf502b0a39b7f30326268f8574acc0b0ccf&mpshare=1&scene=23&srcid=0606fxjOEkyOf9zu21GHV78G#rd

//⑥外部中断 2 服务程序  按键效果!!!
void EXTI2_IRQHandler(void)
{
    if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == 0) //按键 KEY2
    {
        key_fall_flag = 1;//生成按键按下标志
    }
    EXTI_ClearITPendingBit(EXTI_Line2); //清除 LINE2 上的中断标志位
}



//中断效果
void TIM3_IRQHandler(void) //TIM3 中断
{
  static u16 keyupCnt = 0;//按键弹起后计数值
  static u16 key_holdon_ms = 0;//按下的时长
  u16 keyUpFlag = TRUE;//按键弹起标志
	
  if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查 TIM3 更新中断发生与否
    {
	TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除 TIM3 更新中断标志
        if(key_fall_flag == 1) //发生按键按下事件(按键中断发生,在按键中断中设置为1)
        {
            if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == 0) //按键还是按下的
            {			
                if(key_holdon_ms <= 2000)
                {
                    key_holdon_ms++;
                }
		else if(key_holdon_ms > 2000) //按键按下到2000ms就判断长按时间成立,生成长按标志
                {
                    key_holdon_ms = 0;	//清除时间单位
                    short_key_flag = 0; //清短按键标志
                    key_long_down = 1;  //长按键标志置位!!!OK
                    key_fall_flag = 0;  //清按键按下标志
										keyUpFlag = FALSE;  //标记按下
										keyupCnt = 0;
										LED1 = ~LED1;
                }
								//距离上次单击时间在100~500ms之间,则认为发生连击事件
								if((keyupCnt > 300) && (keyupCnt < 500))
								{
									keyupCnt = 0;
									doubleClick = 1;	//标记发生了连击事件!!OK
									BEEP = ~BEEP;
								}
			
            }
            else //当时是按下去的,此时已经释放按键了
            {			
								keyupCnt = 0;
                if(key_holdon_ms > 50) //按下时间大于50ms,生成单击标志
                {
                    key_holdon_ms = 0;
                    short_key_flag = 1;	//标记短按标志!!OK
                    key_long_down = 0;	//清除长按标志
                    key_fall_flag = 0;
										LED0 = ~LED0;
										keyupCnt = 0;
                
										//距离上次单击时间在100~500ms之间,则认为发生连击事件
										if(keyupCnt>100 && keyupCnt<500)
										{ 
											 doubleClick = TRUE;
											 short_key_flag=0;
										} 
										keyUpFlag = TRUE;//单击抬起按键后,生成按键抬起标志 
								}
                else  //按键持续时间小于50ms,忽略
                {
                    key_holdon_ms = 0;//按键按下时间的位
                    short_key_flag = 0;//短按
                    key_long_down = 0;//长按标志
                    key_fall_flag = 0;//按键按下标志
										keyupCnt = 0;
                }
				
            }


        }


        if(keyUpFlag)//单击抬起后,启动计数,计数到500ms
            keyupCnt++;


        if(keyupCnt > 500)
        {
            keyupCnt = 0;
            keyUpFlag = FALSE;//标记为弹起
        }


    }
}

结合第一个文章  看看按键的单 双 长 按的代码

https://pan.baidu.com/s/1gg-1zcC9gRY1CY67qOJpfQ



  • 11
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
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; } } } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值