切换到宽版
  • 11156阅读
  • 17回复

[STM]大家是如何处理按键的长按和短按的呢?stm8s单片机按键长短按识别 [复制链接]

上一主题 下一主题
离线zqharmstudio
 
发帖
1029
M币
4705
专家
24
粉丝
69
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2018-03-03
说一下我的解决办法,抛个砖,期待大佬给个更简单高效的解决办法,一个按键需要区分长按和短按,
就得设置一个短按时间pressShort,一个长按时间pressLong
大于短按时间小于长按时间就是短按
大于长按时间,就是长按
短按可以有提示,先执行,长按后执行。
所以就需要一个定时器,计算按键按下的时间长短
  1. INTERRUPT_HANDLER(TIM3_UPD_OVF_BRK_IRQHandler, 15) //100ms
  2. {
  3.   /* In order to detect unexpected events during development,
  4.      it is recommended to set a breakpoint on the following instruction.
  5.   */
  6.    if(TIM3_GetITStatus(TIM3_IT_UPDATE) == SET )
  7.      {
  8.        TIM3_ClearFlag(TIM3_FLAG_UPDATE);   //清除中断标志
  9.        keyPwrPressedTimeInMs++;
  10.        keyAddPressedTimeInMs++;
  11.        keySubPressedTimeInMs++;
  12.        keyFuncPressedTime_ms++;
  13.      }
  14. }



在程序里边,循环扫描端口电平,按键被按下,先判断一下是不是第一次按下,如果是,就启动定时器,如果不是,就不管了

  1. if(keyAdd==RESET)
  2.       {
  3.         if( keyAddPressed==SET)//判断是否第一次按下
  4.         TIM3_Cmd(ENABLE);//启动定时器
  5.         keyAddPressed=SET;
  6.       
  7.       }
接着再去判断按键有没有按下过,如果已经被按下了,再根据时间用蜂鸣器或者振动电机提示一下,首先进行短按生效的提示,提示一下就可以了

比如蜂鸣器鸣叫时间达到pressShort+100毫秒这样,如果还没松手,关了提示即可
  1. //短按生效提示
  2.         if(keyAddPressedTimeInMs>=pressShort)
  3.         {
  4.           if(keyAddPressedTimeInMs<=pressShort+1)
  5.            beepOn;
  6.           else
  7.             beepOff;
  8.         }

继续计时,如果大于长按时间了,提示一下,然后等待松手就可以了
  1. //长按生效提示
  2.         if(keyAddPressedTimeInMs>=pressLong)
  3.         {
  4.           beepOn;
  5.           timer4Delay( beepingTime);
  6.           beepOff;
  7.           while(keyAdd==RESET);//等待松手
  8.         }
松手之后就可以继续运行了

如果是短按
  1. //短按  里边加需要的功能
  2.           if(keyAddPressedTimeInMs>1&&keyAddPressedTimeInMs<pressShort)
  3.           {
  4.             TIM3_Cmd(DISABLE);//关闭定时器
  5.             keyAddPressedTimeInMs=0;
  6.             
  7.           }
如果是长按
  1. //↑ 长按 。切换到参数设置界面
  2.           if(keyFuncPressedTime_ms>=pressLong)
  3.           {
  4.             keyAddPressed=RESET;
  5.             TIM3_Cmd(DISABLE);//关闭定时器            
  6.             keyAddPressedTimeInMs=0;  
  7.           }
完整的如下
  1. /*↑键长按 进入参数设置界面*/
  2.       if(keyAdd==RESET)
  3.       {
  4.         if( keyAddPressed==SET)//判断是否第一次按下
  5.         TIM3_Cmd(ENABLE);//启动定时器
  6.         keyAddPressed=SET;      
  7.       }      
  8.       if(keyAddPressed==SET)  //如果键按下过,但还没处理过
  9.       {  
  10.         if(keyAddPressedTimeInMs>=pressShort)  //短按生效提示
  11.         {
  12.           if(keyAddPressedTimeInMs<=pressShort+1)  beepOn;
  13.           else     beepOff;
  14.         }  
  15.         if(keyAddPressedTimeInMs>=pressLong)  //长按生效提示
  16.         {
  17.           beepOn; timer4Delay( beepingTime);  beepOff;
  18.           while(keyAdd==RESET);//等待松手
  19.         }
  20.         if(keyAdd!=RESET) //按键松开了
  21.         {          
  22.           keyAddPressed=SET;//清除按键按下标志
  23.           //短按  
  24.           if(keyAddPressedTimeInMs>1&&keyAddPressedTimeInMs<pressShort)
  25.           {
  26.             TIM3_Cmd(DISABLE);//关闭定时器
  27.             keyAddPressedTimeInMs=0;            
  28.           }
  29.           // 长按
  30.           if(keyFuncPressedTime_ms>=pressLong)
  31.           {
  32.             keyAddPressed=RESET;
  33.             TIM3_Cmd(DISABLE);//关闭定时器          
  34.             keyAddPressedTimeInMs=0;        
  35.           }          
  36.         }          
  37.       }
  38.       /*以上是↑键的长短按设置*/









[ 此帖被zqharmstudio在2018-03-03 13:50重新编辑 ]
离线乌兰图婊

发帖
428
M币
9
专家
1
粉丝
5
只看该作者 1楼 发表于: 2018-03-03
请登录后查看
本帖最近打赏记录:共1条打赏 ,M币+8
离线独来独往

发帖
373
M币
2315
专家
13
粉丝
47
只看该作者 2楼 发表于: 2018-03-03
回 乌兰图婊 的帖子
请登录后查看
离线jcdzxh

发帖
1404
M币
8017
专家
9
粉丝
55
只看该作者 3楼 发表于: 2018-03-03
请登录后查看
离线小茅

发帖
2304
M币
1611
专家
6
粉丝
40
只看该作者 4楼 发表于: 2018-03-03
请登录后查看
离线mckk520

发帖
222
M币
1613
专家
9
粉丝
33
只看该作者 5楼 发表于: 2018-03-03
请登录后查看
离线zqharmstudio
发帖
1029
M币
4705
专家
24
粉丝
69
只看该作者 6楼 发表于: 2018-03-03
回 mckk520 的帖子
请登录后查看
离线jmq123

发帖
803
M币
1306
专家
1
粉丝
35
只看该作者 7楼 发表于: 2018-03-03
请登录后查看
离线zqharmstudio
发帖
1029
M币
4705
专家
24
粉丝
69
只看该作者 8楼 发表于: 2018-03-03
回 乌兰图婊 的帖子
请登录后查看
离线2545889167

发帖
13268
M币
20754
专家
302
粉丝
4860
只看该作者 9楼 发表于: 2018-03-03
请登录后查看
快速回复
限80 字节
“新手上路”发帖需审核后才能显示(请认真发帖),达到数码9级后取消此限制
 
上一个 下一个