大理水控初始版本
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;
+		}
+	}
+}