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



你可能感兴趣的:(STM32按键的短按/长按/双击)