按键顺序
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;
}
}