单片机上的按键检测框架

来源:本站
导读:目前正在解读《单片机上的按键检测框架》的相关信息,《单片机上的按键检测框架》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《单片机上的按键检测框架》的详细说明。
简介:又好久没来写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     else101     {102         //结束判断按的时间103     }104 }

提醒:《单片机上的按键检测框架》最后刷新时间 2024-03-14 01:08:16,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《单片机上的按键检测框架》该内容的真实性请自行鉴别。