• 单片机按键_长按和短按的一种处理思想


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

    按键处理过程:设置一个按键标志,按下时为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 

  • 相关阅读:
    ASP.NET 2.0 X64的奇怪问题
    【分享】从网上爬的WPF学习资料
    大家一起学习less 5:字符串插值
    大家一起学习less 3:命名空间
    我的模块加载系统 v18
    大家一起学习less 2:自带函数
    “计算机之子”的MVVM框架源码学习笔记
    我的MVVM框架 v0.1发布
    大家一起学习less 6:一些有用的混合函数
    less源码学习
  • 原文地址:https://www.cnblogs.com/cofin/p/6812022.html
Copyright © 2020-2023  润新知