维京海盗Jack 2021-09-08 12:58 采纳率: 100%
浏览 23
已结题

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

使用3*3矩阵按键,分别对应1-9九个数字,当按一次Key_SET时,切换速度指示LED亮起;按下某一矩阵按键,再按一次Key_SET,使得转速直接变为按下的数字相对应的档位,且指示灯熄灭;

  • 写回答

3条回答 默认 最新

  • Idoc_* 2021-09-08 17:02
    关注

    楼上的大哥已经给出答案了,我就写个代码框架吧。

    #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;
                }
            }
            
            
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 9月5日
  • 已采纳回答 8月28日
  • 修改了问题 9月8日
  • 创建了问题 9月8日

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)