| #include "keypad.h" |
| #include "string.h" |
| #include "../supwisdom/sp_util.h" |
| #include "drv_adc.h" |
| //#include "timer.h" |
| //#include "Include_All.H" |
| //#include "glcd.h" |
| //#include "dbg.h" |
| |
| #define __key_dbg_en__ 0 |
| #if(__key_dbg_en__) |
| #define key_dbg(...) dbg(__VA_ARGS__) |
| #else |
| #define key_dbg(...) |
| #endif |
| |
| #define KEY_DOWN_THRESHOLD 300u |
| #define KEY_UP_THRESHOLD 100u |
| |
| struct key_sta_t |
| { |
| volatile uint16_t adc_val_pre; |
| volatile uint16_t adc_val_last; |
| volatile uint16_t adc_val_now; |
| volatile uint16_t down_timer; |
| volatile uint8_t adc_chg_cnt; |
| volatile uint8_t is_pressed; |
| volatile uint8_t is_pressed_long; |
| volatile uint8_t long_pressed_timer; |
| }; |
| |
| struct |
| { |
| volatile uint8_t is_inited; |
| volatile uint8_t lock; |
| volatile uint16_t key_value; |
| struct key_sta_t key_sta[MAX_KEY_NUM]; |
| } keypad; |
| |
| uint8_t keypad_init(void) |
| { |
| uint8_t i; |
| |
| keypad.is_inited = 0; |
| memset(&keypad, 0, sizeof(keypad)); |
| Delay_ms(500); |
| for(i=0; i<MAX_KEY_NUM; i++) |
| { |
| keypad.key_sta[i].adc_val_pre = adc_get_val(i); |
| } |
| keypad.is_inited = 1; |
| return 0; |
| } |
| |
| __weak void keypad_cb_on_preesed(uint8_t key_val) |
| { |
| |
| } |
| |
| uint8_t keypad_get_key(void) |
| { |
| if(keypad.key_value != KEY_NONE) |
| { |
| uint8_t temp = keypad.key_value; |
| |
| keypad.key_value = KEY_NONE; |
| keypad_cb_on_preesed(temp); |
| return temp; |
| } |
| return KEY_NONE; |
| } |
| |
| void keypad_scan(void) |
| { |
| uint8_t i; |
| uint16_t max_delt = 0; |
| uint8_t key_idx = MAX_KEY_NUM; |
| |
| key_dbg("\r\nsys_tick:%u\r\n", sys_timer_tick); |
| for(i=0; i<MAX_KEY_NUM; i++) |
| { |
| keypad.key_sta[i].adc_val_now = adc_get_val(i); |
| if(keypad.key_sta[i].adc_val_pre == 0) |
| { |
| keypad.key_sta[i].adc_val_pre = adc_get_val(i); |
| return; |
| } |
| if(keypad.key_sta[i].adc_val_last == 0) |
| { |
| keypad.key_sta[i].adc_val_last = adc_get_val(i); |
| return; |
| } |
| |
| if(keypad.key_sta[i].down_timer) |
| { |
| keypad.key_sta[i].down_timer --; |
| if(!keypad.key_sta[i].down_timer) |
| { |
| keypad.key_sta[i].is_pressed = 0; |
| keypad.key_value = i+1; |
| keypad.key_sta[i].adc_val_last = keypad.key_sta[i].adc_val_now; |
| keypad.key_sta[i].adc_val_pre = keypad.key_sta[i].adc_val_now; |
| keypad.lock = 0; |
| } |
| } |
| |
| if((keypad.key_sta[i].adc_val_now > keypad.key_sta[i].adc_val_last)&&(!keypad.key_sta[i].is_pressed)&&(!keypad.lock)) |
| { |
| uint16_t temp_delt = keypad.key_sta[i].adc_val_now - keypad.key_sta[i].adc_val_last; |
| |
| if(temp_delt > KEY_DOWN_THRESHOLD) |
| { |
| if(keypad.key_sta[i].adc_chg_cnt<10) |
| { |
| keypad.key_sta[i].adc_chg_cnt ++; |
| } |
| |
| if(temp_delt>max_delt) |
| { |
| max_delt = temp_delt; |
| key_idx = i; |
| } |
| else |
| { |
| keypad.key_sta[i].adc_chg_cnt = 0; |
| } |
| } |
| else |
| { |
| keypad.key_sta[i].adc_val_last = keypad.key_sta[i].adc_val_pre; |
| keypad.key_sta[i].adc_val_pre = keypad.key_sta[i].adc_val_now; |
| keypad.key_sta[i].adc_chg_cnt = 0; |
| keypad.key_sta[i].is_pressed_long = 0; |
| } |
| } |
| else |
| { |
| if(keypad.key_sta[i].is_pressed) |
| { |
| if(keypad.key_sta[i].adc_val_now < keypad.key_sta[i].adc_val_pre) |
| { |
| if((keypad.key_sta[i].adc_val_pre - keypad.key_sta[i].adc_val_now) > KEY_UP_THRESHOLD) |
| { |
| keypad.key_sta[i].adc_chg_cnt ++; |
| } |
| } |
| else |
| { |
| keypad.key_sta[i].adc_chg_cnt = 0; |
| } |
| |
| if(keypad.key_sta[i].adc_chg_cnt > 1) |
| { |
| keypad.key_value = i+1; |
| keypad.key_sta[i].adc_val_last = keypad.key_sta[i].adc_val_pre; |
| keypad.key_sta[i].adc_val_pre = keypad.key_sta[i].adc_val_now; |
| keypad.key_sta[i].adc_chg_cnt = 0; |
| keypad.key_sta[i].is_pressed = 0; |
| keypad.key_sta[i].down_timer = 0; |
| keypad.key_sta[i].is_pressed_long = 0; |
| keypad.lock = 0; |
| } |
| } |
| else |
| { |
| keypad.key_sta[i].adc_val_last = keypad.key_sta[i].adc_val_pre; |
| keypad.key_sta[i].adc_val_pre = keypad.key_sta[i].adc_val_now; |
| keypad.key_sta[i].adc_chg_cnt = 0; |
| keypad.key_sta[i].is_pressed_long = 0; |
| } |
| } |
| key_dbg("%02u:%4hu,%4hu,%4hu,%4hu,%4hhu,%4hhu,%4hhu,%4hhu\r\n", i, |
| keypad.key_sta[i].adc_val_pre, |
| keypad.key_sta[i].adc_val_last, |
| keypad.key_sta[i].adc_val_now, |
| keypad.key_sta[i].down_timer, |
| keypad.key_sta[i].adc_chg_cnt, |
| keypad.key_sta[i].is_pressed, |
| keypad.key_sta[i].is_pressed_long, |
| keypad.key_sta[i].long_pressed_timer); |
| } |
| |
| if(key_idx<MAX_KEY_NUM) |
| { |
| if(keypad.key_sta[key_idx].adc_chg_cnt>0) |
| { |
| keypad.key_sta[key_idx].is_pressed = 1; |
| keypad.key_sta[key_idx].down_timer = 9; //°´¼üɨÃèÖÜÆÚ112ms£¬112*9ԼΪ1008ms |
| keypad.key_sta[key_idx].adc_chg_cnt = 0; |
| keypad.lock = 1; |
| |
| keypad.key_sta[key_idx].adc_val_pre = keypad.key_sta[key_idx].adc_val_now; |
| } |
| } |
| } |