51单片机怎么写出“按键A开启矩阵键盘执行的的命令”?

使用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键按下,进入执行状态。

在准备状态,还可以额外加个超时检测,超时没有有效输入,切换回最初状态