STM32F103按键控制(二)

按键顺序
k1    k2
k3        k4
k5        k6
k7        k8
k9        k10
k11        k12
控制要求,
k1~k8        //双击+长按时有效输出,按任意键取消
k9~K10     //只双击时有效输出,按自身取消
k11~k12 //单击或长按时有效输出,按自身取消

控制权限:
k12>k11>k9~k10>k1~k8
函数具体变量见《STM32F103按键控制,按键双击,长按有效,单击取消》
https://blog.csdn.net/zhai17863966493/article/details/104415911

void Key_Scanf(void)
{
    if(1 == Key_Down_Num())    
    {
        Old_Key_Value = Key_Value;
        Key_Value = 0;
        if(Key_State == KEY12_STATE_VALUE)
        { 
            if(Key_Stop_State == 1)
            {
                if(Immediately_stop == 0)
                {
                    Immediately_stop = 1;    
                    Rst_Flag = 0;
                    Auto_Roll_Flag    = 0;
                }
                else
                {
                    Immediately_stop = 0;
                }                
            }            
            Key_Stop_State = 0;            
        }
        if(Immediately_stop == 0)
        {
            if(Key_State == KEY11_STATE_VALUE)
            {
                if(Key_Rst_State == 1)
                {
                    if(Rst_Flag == 0)
                    {
                        Rst_Flag    = 1;
                        Auto_Roll_Flag    = 0;
                    }
                    else
                    {
                        Rst_Flag = 0;
                    }                
                }                
                Key_Rst_State = 0;                    
            }            
            
            if(Rst_Flag == 0)
            {
                if(Key_State == KEY9_STATE_VALUE)
                {
                    Key_Value = KEY_AUTO1;
                }
                if(Key_State == KEY10_STATE_VALUE)
                {
                    Key_Value = KEY_AUTO2;
                }
                if(Auto_Roll_Flag == 0)
                {
                    switch(Key_State)
                    {
                        case KEY1_STATE_VALUE:Key_Value = KEY_BACK_UP;break;
                        case KEY2_STATE_VALUE:Key_Value = KEY_BACK_DOWN;break;
                        case KEY3_STATE_VALUE:Key_Value = KEY_FOOT_UP;break;
                        case KEY4_STATE_VALUE:Key_Value = KEY_FOOT_DOWN;break;
                        case KEY5_STATE_VALUE:Key_Value = KEY_PEN_UP;break;
                        case KEY6_STATE_VALUE:Key_Value = KEY_PEN_DOWN;break;
                        case KEY7_STATE_VALUE:Key_Value = KEY_LEFT_RUN;break;
                        case KEY8_STATE_VALUE:Key_Value = KEY_RIGHT_RUN;break;                        
                        default:{}break;                        
                    }    
                }    
            }    
        }
        if(Key_Down_Flag == 1)
        {
            Key_Down_Count_Flag++;
        }        
        Key_Down_Flag = 0;    
    }
    else
    {
        Key_Down_Flag = 1;
        Key_Stop_State = 1;
        Key_Rst_State = 1;
    }
    
}
void GetKey_True_Touch(void)
{
    //判断单击了一次
    if(Key_Down_Count_Flag == 1)
    {
        //按键是否是按下
        if(Key_Down_Flag == 0)
        {
            //时间超过长按规定时间
            if(Key_Click_Time >= Key_Long_Click_Time)
            {
                //按键按下的不是K9 K10
                if((Key_Value != KEY_AUTO1)&&(Key_Value != KEY_AUTO2))
                {
                    Key_Ture_Value = Key_Value;
                }    
            }    
            else //如果时间没有超过长按规定时间
            {
            Key_Ture_Value = 0;
            }
        }
        else //判断按键按下后,再抬起时的状态,按下时时间就开始计时,如果未超过双击规定时间继续执行双击动作
        {
            //如果输出为0,急停标志==0,复位标志==0, 自动翻身标志==0;
            if((Key_Ture_Value == 0)&&(Immediately_stop == 0)&&(Rst_Flag == 0)&&(Auto_Roll_Flag == 0))
            {    
                //判断时间是否超过双击规定时间,如果超过规定双击规定时间,清零。
                //如果抬起时没有超过双击规定时间,继续执行双击动作
                if(Key_Click_Time >= Key_Two_Click_Time)
                {
                    if((Key_Value == KEY_AUTO1)&&(Auto_Roll_Flag == AUTO_ROLL_FLAG_A))
                    {
                        Auto_Roll_Flag = 0;
                    }
                    if((Key_Value == KEY_AUTO2)&&(Auto_Roll_Flag == AUTO_ROLL_FLAG_B))
                    {
                        Auto_Roll_Flag = 0;
                    }        
//                    if((Immediately_stop == 0)&&(Rst_Flag == 0)&&(Auto_Roll_Flag == 0))
//                    {
//                        Key_Ture_Value = 0;
//                    }
                    Key_Click_Time = 0;
                    Key_Down_Count_Flag = 0;                    
                }                
            }
            //如果输出!=0,急停标志!=0,复位标志!=0, 自动翻身标志!=0;
            //如果Key_Ture_Value != 0的情况下,此时可以按任意键清零
            else 
            {
                //如果按键按下k9 && 自动翻身是模式A
                if((Key_Value == KEY_AUTO1)&&(Auto_Roll_Flag == AUTO_ROLL_FLAG_A))
                {
                    Auto_Roll_Flag = 0;
                }
                //如果按键按下k10 && 自动翻身是模式B
                if((Key_Value == KEY_AUTO2)&&(Auto_Roll_Flag == AUTO_ROLL_FLAG_B))
                {
                    Auto_Roll_Flag = 0;
                }    
                //如果 急停标志==0,复位标志==0, 自动翻身标志==0 主要是判断输出 != 0的时候
                //主要用于当按键抬起时,Key_Ture_Value的清零动作,实现按任意键Key_Ture_Value清零动作
                if((Immediately_stop == 0)&&(Rst_Flag == 0)&&(Auto_Roll_Flag == 0))
                {
                    Key_Ture_Value = 0;
                }
                Key_Click_Time = 0;
                Key_Down_Count_Flag = 0;                
            }
        }        
    }
    if(Key_Down_Count_Flag == 2)
    {
        if(Old_Key_Value == Key_Value) //两次按键值一样
        {    
            Key_Ture_Value = Key_Value;
        }
        else
        {
            Key_Ture_Value = 0;
        }
        //完成双击后将计时和次数标志位清零
        Key_Click_Time = 0;
        Key_Down_Count_Flag = 0;    
        //等待按键抬起
        while(Key_Down_Num());            
    }
    if(Key_Ture_Value == KEY_AUTO1)
    {        
        Auto_Roll_Flag = AUTO_ROLL_FLAG_A;
    }
    if(Key_Ture_Value == KEY_AUTO2)
    {        
        Auto_Roll_Flag = AUTO_ROLL_FLAG_B;    
    }    
}
 

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