本帖最后由 nixianmin 于 2014-2-18 20:25 编辑
最近在之前的程序上增加按键和功能,发现如果有个好的框架那么加个按键功能分分钟的事,如果框架不好的话,那是有点浪费时间,再说凑出来的代码结构也感觉不行,自己之前用的框架发现加几个功能结果出界了,晕倒,现在花了一个下午的时间写了个类似的框架,没测试过,不过按照这个思路应该是没什么问题的,我现在写的一个项目中就是用这种思路,大家讨论下有没啥问题??
- typedef unsigned char ButtonSizeType;
- typedef enum{
- RESET = 0,
- SET = !RESET,
- }FLAG;
- typedef struct button_bit{
- ButtonSizeType button1:1;
- ButtonSizeType button2:1;
- ButtonSizeType button3:1;
- ButtonSizeType button4:1;
- ButtonSizeType button5:1;
- ButtonSizeType button6:1;
- ButtonSizeType button7:1;
- ButtonSizeType button8:1;
- }ButtonBitType;
- typedef union
- {
- ButtonBitType button_bit;
- ButtonSizeType button;
- }ButtonType;
- ButtonType InputFlag;
- //初始化按键标志状态
- void Init_Button_Variable(void)
- {
- InputFlag.button = 0;
- }
- //判断函数,读取每个按键的状态
- ButtonSizeType ReadButtonBit(void)
- {
- ButtonType button_bit;
-
- button_bit.button = 0;
-
- button_bit.button_bit.button1 = 1;
- button_bit.button_bit.button3 = 1;
- button_bit.button_bit.button5 = 1;
-
- return button_bit.button;
- }
- //滤波,返回值代表当前按键的值
- ButtonSizeType Button_Filter(void)
- {
- ButtonSizeType bf_buf;
- static ButtonSizeType bf_pre_buf = 0,bf_backval = 0;
- static unsigned char bf_filtercnt = 0;
-
- bf_buf = ReadButtonBit();
- if(bf_buf == bf_pre_buf)//判断两次是否相同
- {
- bf_filtercnt ++;
- if(bf_filtercnt > 50)//作一个简单的滤波
- {
- bf_backval = bf_pre_buf;
- }
- }
- else
- {
- bf_pre_buf = bf_buf;
- bf_filtercnt = 0;
- }
-
- return bf_backval;
- }
- //处在一个时间可控的位置,这里可以实现各种按键的操作
- void ButtonTask(void)
- {
- ButtonType bt_state = Button_Filter();//得到按键状态
- //单次触发
- if(InputFlag.button_bit.button1 == 0 && bt_state.button_bit.button1 == 1)
- {
- ;
- }
- else if(InputFlag.button_bit.button1 == 1 && bt_state.button_bit.button1 == 0)
- {
- ;
- }
-
-
- if(bt_state.button_bit.button1 == 1)
- {
- //这里做个计时
- }
- else
- {
- //计时结束,判断长短按
- }
- }
|