本帖最后由 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
{
//计时结束,判断长短按
}
}
|