打印
[C语言]

做个了个按键程序的框架,分享讨论下

[复制链接]
1726|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nixianmin|  楼主 | 2014-2-18 17:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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
    {
        //计时结束,判断长短按
    }
}





相关帖子

沙发
nixianmin|  楼主 | 2014-2-18 20:26 | 只看该作者
刚才才发现源码不全,插入代码难道还有限制,现在改好了

使用特权

评论回复
板凳
嵌入式云终端| | 2014-2-18 21:14 | 只看该作者
向你致敬,学习。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:电机控制,TI InstaSpin Foc交流群:335663930

40

主题

431

帖子

6

粉丝