单片机上的按键检测框架
时间:11-05 09:16 阅读:793次
*温馨提示:点击图片可以放大观看高清大图
简介:又好久没来写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 }