blob: 5599c40a25c0525d0333a9f373714b0cc8bed0c1 [file] [log] [blame]
zongqiang.zhang0c6a0882019-08-07 14:48:21 +08001#include "keypad.h"
2#include "string.h"
3#include "../supwisdom/sp_util.h"
4#include "drv_adc.h"
5//#include "timer.h"
6//#include "Include_All.H"
7//#include "glcd.h"
8//#include "dbg.h"
9
10#define __key_dbg_en__ 0
11#if(__key_dbg_en__)
12#define key_dbg(...) dbg(__VA_ARGS__)
13#else
14#define key_dbg(...)
15#endif
16
17#define KEY_DOWN_THRESHOLD 300u
18#define KEY_UP_THRESHOLD 100u
19
20struct key_sta_t
21{
22 volatile uint16_t adc_val_pre;
23 volatile uint16_t adc_val_last;
24 volatile uint16_t adc_val_now;
25 volatile uint16_t down_timer;
26 volatile uint8_t adc_chg_cnt;
27 volatile uint8_t is_pressed;
28 volatile uint8_t is_pressed_long;
29 volatile uint8_t long_pressed_timer;
30};
31
32struct
33{
34 volatile uint8_t is_inited;
35 volatile uint8_t lock;
36 volatile uint16_t key_value;
37 struct key_sta_t key_sta[MAX_KEY_NUM];
38} keypad;
39
40uint8_t keypad_init(void)
41{
42 uint8_t i;
43
44 keypad.is_inited = 0;
45 memset(&keypad, 0, sizeof(keypad));
46 Delay_ms(500);
47 for(i=0; i<MAX_KEY_NUM; i++)
48 {
49 keypad.key_sta[i].adc_val_pre = adc_get_val(i);
50 }
51 keypad.is_inited = 1;
52 return 0;
53}
54
55__weak void keypad_cb_on_preesed(uint8_t key_val)
56{
57
58}
59
60uint8_t keypad_get_key(void)
61{
62 if(keypad.key_value != KEY_NONE)
63 {
64 uint8_t temp = keypad.key_value;
65
66 keypad.key_value = KEY_NONE;
67 keypad_cb_on_preesed(temp);
68 return temp;
69 }
70 return KEY_NONE;
71}
72
73void keypad_scan(void)
74{
75 uint8_t i;
76 uint16_t max_delt = 0;
77 uint8_t key_idx = MAX_KEY_NUM;
78
79 key_dbg("\r\nsys_tick:%u\r\n", sys_timer_tick);
80 for(i=0; i<MAX_KEY_NUM; i++)
81 {
82 keypad.key_sta[i].adc_val_now = adc_get_val(i);
83 if(keypad.key_sta[i].adc_val_pre == 0)
84 {
85 keypad.key_sta[i].adc_val_pre = adc_get_val(i);
86 return;
87 }
88 if(keypad.key_sta[i].adc_val_last == 0)
89 {
90 keypad.key_sta[i].adc_val_last = adc_get_val(i);
91 return;
92 }
93
94 if(keypad.key_sta[i].down_timer)
95 {
96 keypad.key_sta[i].down_timer --;
97 if(!keypad.key_sta[i].down_timer)
98 {
99 keypad.key_sta[i].is_pressed = 0;
100 keypad.key_value = i+1;
101 keypad.key_sta[i].adc_val_last = keypad.key_sta[i].adc_val_now;
102 keypad.key_sta[i].adc_val_pre = keypad.key_sta[i].adc_val_now;
103 keypad.lock = 0;
104 }
105 }
106
107 if((keypad.key_sta[i].adc_val_now > keypad.key_sta[i].adc_val_last)&&(!keypad.key_sta[i].is_pressed)&&(!keypad.lock))
108 {
109 uint16_t temp_delt = keypad.key_sta[i].adc_val_now - keypad.key_sta[i].adc_val_last;
110
111 if(temp_delt > KEY_DOWN_THRESHOLD)
112 {
113 if(keypad.key_sta[i].adc_chg_cnt<10)
114 {
115 keypad.key_sta[i].adc_chg_cnt ++;
116 }
117
118 if(temp_delt>max_delt)
119 {
120 max_delt = temp_delt;
121 key_idx = i;
122 }
123 else
124 {
125 keypad.key_sta[i].adc_chg_cnt = 0;
126 }
127 }
128 else
129 {
130 keypad.key_sta[i].adc_val_last = keypad.key_sta[i].adc_val_pre;
131 keypad.key_sta[i].adc_val_pre = keypad.key_sta[i].adc_val_now;
132 keypad.key_sta[i].adc_chg_cnt = 0;
133 keypad.key_sta[i].is_pressed_long = 0;
134 }
135 }
136 else
137 {
138 if(keypad.key_sta[i].is_pressed)
139 {
140 if(keypad.key_sta[i].adc_val_now < keypad.key_sta[i].adc_val_pre)
141 {
142 if((keypad.key_sta[i].adc_val_pre - keypad.key_sta[i].adc_val_now) > KEY_UP_THRESHOLD)
143 {
144 keypad.key_sta[i].adc_chg_cnt ++;
145 }
146 }
147 else
148 {
149 keypad.key_sta[i].adc_chg_cnt = 0;
150 }
151
152 if(keypad.key_sta[i].adc_chg_cnt > 1)
153 {
154 keypad.key_value = i+1;
155 keypad.key_sta[i].adc_val_last = keypad.key_sta[i].adc_val_pre;
156 keypad.key_sta[i].adc_val_pre = keypad.key_sta[i].adc_val_now;
157 keypad.key_sta[i].adc_chg_cnt = 0;
158 keypad.key_sta[i].is_pressed = 0;
159 keypad.key_sta[i].down_timer = 0;
160 keypad.key_sta[i].is_pressed_long = 0;
161 keypad.lock = 0;
162 }
163 }
164 else
165 {
166 keypad.key_sta[i].adc_val_last = keypad.key_sta[i].adc_val_pre;
167 keypad.key_sta[i].adc_val_pre = keypad.key_sta[i].adc_val_now;
168 keypad.key_sta[i].adc_chg_cnt = 0;
169 keypad.key_sta[i].is_pressed_long = 0;
170 }
171 }
172 key_dbg("%02u:%4hu,%4hu,%4hu,%4hu,%4hhu,%4hhu,%4hhu,%4hhu\r\n", i,
173 keypad.key_sta[i].adc_val_pre,
174 keypad.key_sta[i].adc_val_last,
175 keypad.key_sta[i].adc_val_now,
176 keypad.key_sta[i].down_timer,
177 keypad.key_sta[i].adc_chg_cnt,
178 keypad.key_sta[i].is_pressed,
179 keypad.key_sta[i].is_pressed_long,
180 keypad.key_sta[i].long_pressed_timer);
181 }
182
183 if(key_idx<MAX_KEY_NUM)
184 {
185 if(keypad.key_sta[key_idx].adc_chg_cnt>0)
186 {
187 keypad.key_sta[key_idx].is_pressed = 1;
188 keypad.key_sta[key_idx].down_timer = 9; //°´¼üɨÃèÖÜÆÚ112ms£¬112*9ԼΪ1008ms
189 keypad.key_sta[key_idx].adc_chg_cnt = 0;
190 keypad.lock = 1;
191
192 keypad.key_sta[key_idx].adc_val_pre = keypad.key_sta[key_idx].adc_val_now;
193 }
194 }
195}