Complex key event recognition program (Link Layer)
Complex buttons include single-press events, long-press events, even-press events, and combination of Button events.
This program is a link layer program that processes and recognizes the key information scanned by the key driver layer g_u8keyvalue. (Each digit of g_u8keyvalue represents a key)
The single-press event is determined when the key is released. When other buttons reach the specified time, the corresponding button event is triggered.
Macro definition:
// Macro defines the bit value when each key is pressed # define defaults 0x00 # define key_event_clock_click 0x01 # define key_event_down_click 0x02 # define defaults 0x04 # define key_event_lock_click 0x08 # define key_event_onoff_click 0x10 # define 1_0x20 # define key_event_up_click 0x40 # define key_event_timing_click 0x80 # define 1_0xff // long press the flag // key combination # define limit 0x60 # define key_event_setting_onoff_click 0x30 # define defaults 0x46 # define key_press_time 80 // time for pressing single-button events # define key_single_time 1000 u8 g_u8keyvalue;
/*************************************** **************************************** # Function: link_keytrans # Description: press the key to convert g_u8keyvalue to the key value scanned by the key, which indicates whether the corresponding key is pressed at the time # parameter: NULL # Return: NULL # authoranddata: huangzhigang 20140716 ************************************** **************************************** */void link_keytrans (void) {static uint8_t keybackup = key_event_null_click; // key-value backup stat IC timer_t keydelaytime; app_timebase (ms_base, & keydelaytime); If (g_u8keyvalue = key_event_setting_up_click) // set + upper key combination 3 s {If (keybackup = key_event_setting_click | keybackup = key_event_up_click) & keydelaytime. delaytime <= 500) {keybackup = key_event_setting_up_click; keydelaytime. delaytime = 0;} else if (keydelaytime. delaytime> = 3000 & keybackup = key_event_setting_up_click) {keydelaytim E. delaytime = 0; g_keyevent = keyvaluesettingup3s; keybackup = key_event_long_key_click ;}} else if (g_u8keyvalue = key_event_setting_onoff_click) // set + switch key combination 5s {If (keybackup = key_event_setting_click | keybackup = key_event_onoff_click) & keydelaytime. delaytime <= 500) {keybackup = key_event_setting_onoff_click; keydelaytime. delaytime = 0;} else if (keydelaytime. delaytime> = 5000 & keyback Up = key_event_setting_onoff_click) {keydelaytime. delaytime = 0; g_keyevent = keyvaluesettingonoff5s; keybackup = key_event_long_key_click;} else if (g_u8keyvalue = key_event_mode_up_down_click) // mode + up + down key combination 3 s {If (keybackup = key_event_mode_click | keybackup = key_event_up_click | keybackup = key_event_down_click) & keydelaytime. delaytime <= 500) {keybackup = key_event_mode_up _ Down_click; keydelaytime. delaytime = 0;} else if (keydelaytime. delaytime> = 3000 & keybackup = key_event_mode_up_down_click) {keydelaytime. delaytime = 0; g_keyevent = keyvaluemodeupdown3s; keybackup = key_event_long_key_click ;}} else if (g_u8keyvalue = key_event_onoff_click &&(! Keybackup | keybackup = key_event_onoff_click) // long press the Onoff key for 1 s {keybackup = key_event_onoff_click; If (keydelaytime. delaytime> = 1000) {// Onoff key long press the 1 s condition to establish g_keyevent = keyvalueonoff1s; keybackup = key_event_long_key_click;} else if (g_u8keyvalue = key_event_lock_click &&(! Keybackup | keybackup = key_event_lock_click) // press the lock key for 1 s {keybackup = key_event_lock_click; If (keydelaytime. delaytime> = 1000) {// Lock key length by 1 s condition g_keyevent = keyvaluelock1s; keybackup = key_event_long_key_click;} else if (g_u8keyvalue = key_event_up_click &&(! Keybackup | keybackup = key_event_up_click) // up long press {keybackup = key_event_up_click; If (g_systemdisplaystatus! = Maininterface) // you can even press {If (keydelaytime. delaytime & gt; = 1000) {g_b1updownlongpressflag = 1; g_keyevent = keyvalueup; keydelaytime. delaytime = 0;} else if (keydelaytime. delaytime> = 250 & g_b1updownlongpressflag) // the value of one second equals to four times. {g_keyevent = keyvalueup; keydelaytime. delaytime = 0 ;}} else if (g_systemdisplaystatus = maininterface) // you can set the mode status on the main interface {If (g_b1onoffstatusflag) {If (keydelaytime. de Laytime> = 3000) // press 3 s {g_keyevent = keyvalueup3s; keybackup = key_event_long_key_click;} else {If (keydelaytime. delaytime> = 10000) // press 10 s {g_keyevent = keyvalueup10s; keybackup = key_event_long_key_click ;}}} else if (g_u8keyvalue = key_event_down_click &&(! Keybackup | keybackup = key_event_down_click) // press {keybackup = key_event_down_click in the down mode. If (g_systemdisplaystatus! = Maininterface) {If (keydelaytime. delaytime> = 1000) {g_b1updownlongpressflag = 1; g_keyevent = keyvaluedown; keydelaytime. delaytime = 0;} else if (keydelaytime. delaytime> = 250 & g_b1updownlongpressflag) // the value of one second equals to four times. {g_keyevent = keyvaluedown; keydelaytime. delaytime = 0 ;}} else if (g_u8keyvalue = key_event_mode_click &&(! Keybackup | keybackup = key_event_mode_click) // mode long press 3 s {keybackup = key_event_mode_click; If (keydelaytime. delaytime> = 3000) {g_keyevent = keyvaluemode3s; keybackup = key_event_long_key_click ;}} else if (g_u8keyvalue = key_event_clock_click &&(! Keybackup | keybackup = key_event_clock_click) // clock long press 3 s {keybackup = key_event_clock_click; If (keydelaytime. delaytime> = 3000) {g_keyevent = keyvalueclock3s; keybackup = key_event_long_key_click ;}} else if (g_u8keyvalue = key_event_setting_click &&(! Keybackup | keybackup = key_event_setting_click) // setting long press 3 s {keybackup = key_event_setting_click; If (keydelaytime. delaytime >=3000) {g_keyevent = keyvaluesetting3s; keybackup = key_event_long_key_click ;}} else if (g_u8keyvalue = key_event_timing_click &&(! Keybackup) // timing single key {keybackup = key_event_timing_click;} else if (g_u8keyvalue = key_event_null_click) // The keybackup button {Switch (keybackup) {Case key_event_up_click: if (g_b1updownlongpressflag = 1) {g_b1updownlongpressflag = 0; g_b1buzzeronflag = 1;} else if (keydelaytime. delaytime> key_press_time & keydelaytime. delaytime <key_single_time) // ^ single-key press {// the single-key press condition is: g_keyevent = keyvalueup;} keybackup = key_event_null_click; keydelaytime. delaytime = 0; break; Case key_event_down_click: If (g_b1updownlongpressflag = 1) {g_b1updownlongpressflag = 0; g_b1buzzeronflag = 1;} else if (keydelaytime. delaytime> key_press_time & keydelaytime. delaytime <key_single_time) // press {// The single key press the condition g_keyevent = keyvaluedown;} keybackup = key_event_null_click; keydelaytime. delaytime = 0; break; Case key_event_onoff_click: If (keydelaytime. delaytime> key_press_time & keydelaytime. delaytime <key_single_time) // Onoff a single key {g_keyevent = keyvalueonoff;} keybackup = key_event_null_click; keydelaytime. delaytime = 0; break; Case key_event_mode_click: If (keydelaytime. delaytime> key_press_time & keydelaytime. delaytime <key_single_time) // mode press {// The single key press the condition g_keyevent = keyvaluemode;} keybackup = key_event_null_click; keydelaytime. delaytime = 0; break; Case key_event_clock_click: If (keydelaytime. delaytime> key_press_time & keydelaytime. delaytime <key_single_time) // clock single-key press {// the single-key press condition is: g_keyevent = keyvalueclock;} keybackup = key_event_null_click; keydelaytime. delaytime = 0; break; Case key_event_setting_click: If (keydelaytime. delaytime> key_press_time & keydelaytime. delaytime <key_single_time) // setting single-key press {// single-key press condition g_keyevent = keyvaluesetting;} keybackup = key_event_null_click; keydelaytime. delaytime = 0; break; Case key_event_lock_click: If (keydelaytime. delaytime> key_press_time & keydelaytime. delaytime <key_single_time) // lock the single key press {// The single key press the condition g_keyevent = keyvaluelock;} keybackup = key_event_null_click; keydelaytime. delaytime = 0; break; Case key_event_timing_click: If (keydelaytime. delaytime> key_press_time & keydelaytime. delaytime <key_single_time) // timing single key press {// single key press the condition to establish g_keyevent = keyvaluetiming;} keydelaytime. delaytime = 0; keybackup = key_event_null_click; break; case when: // all long-pressed keys exit this state as keybackup = key_event_null_click; break; default: keybackup = key_event_null_click; keydelaytime. delaytime = 0; g_keyevent = keyvaluenull; break ;}}}
Key value conversion-complex key event recognition program (Link Layer)