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 

  • 相关阅读:
    使用DragonFly进行智能镜像分发
    Operator部署Prometheus
    kubernetes中部署Jenkins并简单使用
    kubernetes常用控制器之DaemonSet
    kubernetes中部署nacos
    selenium自动化操作
    BeautifulSoup爬取网页分页
    细品BeautifulSoup节点访问
    再端一碗BeautifulSoup
    初试爬虫
  • 原文地址:https://www.cnblogs.com/cofin/p/6812022.html
Copyright © 2011-2022 走看看