按键的短按/长按/双击


上一篇文章已经写好了定时器。

现在狭隘的用一下:

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





















猜你喜欢

转载自blog.csdn.net/weixin_42381351/article/details/80596309
今日推荐