Key value conversion-complex key event recognition program (Link Layer)

Source: Internet
Author: User

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)

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.