[C语言] 做个了个按键程序的框架,分享讨论下

[复制链接]
 楼主| nixianmin 发表于 2014-2-18 17:27 | 显示全部楼层 |阅读模式
本帖最后由 nixianmin 于 2014-2-18 20:25 编辑

    最近在之前的程序上增加按键和功能,发现如果有个好的框架那么加个按键功能分分钟的事,如果框架不好的话,那是有点浪费时间,再说凑出来的代码结构也感觉不行,自己之前用的框架发现加几个功能结果出界了,晕倒,现在花了一个下午的时间写了个类似的框架,没测试过,不过按照这个思路应该是没什么问题的,我现在写的一个项目中就是用这种思路,大家讨论下有没啥问题??
  1. typedef unsigned char ButtonSizeType;

  2. typedef enum{
  3.                 RESET = 0,
  4.                 SET = !RESET,
  5.             }FLAG;

  6. typedef struct button_bit{
  7.     ButtonSizeType button1:1;
  8.     ButtonSizeType button2:1;
  9.     ButtonSizeType button3:1;
  10.     ButtonSizeType button4:1;
  11.     ButtonSizeType button5:1;
  12.     ButtonSizeType button6:1;
  13.     ButtonSizeType button7:1;
  14.     ButtonSizeType button8:1;
  15. }ButtonBitType;

  16. typedef union
  17. {
  18.     ButtonBitType button_bit;
  19.     ButtonSizeType button;
  20. }ButtonType;

  21. ButtonType InputFlag;

  22. //初始化按键标志状态
  23. void Init_Button_Variable(void)
  24. {
  25.     InputFlag.button = 0;
  26. }

  27. //判断函数,读取每个按键的状态
  28. ButtonSizeType ReadButtonBit(void)
  29. {
  30.     ButtonType button_bit;
  31.    
  32.     button_bit.button = 0;
  33.    
  34.     button_bit.button_bit.button1 = 1;
  35.     button_bit.button_bit.button3 = 1;
  36.     button_bit.button_bit.button5 = 1;
  37.    
  38.     return button_bit.button;
  39. }
  40. //滤波,返回值代表当前按键的值
  41. ButtonSizeType Button_Filter(void)
  42. {
  43.     ButtonSizeType bf_buf;
  44.     static ButtonSizeType bf_pre_buf = 0,bf_backval = 0;
  45.     static unsigned char bf_filtercnt = 0;
  46.    
  47.     bf_buf = ReadButtonBit();

  48.     if(bf_buf == bf_pre_buf)//判断两次是否相同
  49.     {
  50.         bf_filtercnt ++;
  51.         if(bf_filtercnt > 50)//作一个简单的滤波
  52.         {
  53.             bf_backval = bf_pre_buf;
  54.         }
  55.     }
  56.     else
  57.     {
  58.         bf_pre_buf = bf_buf;
  59.         bf_filtercnt = 0;
  60.     }
  61.    
  62.     return bf_backval;
  63. }
  64. //处在一个时间可控的位置,这里可以实现各种按键的操作
  65. void ButtonTask(void)
  66. {
  67.     ButtonType bt_state = Button_Filter();//得到按键状态
  68.     //单次触发
  69.     if(InputFlag.button_bit.button1 == 0 && bt_state.button_bit.button1 == 1)
  70.     {
  71.         ;
  72.     }
  73.     else if(InputFlag.button_bit.button1 == 1 && bt_state.button_bit.button1 == 0)
  74.     {
  75.         ;
  76.     }
  77.    
  78.    
  79.     if(bt_state.button_bit.button1 == 1)
  80.     {
  81.         //这里做个计时
  82.     }
  83.     else
  84.     {
  85.         //计时结束,判断长短按
  86.     }
  87. }





 楼主| nixianmin 发表于 2014-2-18 20:26 | 显示全部楼层
刚才才发现源码不全,插入代码难道还有限制,现在改好了
嵌入式云终端 发表于 2014-2-18 21:14 | 显示全部楼层
向你致敬,学习。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

40

主题

431

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部