• 【C语言】单片机上的按键检测框架


        又好久没来写blog,最近在做项目发现之前写的stm32操作都忘了,还好做了个记录,回来看了下很多忘了的就又知道怎么做了。

        下面是我之前写的一个按键检测的框架,适合比较多的按键操作,从信号接收、滤波、最好处理按键任务,大体上没什么问题,不过没具体测试过到时可能会有bug。

      1 /******************************************************************************
      2 * @file    button.c
      3 * @author  wule
      4 * @version 
      5 * @date    
      6 * @brief   
      7 ******************************************************************************
      8 *
      9 *****************************************************************************/
     10 
     11 typedef unsigned char ButtonSizeType;
     12 
     13 typedef enum{
     14                 RESET = 0,
     15                 SET = !RESET,
     16             }FLAG;
     17 
     18 typedef struct button_bit{
     19     ButtonSizeType button1:1;
     20     ButtonSizeType button2:1;
     21     ButtonSizeType button3:1;
     22     ButtonSizeType button4:1;
     23     ButtonSizeType button5:1;
     24     ButtonSizeType button6:1;
     25     ButtonSizeType button7:1;
     26     ButtonSizeType button8:1;
     27 }ButtonBitType;
     28 
     29 typedef union
     30 {
     31     ButtonBitType button_bit;
     32     ButtonSizeType button;
     33 }ButtonType;
     34 
     35 ButtonType InputFlag;
     36 
     37 //初始化按键标志状态
     38 void Init_Button_Variable(void)
     39 {
     40     InputFlag.button = 0;
     41 }
     42 
     43 //判断函数,读取每个按键的状态
     44 ButtonSizeType ReadButtonBit(void)
     45 {
     46     ButtonType button_bit;
     47     
     48     button_bit.button = 0;
     49     
     50     button_bit.button_bit.button1 = 1;
     51     button_bit.button_bit.button3 = 1;
     52     button_bit.button_bit.button5 = 1;
     53     
     54     return button_bit.button;
     55 }
     56 //滤波,返回值代表当前按键的值
     57 ButtonSizeType Button_Filter(void)
     58 {
     59     ButtonSizeType bf_buf;
     60     static ButtonSizeType bf_pre_buf = 0,bf_backval = 0;
     61     static unsigned char bf_filtercnt = 0;
     62     
     63     bf_buf = ReadButtonBit();
     64 
     65     if(bf_buf != bf_backval && bf_buf == bf_pre_buf)//判断两次是否相同
     66     {
     67         bf_filtercnt ++;
     68         if(bf_filtercnt > 50)//作一个简单的滤波
     69         {
     70             bf_backval = bf_pre_buf;
     71         }
     72     }
     73     else
     74     {
     75         bf_pre_buf = bf_buf;
     76         bf_filtercnt = 0;
     77     }
     78     
     79     return bf_backval;
     80 }
     81 //处在一个时间可控的位置,这里可以实现各种按键的操作
     82 void ButtonTask(void)
     83 {
     84     ButtonType bt_state = Button_Filter();//得到按键状态
     85     
     86     if(InputFlag.button_bit.button1 == 0 && bt_state.button_bit.button1 == 1)
     87     {
     88         //单次触发
     89     }
     90     else if(InputFlag.button_bit.button1 == 1 && bt_state.button_bit.button1 == 0)
     91     {
     92         //单次释放
     93     }
     94     
     95     
     96     if(bt_state.button_bit.button1 == 1)
     97     {
     98         //计时触发
     99     }
    100     else
    101     {
    102         //结束判断按的时间
    103     }
    104 }
  • 相关阅读:
    什么是linux的ftp
    linux安装ftp组件
    菜鸟之linux问题之图形界面和dos界面的登录问题
    linux第一面
    vmware下linux系统的安装过程
    vmware的安装
    装饰器的邪门歪道
    关于任务脚本里面用异步
    写类装饰器的2个小问题
    VUE 与其他常见前端框架对比
  • 原文地址:https://www.cnblogs.com/nixianmin/p/3596563.html
Copyright © 2020-2023  润新知