• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

用定时器中断检测按键怎么检测长按

蓝蓝的天 2018-02-08 浏览量:1123
请问高手,用定时器中断检测按键怎么检测长按?谢谢!
1 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • #include "MyKey.h"
    #include "Key.h"
    int lastStat=1;   //记录上一次的按键状态
    int TimeCnt=0;  //记录按键被按下的时长
    int GetKeyValue(int iTime,int * iTimeCnt){
    bool bKeyRet;
    bKeyRet=Key_GetVal();//获取当前状态
    if((lastStat==1)&&(bKeyRet==1))  //如果上一次是高,本次也是高电平,说明按键没有按下。
    {
    return 2; //返回没有按下,此时不用更新上一个状态,因为上一个状态和当前状态一样。
    }else if((lastStat==1)&&(bKeyRet==0))  // 如果上一次是高,本次是低电平,说明按键刚刚被按下。
    {
    TimeCnt=0;  //初始化计时变量
    lastStat=0; //更新上一次变量的状态
    return -1;
    }else if((lastStat==0)&&(bKeyRet==0)) // 如果上一次是低,本次是低电平,说明按键持续被按下中。
    {
    TimeCnt+=iTime;  //按下时累计时间
    *iTimeCnt=TimeCnt;
    return 0;  //此时不用更新上一个状态,因为上一个状态和当前状态一样。
    }else if((lastStat==0)&&(bKeyRet==1))// 如果上一次是低,本次是高电平,说明按键刚刚被释放。
    {
    TimeCnt+=iTime;  //按下时累计时间
    *iTimeCnt=TimeCnt;
    lastStat=1;//更新上一次变量的状态
    return 1;
    }else{  //其他情况

    return -2;
    }
    }
    • 发布于 2018-02-08
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了 :https://www.mouser.com/catalog/additional/Nexperia_6684_REACH_Certificate.pdf 回复

其他答案 数量:5
  • 定义一个10ms的定时器中断,再定义一个计数变量count,假设按键按下电平为0,在10ms定时器中断中检测IO口电平,如果电平为1(按键松开),count=0;如果电平为0,count++。

    在主函数中判断按键逻辑,当count>100(长按了1s)触发长按动作。100可以根据需要修改。

    • 发布于2018-02-08
    • 举报
    • 评论 2
    • 1
    • 0
蓝蓝的天 回复了 赤心木zqw :谢谢!你说的道理我能想明白,可是我还是不知道该怎么写。你能贴出一段代码吗 回复
电子老工程师 回复了  :材质:钢 回复

  • 按键触发中断,不松开按键不会退出中断,用一个变量累加时间,判断这个时间长度,松开按键后处理变量为0退出中断
    • 发布于2018-02-08
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :32位MCU缺货,没有现货替代型号。 回复

  • 对于按键设立定时变量标志Button_press_Tim_Flag,和定时时长变量Button_press_timer,在该按键被按下时,Button_press_Tim_Flag置1,在定时器中检测该标志,若为1,则Button_press_timer累加,在主程序中检测Button_press_timer变量值就可以识别长按与否;反之,若按键松开释放掉,Button_press_Tim_Flag置0,并清掉Button_press_timer,置为0;
    • 发布于2018-02-08
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :T322E686K020AT, KEMET,(替代型号里客户原型号货是最多的) 回复

  • 中断中检测到按下状态后开始计时,等时间长度到了就认为是一个长按
    • 发布于2018-02-08
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :DSS2-60AT2 IXYS 封装:TO-92-3 回复

  • 定时器中断是允许用户设置开中断的时机的,楼主只需要写程序,如果检测到按键按下,立马开始定时就可以了。

    • 发布于2018-02-28
    • 举报
    • 评论 2
    • 0
    • 0
电子老工程师 回复了  :HC32L176JATA-LQ48 HDSC(华大) 回复
电子老工程师 回复了  :STM32L151C6T6A,ST,有货但是内存小,需要跟客户确认 回复

相关问题

问题达人换一批

用定时器中断检测按键怎么检测长按