说一下我的解决办法,抛个砖,期待大佬给个更简单高效的解决办法,一个按键需要区分长按和短按,
就得设置一个短按时间pressShort,一个长按时间pressLong
大于短按时间小于长按时间就是短按大于长按时间,就是长按短按可以有提示,先执行,长按后执行。所以就需要一个
定时器,计算按键按下的时间长短- INTERRUPT_HANDLER(TIM3_UPD_OVF_BRK_IRQHandler, 15) //100ms
- {
- /* In order to detect unexpected events during development,
- it is recommended to set a breakpoint on the following instruction.
- */
- if(TIM3_GetITStatus(TIM3_IT_UPDATE) == SET )
- {
- TIM3_ClearFlag(TIM3_FLAG_UPDATE); //清除中断标志
-
- keyPwrPressedTimeInMs++;
- keyAddPressedTimeInMs++;
- keySubPressedTimeInMs++;
- keyFuncPressedTime_ms++;
-
- }
- }
在程序里边,循环扫描端口电平,按键被按下,先判断一下是不是第一次按下,如果是,就启动定时器,如果不是,就不管了
- if(keyAdd==RESET)
- {
- if( keyAddPressed==SET)//判断是否第一次按下
- TIM3_Cmd(ENABLE);//启动定时器
- keyAddPressed=SET;
-
- }
接着再去判断按键有没有按下过,如果已经被按下了,再根据时间用蜂鸣器或者振动电机提示一下,首先进行短按生效的提示,提示一下就可以了
比如蜂鸣器鸣叫时间达到pressShort+100毫秒这样,如果还没松手,关了提示即可
- //短按生效提示
- if(keyAddPressedTimeInMs>=pressShort)
- {
- if(keyAddPressedTimeInMs<=pressShort+1)
- beepOn;
- else
- beepOff;
- }
继续计时,如果大于长按时间了,提示一下,然后等待松手就可以了
- //长按生效提示
- if(keyAddPressedTimeInMs>=pressLong)
- {
- beepOn;
- timer4Delay( beepingTime);
- beepOff;
- while(keyAdd==RESET);//等待松手
- }
松手之后就可以继续运行了
如果是短按
- //短按 里边加需要的功能
- if(keyAddPressedTimeInMs>1&&keyAddPressedTimeInMs<pressShort)
- {
- TIM3_Cmd(DISABLE);//关闭定时器
- keyAddPressedTimeInMs=0;
-
- }
如果是长按
- //↑ 长按 。切换到参数设置界面
- if(keyFuncPressedTime_ms>=pressLong)
- {
- keyAddPressed=RESET;
- TIM3_Cmd(DISABLE);//关闭定时器
- keyAddPressedTimeInMs=0;
- }
完整的如下
- /*↑键长按 进入参数设置界面*/
- if(keyAdd==RESET)
- {
- if( keyAddPressed==SET)//判断是否第一次按下
- TIM3_Cmd(ENABLE);//启动定时器
- keyAddPressed=SET;
- }
- if(keyAddPressed==SET) //如果键按下过,但还没处理过
- {
- if(keyAddPressedTimeInMs>=pressShort) //短按生效提示
- {
- if(keyAddPressedTimeInMs<=pressShort+1) beepOn;
- else beepOff;
- }
- if(keyAddPressedTimeInMs>=pressLong) //长按生效提示
- {
- beepOn; timer4Delay( beepingTime); beepOff;
- while(keyAdd==RESET);//等待松手
- }
- if(keyAdd!=RESET) //按键松开了
- {
- keyAddPressed=SET;//清除按键按下标志
- //短按
- if(keyAddPressedTimeInMs>1&&keyAddPressedTimeInMs<pressShort)
- {
- TIM3_Cmd(DISABLE);//关闭定时器
- keyAddPressedTimeInMs=0;
- }
- // 长按
- if(keyFuncPressedTime_ms>=pressLong)
- {
- keyAddPressed=RESET;
- TIM3_Cmd(DISABLE);//关闭定时器
- keyAddPressedTimeInMs=0;
- }
- }
- }
- /*以上是↑键的长短按设置*/
[ 此帖被zqharmstudio在2018-03-03 13:50重新编辑 ]