封装另一种思路的按键扫描方式

{
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
}


}






}


}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值