zoukankan      html  css  js  c++  java
  • 单片机按键_长按和短按的一种处理思想

    在写单片机程序的过程中,难免会遇到按键的写法,比如一个按键实现长按,
    短按。本文只针对这些操作说明一下自己按键的思想。可应用到实际工程中。

    按键处理过程:设置一个按键标志,按下时为1,松开时为0,然后每xxms执行这个函数,有按键按下时,计数器+1,然后根据计数的数值做一个判断。
    单次按键需要在松开的时候判断计数器的值,长按的话可以直接判断计数的值到达用户自定义的值即可,详细的程序框架如下:

    流程分析:

    程序框架:

    //参考伪代码
    int main(void)
    {
    ...
    key_flag_old = read_io(GPIO_xx) ? 1:0 ; //判断初始化按键的状态
    ...
    while(1)
    {
    ......
    //是否调用软件定时器
    .......
    }
    }

    void soft_timer() //软件定时器,时间自定
    {
    key_process();//按键处理
    time_sys = clock_time();//在此获取时间,重新计时
    }

    void key_process(void) //按键处理
    {
    key_flag_cur = read_io(GPIO_xx)? 1:0 ; //读取当前按键的状态

    if(key_flag_cur != key_flag_old) //按键按下或者松开检测,按下时,状态一直为1,松开时为0
    {
    key_on = !key_on;
    key_flag_old = key_flag_cur;//把当前状态给旧的状态,以免重复运行该判断
    }

    if(key_on) //单次和长按都可判断
    {
    key_always_cnt++;
    }

    if(key_always_cnt >= n)
    {
    key_always_cnt = 0;
    key_always_process();//长按按键的操作
    }

    if(!key_on && key_always_cnt>0) //按键松开时候进行检测,如果一直按着执行长按,这里也可以写1,可用于消抖
    {
    key_once_process();//单次按键的函数操作
    key_always_cnt = 0;
    }
    }

    如果有什么疑问,欢迎大家讨论,转贴请注明出处,谢谢。

                    ---------cofin_add 

  • 相关阅读:
    python day01学习
    标准化体系建设(下):如何建立基础架构标准化及服务化体系?
    用EL表达式与Java代码的共享数据
    String和StringBuilder的相互转化
    博客园的一个bug_修改文章标签
    int const *p和int *const的区别
    C++ assert()的用法
    java中,为什么char类型数组可以直接用数组名打印,而int型数组打印结果是地址值!
    传说中的栈溢出
    Trello
  • 原文地址:https://www.cnblogs.com/cofin/p/6812022.html
Copyright © 2011-2022 走看看