/***************************************************************************** ** Filename : keyboard_drive.h ** Project : ** Module : ** Processor : ** Date/Time : ** Abstract : ** Contents : ** Author : mingyea ** http : ** mail : ** -------------------------------------------------------------------------- ** ** -------------------------------------------------------------------------- ******************************************************************************/ #ifndef _KEY_DIGITAL_DRIVER_H_ #define _KEY_DIGITAL_DRIVER_H_ /***************************************************************************** * Include Files *****************************************************************************/ #include "common_types.h" #include "common_cfg.h" #include "key_digital_driver_cfg.h" /***************************************************************************** * Defines *****************************************************************************/ //typedef u8 key_digital_key_state_t; typedef u16 key_digital_key_tim_t; typedef enum { KEY_DIGITAL_DRIVER_LOGIC_INIT =0u, KEY_DIGITAL_DRIVER_LOGIC_VALID =1u, }key_digital_driver_logic_level_e; typedef enum { KEY_DIGITAL_DRIVER_DIFF_NULL =0u, //鍵盤無變化 KEY_DIGITAL_DRIVER_DIFF_SURE =1u, //鍵盤有變化 }key_digital_driver_diff_e; typedef enum { KEY_DIGITAL_DRIVER_STATE_UP =0u, //默認是彈起 KEY_DIGITAL_DRIVER_STATE_SHORT_DOWN=1u , //短按 KEY_DIGITAL_DRIVER_STATE_LONG_DOWN=2u , //長按 KEY_DIGITAL_DRIVER_STATE_STICK =3u, //卡住 KEY_DIGITAL_DRIVER_STATE_ERRO =4u, //電汽錯誤 }key_digital_driver_state_e; typedef enum { KEY_DIGITAL_DRIVER_SUBSTATE_INIT =0u, //初始 KEY_DIGITAL_DRIVER_SUBSTATE_UP=1u, //默認是彈起 KEY_DIGITAL_DRIVER_SUBSTATE_ERROR=2u , //異常状態 }key_digital_driver_substate_e; #define KEY_DIGITAL_EVENT_RELEASE 1u #define KEY_DIGITAL_EVENT_PRESSED 2u #define KEY_DIGITAL_EVENT_SHORT_DOWN_RELEASE 4u #define KEY_DIGITAL_EVENT_LONG_DOWN 8u #define KEY_DIGITAL_EVENT_NULL 0u typedef struct { u8 event; #ifndef RAM_OPTIMIZE_EN u8 phy_cur_level; //當前物理電平 u8 phy_pre_level; //上次物理電平 u8 logic_cur_level; //當前邏輯電平 u8 logic_pre_level; //上次邏輯電平 u8 change; //一般用於,state的收化。要結合state使用 u8 state_change; //一般用於,state的收化。要結合state使用 key_digital_driver_substate_e sub_state; //用於輔助的 key_digital_driver_state_e state; //狀態,一般指邏輯,且消抖後的。 key_digital_driver_state_e pre_state; //上一次 key_digital_key_tim_t timecount; //計時 #else u8 phy_cur_level:1; //當前物理電平 u8 phy_pre_level:1; //上次物理電平 u8 logic_cur_level:1; //當前邏輯電平 u8 logic_pre_level:1; //上次邏輯電平 u8 change:1; //一般用於,state的收化。要結合state使用 u8 state_change:1; //一般用於,state的收化。要結合state使用 //u8 res:2; //湊成8bit key_digital_driver_substate_e sub_state:2; //用於輔助的 key_digital_driver_state_e state:4; //狀態,一般指邏輯,且消抖後的。 key_digital_driver_state_e pre_state:4; //上一次 key_digital_key_tim_t timecount; //計時 #endif }key_digital_driver_alone_s; typedef struct { key_digital_driver_alone_s digital_key[KEY_DIGITAL_DRIVER_KEY_TOTAL]; }key_digital_driver_s; /***************************************************************************** * Macros *****************************************************************************/ /***************************************************************************** * Type Defines *****************************************************************************/ /***************************************************************************** *Static Variable *****************************************************************************/ /***************************************************************************** *Global Variable *****************************************************************************/ /***************************************************************************** *Constant *****************************************************************************/ /***************************************************************************** *Function Prototype *****************************************************************************/ void key_digital_driver_init(void); void key_digital_driver_normal_task(void); key_digital_driver_state_e key_digital_driver_get_state(u8 id); u8 key_digital_driver_get_phy_level(u8 id); u8 key_digital_driver_get_logic_level(u8 id); u8 key_digital_driver_get_change(u8 id); key_digital_key_tim_t key_digital_driver_get_timecount(u8 id); u8 key_digital_driver_get_phy_pre_quick(u8 id); void key_digital_driver_quick_scan(void); key_digital_driver_diff_e key_digital_driver_judge_diff_wakeup(void); key_digital_driver_diff_e key_digital_driver_judge_state_wakeup(void); void key_digital_driver_goto_sleep(void); u8 key_digital_driver_get_phy_pre_level(u8 id); u8 key_digital_driver_get_state_change(u8 id); void key_digital_driver_goto_wakeup(void); key_digital_driver_state_e key_digital_driver_get_event(u8 id); #endif /* end __KEY_H */ /***************************************************************************** ** End Of File ******************************************************************************/