使用3*3矩阵按键,分别对应1-9九个数字,当按一次Key_SET时,切换速度指示LED亮起;按下某一矩阵按键,再按一次Key_SET,使得转速直接变为按下的数字相对应的档位,且指示灯熄灭;
楼上的大哥已经给出答案了,我就写个代码框架吧。
#define CHANGE_SPEED_TIME_OUT 2000 //设置超时//
#define SET_SPEED_TIME_OUT 2000 //设置超时//
#define SPEED_MAX 8 //最大速度值//
#define SPEED_MIN 2 //最小速度值//
u8 g_key_num; //按键值//
u16 g_change_speed_time_cnt; //设置速度计数变量1//
u16 g_set_speed_time_cnt; //设置速度计数变量2//
u8 speed_change_flag; //允许切换速度的标志位//
u8 set_speed_flag; //速度已经记录完成标志位//
void Key_Fun(void)
{
switch (g_key_num)
{
case 0x01:
if (!speed_change_flag)
{
//LED灯亮起,允许切换速度//
speed_change_flag = 1;
set_speed_flag = 0;
}
else
{
//LED灯灭,设置速度,禁止再切换速度//
speed_change_flag = 0;
set_speed_flag = 0;
}
break;
//……还可以自行添加case//
default:
if (!speed_change_flag) break;
if ((g_key_num >= SPEED_MIN) && (g_key_num <= SPEED_MAX)) //速度区间内设置速度//
{
//记录速度值//
set_speed_flag = 1;
}
else{ //超出速度区间结束速度设置//
g_change_speed_time_cnt = 0;
speed_change_flag = 0;
set_speed_flag = 0;
}
break;
}
if (speed_change_flag)
{
if (set_speed_flag)
{
if (++g_set_speed_time_cnt >= SET_SPEED_TIME_OUT) //已经按下了要设置的速度值,等待按下Key_set设置速度允许的最长时间//
{
//一定时间内没有按下key_set可以默认设置当前按下的速度值//
g_set_speed_time_cnt = 0;
set_speed_flag = 0;
g_change_speed_time_cnt = 0;
speed_change_flag = 0;
//……//
}
}
else
{
if (++g_change_speed_time_cnt >= CHANGE_SPEED_TIME_OUT) //在一定时间内一直没有设置速度值则默认设置结束//
{
g_change_speed_time_cnt = 0;
speed_change_flag = 0;
set_speed_flag = 0;
}
}
}
}
状态机,第一次检测到SET键按下,进入准备输入状态,准备接受矩阵按键输入;检测到矩阵按键输入,切换档位状态;最终检测到第二次SET键按下,进入执行状态。
在准备状态,还可以额外加个超时检测,超时没有有效输入,切换回最初状态