button.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #ifndef BUTTON_H
  2. #define BUTTON_H
  3. #include "include.h"
  4. #define BTN_NAME_MAX 32 //名字最大为32字节
  5. /* 按键消抖时间40ms, 建议调用周期为20ms
  6. 只有连续检测到40ms状态不变才认为有效,包括弹起和按下两种事件
  7. */
  8. #define CONTINUOS_TRIGGER 0 //是否支持连续触发,连发的话就不要检测单双击与长按了
  9. /* 是否支持单击&双击同时存在触发,如果选择开启宏定义的话,单双击都回调,只不过单击会延迟响应,
  10. 因为必须判断单击之后是否触发了双击否则,延迟时间是双击间隔时间 BUTTON_DOUBLE_TIME。
  11. 而如果不开启这个宏定义,建议工程中只存在单击/双击中的一个,否则,在双击响应的时候会触发一次单击,
  12. 因为双击必须是有一次按下并且释放之后才产生的 */
  13. #define SINGLE_AND_DOUBLE_TRIGGER 1
  14. /* 是否支持长按释放才触发,如果打开这个宏定义,那么长按释放之后才触发单次长按,
  15. 否则在长按指定时间就一直触发长按,触发周期由 BUTTON_LONG_CYCLE 决定 */
  16. #define LONG_FREE_TRIGGER 0
  17. #define BUTTON_DEBOUNCE_TIME 2 //消抖时间 (n-1)*调用周期
  18. #define BUTTON_CONTINUOS_CYCLE 1 //连按触发周期时间 (n-1)*调用周期
  19. #define BUTTON_LONG_CYCLE 1 //长按触发周期时间 (n-1)*调用周期
  20. #define BUTTON_DOUBLE_TIME 15 //双击间隔时间 (n-1)*调用周期 建议在200-600ms
  21. #define BUTTON_LONG_TIME 50 /* 持续n秒((n-1)*调用周期 ms),认为长按事件 */
  22. #define TRIGGER_CB(event) \
  23. if(btn->CallBack_Function[event]) \
  24. btn->CallBack_Function[event]((Button_t*)btn)
  25. typedef void (*Button_CallBack)(void*); /* 按键触发回调函数,需要用户实现 */
  26. typedef enum {
  27. BUTTON_DOWM = 0,
  28. BUTTON_UP,
  29. BUTTON_DOUBLE,
  30. BUTTON_LONG,
  31. BUTTON_LONG_FREE,
  32. BUTTON_CONTINUOS,
  33. BUTTON_CONTINUOS_FREE,
  34. BUTTON_ALL_RIGGER,
  35. number_of_event, /* 触发回调的事件 */
  36. NONE_TRIGGER
  37. }Button_Event;
  38. /*
  39. 每个按键对应1个全局的结构体变量。
  40. 其成员变量是实现滤波和多种按键状态所必须的
  41. */
  42. typedef struct button
  43. {
  44. /* 下面是一个函数指针,指向判断按键手否按下的函数 */
  45. uint8_t (*Read_Button_Level)(void); /* 读取按键电平函数,需要用户实现 */
  46. char Name[BTN_NAME_MAX];
  47. uint8_t Button_State : 4; /* 按键当前状态(按下还是弹起) */
  48. uint8_t Button_Last_State : 4; /* 上一次的按键状态,用于判断双击 */
  49. uint8_t Button_Trigger_Level : 2; /* 按键触发电平 */
  50. uint8_t Button_Last_Level : 2; /* 按键当前电平 */
  51. uint8_t Button_Trigger_Event; /* 按键触发事件,单击,双击,长按等 */
  52. Button_CallBack CallBack_Function[number_of_event];
  53. uint8_t Button_Cycle; /* 连续按键周期 */
  54. uint8_t Timer_Count; /* 计时 */
  55. uint8_t Debounce_Time; /* 消抖时间 */
  56. uint8_t Long_Time; /* 按键按下持续时间 */
  57. struct button *Next;
  58. }Button_t;
  59. /* 供外部调用的函数声明 */
  60. void Button_Create(const char *name,
  61. Button_t *btn,
  62. uint8_t(*read_btn_level)(void),
  63. uint8_t btn_trigger_level);
  64. void Button_Attach(Button_t *btn,Button_Event btn_event,Button_CallBack btn_callback);
  65. void Button_Cycle_Process(Button_t *btn);
  66. void Button_Process(void);
  67. void Button_Delete(Button_t *btn);
  68. void Search_Button(void);
  69. void Get_Button_EventInfo(Button_t *btn);
  70. uint8_t Get_Button_Event(Button_t *btn);
  71. uint8_t Get_Button_State(Button_t *btn);
  72. void Button_Process_CallBack(void *btn);
  73. #endif