blob: 5599c40a25c0525d0333a9f373714b0cc8bed0c1 [file] [log] [blame]
#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;
}
}
}