找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5333|回复: 5
打印 上一主题 下一主题
收起左侧

单片机多级菜单及按键参数设置的架构 求分享

[复制链接]
跳转到指定楼层
楼主
ID:79874 发表于 2018-6-22 08:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机多级菜单及按键参数设置的架构,希望分享下
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624105 发表于 2019-10-16 23:36 | 只看该作者
同样在找
回复

使用道具 举报

板凳
ID:601639 发表于 2019-10-17 09:41 | 只看该作者
我前段时候刚做了个菜单,用OLED屏显示,挺好用的。
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下

u8 KEY_Scan(u8 mode)
{         
        static u8 key_up=1;//按键标志
        if(mode)key_up=1;  //支持连按       
  //检测按键是否按下       
        if(key_up&&(Upper_KEY==0||Left_KEY==0||Right_KEY==0||Lower_KEY==0||Determine_KEY==0||Return_KEY==0))
        {
                delay_ms(20);//去抖动
                if(key_up&&(Upper_KEY==0||Left_KEY==0||Right_KEY==0||Lower_KEY==0||Determine_KEY==0||Return_KEY==0))
                {
                                key_up=0;
                                                 if(Upper_KEY     == 0)           return Upper;
                                else if(Left_KEY      == 0)           return Left;
                                else if(Right_KEY     == 0)           return Right;
                                else if(Lower_KEY     == 0)           return Lower;
                                else if(Determine_KEY == 0)           return Determine;
                                else if(Return_KEY    == 0)           return Return;
                }
        }
        //检测按键是否松开
        else if(Upper_KEY==1 && Left_KEY==1 && Right_KEY==1 && Lower_KEY==1 && Determine_KEY==1 && Return_KEY==1)
        key_up=1;         return 0;//无按键按下
       
}

//  IIC协议    OLED屏 人机界面
void lnterface(void)  //人机界面
{       
        switch(Page_Sgin)       
        {               
                case 0:
                             Main_Menu(); break;
                case 2:
                             Menu_2(); break;
                case 3:
                             Menu_3();break;                               
                default : break;
        }
       
}


//主菜单
void Main_Menu(void)
{
        OLED_P16x16Ch(0*16,6,11);                   //显示 //菜
        OLED_P16x16Ch(1*16,6,12);                   //显示 //单
        OLED_P16x16Ch(6*16,6,13);                   //显示 //退       
        OLED_P16x16Ch(7*16,6,14);                   //显示 //出
        if(KEY_Scan(Key_Selection)==Determine)//判断是否按下确定按键
        {                           
                Page_Sgin=2;                              //页面选择置2
                OLED_Clear();
        }
}

void Menu_2(void)
{

        if(Choice==2||Choice==4||Choice==6)       
        {                       
                OLED_P16x16Ch(0*16,Choice,44);              //选择
                Display(0,0,0);
                               
                switch(KEY_Scan(Key_Selection))       
                {               
                        case Superior_Choice:                     //上翻
                                   OLED_P16x16Ch(0*16,Choice,37);
                                   Choice-=2;
                                   break;
                        case Subordinate_Choice:                  //下翻
                                   OLED_P16x16Ch(0*16,Choice,37);
                                   Choice+=2;
                                   break;
                        case Determine_Choice:                    //确定
                             Page_Sgin=3;Choice=2;
                                         OLED_Clear();
                                   break;
                        case Return_Choice:                       //返回
                                   Page_Sgin=0;   
                             break;
                        default :
                                   break;
                }
               
        }       
        else if(Choice>6)Choice=2;
        else if(Choice<2)Choice=6;

}
void Menu_3(void)
{
        if(Choice==2||Choice==4||Choice==6)       
        {
                OLED_P16x16Ch(0*16,Choice,44);              //选择
                Display(0,0,0);
               
                switch(KEY_Scan(Key_Selection))       
                {               
                        case Superior_Choice:                     //上翻
                                   OLED_P16x16Ch(0*16,Choice,37);
                                   Choice-=2;
                                   break;
                        case Subordinate_Choice:                  //下翻
                                   OLED_P16x16Ch(0*16,Choice,37);
                                   Choice+=2;
                                   break;
                        case Determine_Choice:                    //确定
                             Page_Sgin=3;Choice=2;
                                   break;
                        case Return_Choice:                       //返回
                                   Page_Sgin=2;Choice=2;  
                             break;
                        default :
                                   break;
                }
               
        }       
        else if(Choice>6)Choice=2;
        else if(Choice<2)Choice=6;
}

int main(void)
{         
         delay_init();
         uart_init(9600);         
         LED_Init();
         KEY_Init();
        while(1)
        {
            lnterface();
        }
}

就是这么个意思,在主函数里扫描switch(Page_Sgin),按确定键时跳转到想进的下一级菜单,比如该例子,首先刚开始程序位于主菜单,按确定键,Page_Sgin=2;进入2级菜单。再2级菜单里比如Page_Sgin=4;进入2级菜单的子菜单,按返回键返回想要到的上一级菜单。这个程序很好用,我也是找了很久才发现的,这个理解起来最简单。
回复

使用道具 举报

地板
ID:79874 发表于 2019-11-9 21:11 来自触屏版 | 只看该作者
谢谢哥们分享不错
回复

使用道具 举报

5#
ID:235200 发表于 2019-11-9 21:46 | 只看该作者
用状态设置各级菜单,完成一个显示后通过某种逻辑改变至另是种状态就实现了
回复

使用道具 举报

6#
ID:976070 发表于 2022-2-3 20:49 | 只看该作者
怎么完成参数加减?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表