大理水控初始版本
diff --git a/sys_hw/keypad.c b/sys_hw/keypad.c
new file mode 100644
index 0000000..5599c40
--- /dev/null
+++ b/sys_hw/keypad.c
@@ -0,0 +1,195 @@
+#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;
+ }
+ }
+}