按键控制(三)

K1:双击+长按有效,按任意键取消
K2:双击+长按有效,按任意键取消
K3:双击+长按有效,按任意键取消
K4:双击+长按有效,按任意键取消
K5:双击+长按有效,按任意键取消
K6:双击+长按有效,按任意键取消
K7:双击+长按有效,按任意键取消
K8:双击+长按有效,按任意键取消
K9:双击+长按有效,按任意键取消
K10:双击+长按有效,按任意键取消
K11:双击有效,长按不管用。点击自身取消
加组合按键使用方法

//KEY值
typedef enum  
{
    DEVICE_ON_OFF = 101, //设备开关
    KEY_HEAD_UP  = 1,
    KEY_HEAD_DOWN ,
    KEY_FOOT_UP ,
    KEY_FOOT_DOWN ,
    KEY_LEFT_RUN,
    KEY_RIGHT_RUN,    
    KEY_BED_UP ,
    KEY_BED_DOWN,
    KEY_ROLL,
    KEY_RETURNROLL,
    
    KEY_FLAT,
    
    KEY_LEFT_AUTO1,
    KEY_LEFT_AUTO2,
    KEY_LEFT_AUTO3,
    KEY_LEFT_AUTO4,
    
    KEY_RIGHT_AUTO1,
    KEY_RIGHT_AUTO2,
    KEY_RIGHT_AUTO3,
    KEY_RIGHT_AUTO4,

    KEY_LEFT_AUTO_ESC,
    KEY_RIGHT_AUTO_ESC,
    KEY_AUTO_ESC,
    
    KEY_MAX = 200
}KEY_VALUE;

/*
* 描述: 按键检测分析
* 参数: 无
* 返回: 无*/
void GetKey_Scanf(void)
{
    if(1 == Key_Down_Num())
    {
        old_key_value = key_value;
        key_value = 0;
        switch(key_state)
        {
            case KEY1_STATE_VALUE:
            {
                key_value = KEY_LEFT_RUN;
            }break;
            case KEY2_STATE_VALUE:
            {
                key_value = KEY_RIGHT_RUN;
            }break;
            case KEY3_STATE_VALUE:
            {
                key_value = KEY_HEAD_UP;
            }break;
            case KEY4_STATE_VALUE:
            {
                key_value = KEY_HEAD_DOWN;
            }break;
            case KEY5_STATE_VALUE:
            {
                key_value = KEY_FOOT_UP;
            }break;
            case KEY6_STATE_VALUE:
            {
                key_value = KEY_FOOT_DOWN;
            }break;
            case KEY7_STATE_VALUE:
            {
                key_value = KEY_BED_UP;
            }break;
            case KEY8_STATE_VALUE:
            {
                key_value = KEY_BED_DOWN;
            }break;
            case KEY9_STATE_VALUE:
            {
                key_value = KEY_ROLL;
            }break;
            case KEY10_STATE_VALUE:
            {
                key_value = KEY_RETURNROLL;
            }break;
            case KEY11_STATE_VALUE:
            {
                key_value = KEY_FLAT;
            }break;
      
            //左侧自动翻身组合键
            case (KEY1_STATE_VALUE|KEY3_STATE_VALUE):
            {
                key_value = KEY_LEFT_AUTO1;
            }break;
            case (KEY1_STATE_VALUE|KEY4_STATE_VALUE):
            {
                key_value = KEY_LEFT_AUTO1;
            }break;
            case (KEY1_STATE_VALUE|KEY5_STATE_VALUE):
            {
                key_value = KEY_LEFT_AUTO2;
            }break;
            case (KEY1_STATE_VALUE|KEY6_STATE_VALUE):
            {
                key_value = KEY_LEFT_AUTO2;
            }break;
            case (KEY1_STATE_VALUE|KEY7_STATE_VALUE):
            {
                key_value = KEY_LEFT_AUTO3;
            }break;
            case (KEY1_STATE_VALUE|KEY8_STATE_VALUE):
            {
                key_value = KEY_LEFT_AUTO3;
            }break;
            case (KEY1_STATE_VALUE|KEY9_STATE_VALUE):
            {
                key_value = KEY_LEFT_AUTO4;
            }break;
            case (KEY1_STATE_VALUE|KEY10_STATE_VALUE):
            {
                key_value = KEY_LEFT_AUTO4;
            }break;
            //右侧自动翻身组合键
            case (KEY2_STATE_VALUE|KEY3_STATE_VALUE):
            {
                key_value = KEY_RIGHT_AUTO1;
            }break;
            case (KEY2_STATE_VALUE|KEY4_STATE_VALUE):
            {
                key_value = KEY_RIGHT_AUTO1;
            }break;
            case (KEY2_STATE_VALUE|KEY5_STATE_VALUE):
            {
                key_value = KEY_RIGHT_AUTO2;
            }break;
            case (KEY2_STATE_VALUE|KEY6_STATE_VALUE):
            {
                key_value = KEY_RIGHT_AUTO2;
            }break;
            case (KEY2_STATE_VALUE|KEY7_STATE_VALUE):
            {
                key_value = KEY_RIGHT_AUTO3;
            }break;
            case (KEY2_STATE_VALUE|KEY8_STATE_VALUE):
            {
                key_value = KEY_RIGHT_AUTO3;
            }break;
            case (KEY2_STATE_VALUE|KEY9_STATE_VALUE):
            {
                key_value = KEY_RIGHT_AUTO4;
            }break;
            case (KEY2_STATE_VALUE|KEY10_STATE_VALUE):
            {
                key_value = KEY_RIGHT_AUTO4;
            }break;
            //取消自动翻身
            case (KEY1_STATE_VALUE|KEY11_STATE_VALUE): //取消左侧自动翻身
            {
                key_value = KEY_LEFT_AUTO_ESC;
            }break;
            case (KEY2_STATE_VALUE|KEY11_STATE_VALUE): //取消右侧自动翻身
            {
                key_value = KEY_RIGHT_AUTO_ESC;
            }break;
            default:{}break;
        }        
        //记录按键按下次数
        if(0 == key_down_flag)
        {
            key_down_count_flag ++; //记录按键按下次数
        }        
        key_down_flag = 1;
    //如果开始自动翻转
        if(auto_turn_flag != 0)
        {
            if(key_value>=KEY_HEAD_UP && key_value<=KEY_RETURNROLL)
            {
                key_value = 0;
                key_ture_value = 0;
                key_down_count_flag = 0;
                key_down_flag = 0;
            }
        }        
    }
    else
    {
        key_down_flag = 0;
    }
}


/*
*描述:判断是否是有效键值
*参数:无
*返回值:无
*/
void GetKey_True_Touch(void)
{    
    //单击
    if(1 == key_down_count_flag)//只按下一次
    {
        if(0 == key_down_flag) //松开
        {
            if(0 == key_ture_value)
            {
                if(key_down_time>=KEY_TWO_TOUCH_TIME) //松开按键时间
                {
                    key_down_count_flag = 0;
                    key_down_time = 0;
                }
            }
            else  //长按松开后 立马停止
            {
                key_ture_value = 0;
                key_down_count_flag = 0;
                key_down_time = 0;
            }
        }
        else  //一直按着
        {
            if(key_down_time>=KEY_LONG_TOUCH_TIME) //松开按键时间
            {
                if(key_value!=KEY_FLAT) //长按不管用
                {
                    key_ture_value = key_value;
                }
                else
                {
                    key_ture_value = KEY_AUTO_ESC;
                }
            }
            else //双击后 再次按下按键  立马停止
            {
                //去掉此处,双击可以直接切换;加上此处,必须先打断再次双击(既  要点击三次才可以切换别的指令)
                if(key_ture_value != 0)     
                {
                    if(key_ture_value == KEY_FLAT)
                    {
                        if(key_value == KEY_FLAT) //关闭自己和自动翻身
                        {
                            key_ture_value = 0;
              
                        }
                    }
                    else
                    {
                        key_ture_value = 0;
                    }
                    key_down_count_flag = 0;
                    key_down_time = 0;
                }
            }
        }
    }
    //双击
    if(2 == key_down_count_flag) //按键按下两次
    {
        if(old_key_value == key_value)  //两次按下的是同一个按键
        {
            if(key_ture_value != KEY_FLAT)
            {
                key_ture_value = key_value;
            }
            key_down_count_flag = 0;//两次一样,清除计数
        }
        else
        {
            key_ture_value = 0;
            key_down_count_flag = 1; //两次不一样,记录次数为1,比如第一次点按键1,然后接着点两下按键2,则按键2有效
        }
        key_down_time = 0;
        while(Key_Down_Num()){Delay_Ms(20);}; //等待按键释放
    }
}

你可能感兴趣的:(按键控制(三))