• 单片机模块化程序: 看看是不是你想要的按键处理


    一,看看是不是你的菜

    按键处理原则上必须遵循:

    1,不可以有硬延时,消抖用变量++或者硬件处理掉!

    2,多按键预防卡键,有一个按键不好使了,不能影响其它按键工作!

    /**
      ******************************************************************************
      * @file    key.c
      * @author  fengwu yang
      * @version V1.0.0
      * @date    2019/10/12
      * @brief   按键检测模板
      ******************************************************************************
      一,使用说明:检测引脚(PB5)
            1,把以下程序放在1ms定时器中断中
                if(KeySmartConfig[1])
                    KeySmartConfig[5]++;
                else
                    KeySmartConfig[5]=0;
    
                if(KeySmartConfig[2])
                    KeySmartConfig[6]++;
                else
                    KeySmartConfig[6]=0;
            
            2,主循环调用使用
                while(1)
                {
                    SmartConfigKey();
                    
                    //例1:检测到按键按下执行某段代码
                    if(KeySmartConfig[3] == 1)
                    {
                        KeySmartConfig[3] = 0;//清零以后,只有按键松开再按下的时候才会进入
                        //执行的代码
                    }
    
                    //例2:检测到按键按下,然后根据按下时间执行某段代码
                    if(KeySmartConfig[3] == 1)
                    {
                        if(KeySmartConfig[5]>=3000)//按下时间大于3S
                        {
                            KeySmartConfig[3] = 0;//清零以后,只有按键松开再按下的时候才会进入
                            //执行的代码
                        }
                    }
                    
                    //例3:检测到按键松开执行某段代码
                    if(KeySmartConfig[4] == 1)
                    {
                        KeySmartConfig[4] = 0;//清零以后,只有按键按下然后松开的时候才会进入
                        //执行的代码
                    }
                    
                    //例4:检测到按键松开,然后根据松开时间执行某段代码
                    if(KeySmartConfig[4] == 1)
                    {
                        if(KeySmartConfig[6]>=3000)//松开时间大于3S
                        {
                            KeySmartConfig[4] = 0;//清零以后,只有按键按下再松开的时候才会进入
                            //执行的代码
                        }
                    }
                }
      ******************************************************************************
      */
    
    #define __KEY_C_
    #include "include.h"
    
    int KeySmartConfig[7]={0};//消抖变量 按下标记 松开标记 按下标记拷贝  松开标记拷贝 按下时间(Ms) 松开时间(Ms)
        
    /**
    * @brief  按键处理
    * @param  
    * @param  None
    * @param  None
    * @retval None
    * @example 
    **/
    void SmartConfigKey(void)
    {
      if(SmartConfigKeyPinIn == KeySmartConfigDown)
        {
            if(KeySmartConfig[1] == 0)
            {
                KeySmartConfig[0]++;
                if(KeySmartConfig[0]>=500)//按下以后进入
                {
                    KeySmartConfig[0] = 0;//Cnt
                    KeySmartConfig[2] = 0;//UP
                    KeySmartConfig[1] = 1;//Down
                    KeySmartConfig[3] = 1;//DownCopy
                    KeySmartConfig[4] = 0;//UpCopy
                }
            }
        }
        else
        {
            KeySmartConfig[0]++;
            if(KeySmartConfig[0]>2000)
            {
                KeySmartConfig[0]=0;
                if(KeySmartConfig[1]==1)//按下后松开后进入
                {
                    KeySmartConfig[2] = 1;//UP
                    KeySmartConfig[1] = 0;//Down
                    KeySmartConfig[3] = 0;//DownCopy
                    KeySmartConfig[4] = 1;//UpCopy
                }
            }
        }
    }
    #ifndef __KEY_H_
    #define __KEY_H_
    #include "stm32f10x.h"
    #ifndef __KEY_C_
    #define __KEY_C_  extern
    #else 
    #define __KEY_C_
    #endif
    
    
    #define KeySmartConfigDown 0  //0- 低电平认为是按下  1-高电平认为是按下
    #define SmartConfigKeyPinIn PBin(5)  //检测的按键引脚
    __KEY_C_ int KeySmartConfig[7];//消抖变量 按下标记 松开标记 按下标记拷贝  松开标记拷贝 按下时间(Ms) 松开时间(Ms)
    void SmartConfigKey(void);
        
    #endif

    二,添加文件到工程

    二,.h 包含

     

    演示视频

    https://qqqqqbucket.oss-cn-beijing.aliyuncs.com/%E5%8D%95%E7%89%87%E6%9C%BA%E6%A8%A1%E5%9D%97%E5%8C%96%E7%A8%8B%E5%BA%8F/%E7%9C%8B%E7%9C%8B%E6%98%AF%E4%B8%8D%E6%98%AF%E4%BD%A0%E6%83%B3%E8%A6%81%E7%9A%84%E6%8C%89%E9%94%AE%E5%A4%84%E7%90%86/20191014_021028.mp4

  • 相关阅读:
    C#文件拖放至窗口的ListView控件获取文件类型
    android内存释放处理
    赵雅智_运用Bitmap和Canvas实现图片显示,缩小,旋转,水印
    POJ 3070 Fibonacci 矩阵高速求法
    poj 3261 后缀数组 找反复出现k次的子串(子串能够重叠)
    Codeforces Round #313 C. Gerald's Hexagon(放三角形)
    HTTP服务端JSON服务端
    iPad popView封装
    OpenCv 人脸检測的学习
    《深入理解java虚拟机》:类的初始化
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/11669354.html
Copyright © 2020-2023  润新知