{
unsigned char Trg;
unsigned char Cont;
unsigned char keep_Trg;
unsigned char keep_Cont;
unsigned char KeyEncodeStatus;
unsigned char keepKeyEncodeStatus;
#define key_null 0x00
#define key_up 0x01
#define key_down 0x02
#define key_left 0x03
#define key_right 0x04
#define key_enter 0x05
unsigned int cnt_sub;//消抖
unsigned int keycnt_sub;//延时读取
unsigned int keydelaycnt_plus;//延时计数
unsigned char KeyEncodeStatus_plus;
#define LongPressTime 100;//100x20ms=2S;
#define And_SL 1
//短按之后会发长按
#define Or_SL 2
//短按或长按发送
#define KeyMode Or_SL
#define VoltageDeta 100
typedef struct
{
u16 keyVoltage_low;
u16 keyVoltage_high;
} KEY_DEFINE;
static const KEY_DEFINE KEY_TAB[4][8] =
{
{
//KEY0
{
329-VoltageDeta, 329+VoltageDeta// KEY_Up
}
, // key,"key_up"
{
1716-VoltageDeta, 1716+VoltageDeta// KEY_Dn
}
, // key,"key_Dn"
{
1043-VoltageDeta, 1043+VoltageDeta// KEY_Left
}
, // key,"key_Left"
{
2500-VoltageDeta, 2500+VoltageDeta// KEY_Right
}
, // key,"key_Right"
{
2983-VoltageDeta, 2983+VoltageDeta// KEY_Enter
}
, // key,"key_Enter"
{
666-VoltageDeta, 666+VoltageDeta// KEY_Menu
}
, // key,"key_Menu"
{
2144-VoltageDeta, 2144+VoltageDeta// KEY_Back
}
, // key,"key_back"
{
3300, 3300, Key_Null
}
, // key
}
,
//KEY1
{
{
0, 0// Key_Null
}
, // key
{
0, 0// Key_Null
}
, // key
{
0, 0// Key_Null
}
, // key
{
0, 0// Key_Null
}
, // key
{
3300, 3300// Key_Null
}
, // key
}
,
//KEY2
{
{
0, 0// Key_Null
}
, // key
{
0, 0// Key_Null
}
, // key
{
0, 0// Key_Null
}
, // key
{
0, 0// Key_Null
}
, // key
{
3300, 3300// Key_Null
}
, // key
}
,
//KEY3
{
{
0, 0// Key_Null
}
, // key
{
0, 0// Key_Null
}
, // key
{
0, 0// Key_Null
}
, // key
{
0, 0// Key_Null
}
, // key
{
3300, 3300// Key_Null
}
, // key
}
,
};
/***************************************KEY START ***********************************/
/*********************************************
Function: Key_Dispatch
Description: read opration code
Write/Modify: edwin
Time: 2011-12-8
*********************************************/
u16 GetVotFromAD(u16 u16AD)
{
//u16 int_part,float_part;
static u16 temp;
temp = u16AD;
//把采集到的数据转换成电压值
temp = (u16)((((u32)temp) * 3300) >> 12);
//int_part = temp/1000;
//float_part = temp%1000;
return temp;
}
/**************************************************************************/
/* */
/**************************************************************************/
static u8 GetKeyPos(u16 keyVoltage, u8 uKeyGroup)
{
u8 i;
for (i = 0; KEY_TAB[uKeyGroup][i].keyVoltage_high != 3300 &&
KEY_TAB[uKeyGroup][i].keyVoltage_low != 3300; i++)
{
if (keyVoltage >= KEY_TAB[uKeyGroup][i].keyVoltage_low && keyVoltage <=
KEY_TAB[uKeyGroup][i].keyVoltage_high)
{
return i;
}
}
//printf("\r\n ===============KEY_NULL");
return KEY_NULL;
}
void KeyReadEncode(void)
{ unsigned char keypos;
keypos = GetKeyPos(GetVotFromAD(g_stuKEY.KeyAD[0]), 0);
switch(keypos)
{
case 0:
KeyEncodeStatus=key_up;
break;
case 1:
KeyEncodeStatus=key_down;
break;
case 2:
KeyEncodeStatus=key_left;
break;
case 3:
KeyEncodeStatus=key_right;
break;
case 4:
KeyEncodeStatus=key_enter;
break;
default:
KeyEncodeStatus=key_null;
break;
}
}
void KeyRead( void )
{
unsigned char ReadData = KeyEncodeStatus^0xff; // 1
Trg = ReadData & (ReadData ^ Cont); // 2
Cont = ReadData; // 3
}
void KeyProc(void)
{
switch(Trg)
{
case key_up://short pressed
keep_Trg=Trg;
#if KeyMode==And_SL
//short pressed fun
#endif
break;
case key_down://short pressed
keep_Trg=Trg;
#if KeyMode==And_SL
//short pressed fun
#endif
break;
case key_left://short pressed
keep_Trg=Trg;
#if KeyMode==And_SL
//short pressed fun
#endif
break;
case key_right://short pressed
keep_Trg=Trg;
#if KeyMode==And_SL
//short pressed fun
#endif
break;
case key_enter://short pressed
keep_Trg=Trg;
#if KeyMode==And_SL
//short pressed fun
#endif
break;
default:
break;
}
switch(Cont)
{
case key_up:
keydelaycnt_plus++;
if(keydelaycnt_plus>LongPressTime){//long pressed
keydelaycnt_plus=0;
keep_Cont=Cont;
#if KeyMode==And_SL
//long pressed fun
#endif
}
break;
case key_down:
keydelaycnt_plus++;
if(keydelaycnt_plus>LongPressTime){//long pressed
keydelaycnt_plus=0;
keep_Cont=Cont;
#if KeyMode==And_SL
//long pressed fun
#endif
}
break;
case key_left:
keydelaycnt_plus++;
if(keydelaycnt_plus>LongPressTime){//long pressed
keydelaycnt_plus=0;
keep_Cont=Cont;
#if KeyMode==And_SL
//long pressed fun
#endif
}
break;
case key_right:
keydelaycnt_plus++;
if(keydelaycnt_plus>LongPressTime){//long pressed
keydelaycnt_plus=0;
keep_Cont=Cont;
#if KeyMode==And_SL
//long pressed fun
#endif
}
break;
case key_enter:
keydelaycnt_plus++;
if(keydelaycnt_plus>LongPressTime){//long pressed
keydelaycnt_plus=0;
keep_Cont=Cont;
#if KeyMode==And_SL
//long pressed fun
#endif
}
break;
default:
break;
}
}
/*
short pressed or long pressed choice one
*/
void KeyPOS(void)
{
if(keep_Trg&keep_Cont){
switch(keep_Cont)//long pressed
{
case key_up:
break;
case key_down:
break;
case key_left:
break;
case key_right:
break;
case key_enter:
break;
default:
break;
}
}else{
switch(keep_Trg)//short pressed
{
case key_up:
break;
case key_down:
break;
case key_left:
break;
case key_right:
break;
case key_enter:
break;
default:
break;
}
}
}
/*
void SysTick_Handler(void)
{
if(keycnt_sub>0) keycnt_sub--;
}
*/
void Key_Task(void)
{
if(!keycnt_sub){
keycnt_sub=20;
KeyReadEncode();
if(KeyEncodeStatus){
if(KeyEncodeStatus_plus==1&&keepKeyEncodeStatus==KeyEncodeStatus){
KeyRead();
KeyProc();
}else if(KeyEncodeStatus_plus==1&&keepKeyEncodeStatus!=KeyEncodeStatus){
keepKeyEncodeStatus=0;
KeyEncodeStatus_plus=0;//计时消抖
keydelaycnt_plus=0;
KeyEncodeStatus=0;
KeyRead();
#if KeyMode==Or_SL
KeyPOS();//short pressed or long pressed choice one
#endif
keep_Trg=0;
keep_Cont=0;
//bounce fun
//key==key_null
}
else{
keepKeyEncodeStatus=KeyEncodeStatus;
KeyEncodeStatus_plus=1;//计时消抖
keydelaycnt_plus=0;
}
}else{
keepKeyEncodeStatus=0;
KeyEncodeStatus_plus=0;//计时消抖
keydelaycnt_plus=0;
KeyRead();
#if KeyMode==Or_SL
KeyPOS();//short pressed or long pressed choice one
#endif
keep_Trg=0;
keep_Cont=0;
//bounce fun
//key==key_null
}
}
}
}
unsigned char Trg;
unsigned char Cont;
unsigned char keep_Trg;
unsigned char keep_Cont;
unsigned char KeyEncodeStatus;
unsigned char keepKeyEncodeStatus;
#define key_null 0x00
#define key_up 0x01
#define key_down 0x02
#define key_left 0x03
#define key_right 0x04
#define key_enter 0x05
unsigned int cnt_sub;//消抖
unsigned int keycnt_sub;//延时读取
unsigned int keydelaycnt_plus;//延时计数
unsigned char KeyEncodeStatus_plus;
#define LongPressTime 100;//100x20ms=2S;
#define And_SL 1
//短按之后会发长按
#define Or_SL 2
//短按或长按发送
#define KeyMode Or_SL
#define VoltageDeta 100
typedef struct
{
u16 keyVoltage_low;
u16 keyVoltage_high;
} KEY_DEFINE;
static const KEY_DEFINE KEY_TAB[4][8] =
{
{
//KEY0
{
329-VoltageDeta, 329+VoltageDeta// KEY_Up
}
, // key,"key_up"
{
1716-VoltageDeta, 1716+VoltageDeta// KEY_Dn
}
, // key,"key_Dn"
{
1043-VoltageDeta, 1043+VoltageDeta// KEY_Left
}
, // key,"key_Left"
{
2500-VoltageDeta, 2500+VoltageDeta// KEY_Right
}
, // key,"key_Right"
{
2983-VoltageDeta, 2983+VoltageDeta// KEY_Enter
}
, // key,"key_Enter"
{
666-VoltageDeta, 666+VoltageDeta// KEY_Menu
}
, // key,"key_Menu"
{
2144-VoltageDeta, 2144+VoltageDeta// KEY_Back
}
, // key,"key_back"
{
3300, 3300, Key_Null
}
, // key
}
,
//KEY1
{
{
0, 0// Key_Null
}
, // key
{
0, 0// Key_Null
}
, // key
{
0, 0// Key_Null
}
, // key
{
0, 0// Key_Null
}
, // key
{
3300, 3300// Key_Null
}
, // key
}
,
//KEY2
{
{
0, 0// Key_Null
}
, // key
{
0, 0// Key_Null
}
, // key
{
0, 0// Key_Null
}
, // key
{
0, 0// Key_Null
}
, // key
{
3300, 3300// Key_Null
}
, // key
}
,
//KEY3
{
{
0, 0// Key_Null
}
, // key
{
0, 0// Key_Null
}
, // key
{
0, 0// Key_Null
}
, // key
{
0, 0// Key_Null
}
, // key
{
3300, 3300// Key_Null
}
, // key
}
,
};
/***************************************KEY START ***********************************/
/*********************************************
Function: Key_Dispatch
Description: read opration code
Write/Modify: edwin
Time: 2011-12-8
*********************************************/
u16 GetVotFromAD(u16 u16AD)
{
//u16 int_part,float_part;
static u16 temp;
temp = u16AD;
//把采集到的数据转换成电压值
temp = (u16)((((u32)temp) * 3300) >> 12);
//int_part = temp/1000;
//float_part = temp%1000;
return temp;
}
/**************************************************************************/
/* */
/**************************************************************************/
static u8 GetKeyPos(u16 keyVoltage, u8 uKeyGroup)
{
u8 i;
for (i = 0; KEY_TAB[uKeyGroup][i].keyVoltage_high != 3300 &&
KEY_TAB[uKeyGroup][i].keyVoltage_low != 3300; i++)
{
if (keyVoltage >= KEY_TAB[uKeyGroup][i].keyVoltage_low && keyVoltage <=
KEY_TAB[uKeyGroup][i].keyVoltage_high)
{
return i;
}
}
//printf("\r\n ===============KEY_NULL");
return KEY_NULL;
}
void KeyReadEncode(void)
{ unsigned char keypos;
keypos = GetKeyPos(GetVotFromAD(g_stuKEY.KeyAD[0]), 0);
switch(keypos)
{
case 0:
KeyEncodeStatus=key_up;
break;
case 1:
KeyEncodeStatus=key_down;
break;
case 2:
KeyEncodeStatus=key_left;
break;
case 3:
KeyEncodeStatus=key_right;
break;
case 4:
KeyEncodeStatus=key_enter;
break;
default:
KeyEncodeStatus=key_null;
break;
}
}
void KeyRead( void )
{
unsigned char ReadData = KeyEncodeStatus^0xff; // 1
Trg = ReadData & (ReadData ^ Cont); // 2
Cont = ReadData; // 3
}
void KeyProc(void)
{
switch(Trg)
{
case key_up://short pressed
keep_Trg=Trg;
#if KeyMode==And_SL
//short pressed fun
#endif
break;
case key_down://short pressed
keep_Trg=Trg;
#if KeyMode==And_SL
//short pressed fun
#endif
break;
case key_left://short pressed
keep_Trg=Trg;
#if KeyMode==And_SL
//short pressed fun
#endif
break;
case key_right://short pressed
keep_Trg=Trg;
#if KeyMode==And_SL
//short pressed fun
#endif
break;
case key_enter://short pressed
keep_Trg=Trg;
#if KeyMode==And_SL
//short pressed fun
#endif
break;
default:
break;
}
switch(Cont)
{
case key_up:
keydelaycnt_plus++;
if(keydelaycnt_plus>LongPressTime){//long pressed
keydelaycnt_plus=0;
keep_Cont=Cont;
#if KeyMode==And_SL
//long pressed fun
#endif
}
break;
case key_down:
keydelaycnt_plus++;
if(keydelaycnt_plus>LongPressTime){//long pressed
keydelaycnt_plus=0;
keep_Cont=Cont;
#if KeyMode==And_SL
//long pressed fun
#endif
}
break;
case key_left:
keydelaycnt_plus++;
if(keydelaycnt_plus>LongPressTime){//long pressed
keydelaycnt_plus=0;
keep_Cont=Cont;
#if KeyMode==And_SL
//long pressed fun
#endif
}
break;
case key_right:
keydelaycnt_plus++;
if(keydelaycnt_plus>LongPressTime){//long pressed
keydelaycnt_plus=0;
keep_Cont=Cont;
#if KeyMode==And_SL
//long pressed fun
#endif
}
break;
case key_enter:
keydelaycnt_plus++;
if(keydelaycnt_plus>LongPressTime){//long pressed
keydelaycnt_plus=0;
keep_Cont=Cont;
#if KeyMode==And_SL
//long pressed fun
#endif
}
break;
default:
break;
}
}
/*
short pressed or long pressed choice one
*/
void KeyPOS(void)
{
if(keep_Trg&keep_Cont){
switch(keep_Cont)//long pressed
{
case key_up:
break;
case key_down:
break;
case key_left:
break;
case key_right:
break;
case key_enter:
break;
default:
break;
}
}else{
switch(keep_Trg)//short pressed
{
case key_up:
break;
case key_down:
break;
case key_left:
break;
case key_right:
break;
case key_enter:
break;
default:
break;
}
}
}
/*
void SysTick_Handler(void)
{
if(keycnt_sub>0) keycnt_sub--;
}
*/
void Key_Task(void)
{
if(!keycnt_sub){
keycnt_sub=20;
KeyReadEncode();
if(KeyEncodeStatus){
if(KeyEncodeStatus_plus==1&&keepKeyEncodeStatus==KeyEncodeStatus){
KeyRead();
KeyProc();
}else if(KeyEncodeStatus_plus==1&&keepKeyEncodeStatus!=KeyEncodeStatus){
keepKeyEncodeStatus=0;
KeyEncodeStatus_plus=0;//计时消抖
keydelaycnt_plus=0;
KeyEncodeStatus=0;
KeyRead();
#if KeyMode==Or_SL
KeyPOS();//short pressed or long pressed choice one
#endif
keep_Trg=0;
keep_Cont=0;
//bounce fun
//key==key_null
}
else{
keepKeyEncodeStatus=KeyEncodeStatus;
KeyEncodeStatus_plus=1;//计时消抖
keydelaycnt_plus=0;
}
}else{
keepKeyEncodeStatus=0;
KeyEncodeStatus_plus=0;//计时消抖
keydelaycnt_plus=0;
KeyRead();
#if KeyMode==Or_SL
KeyPOS();//short pressed or long pressed choice one
#endif
keep_Trg=0;
keep_Cont=0;
//bounce fun
//key==key_null
}
}
}
}