按键菜单程序设计:基于单片机等C语言开发环境的菜单程序设计思路以及代码实现(二)

   日期:2020-05-12     浏览:237    评论:0    
核心提示:代码实现部分c/c++

二级菜单的建立

在本例中,二级菜单只涉及到价格属性,因此,我们只需要在原先定义的节点中添加价格变量price,
同时每一项菜单原先只有一个指针域,指向下一项菜单。如果我们再添加一个指针域,让他指向下一级菜单(即第二级菜单的头部),那么,我们就完成了二级菜单的建立。

其中,next_Menu指向下一级菜单,link指向下一项菜单(同级)。

typedef struct Menus* Menu;
struct Menus
{
    unsigned char* name; //Menu name
    unsigned char position;//name of positon
    unsigned int font_num;//number of name
    float price;
    unsigned char function_mode;//Menu function 0:self check 1:Cal 2:Add 3:...
    unsigned char price_mode;
    Menu next_Menu;//the second Menu
    Menu link; //the next Menu
};

这时,我们需要新的添加节点函数,因为原先的添加节点函数变量初始化是基于第一级菜单的。
注意:根据你的需要,你需要自定义你的数据域!

unsigned char *Menu_price_name[]={(unsigned char *)"1.5",(unsigned char *)"2.5",(unsigned char *)"3.5",(unsigned char *)"4.5",(unsigned char *)"5.5",(unsigned char *)"6.5"}; //price of Menu
unsigned char Menu_price_num[]={1.5 , 2.5 , 3.5 , 4.5 , 5.5 , 6.5};
unsigned int price_font_num[]={3,3,3,3,3,3}; //number of Menu
Menu Attach_Menu_Price(Menu* pRear,int i,int mode)
{
    Menu P;

    P = (Menu)malloc(sizeof(struct Menus));
    P->link = NULL;
    P->next_Menu=NULL;
    P->name = Menu_price_name[i];
    P->font_num= price_font_num[i];
    P->price=Menu_price_num[i];
    P->function_mode=mode;
    P->price_mode=1;
    (*pRear)->link = P;
    *pRear = P; 
    return P;
}

我们还需要新的二级菜单初始化程序,暂定为价格菜单初始化程序,其原理是在当前节点的next_Menu创建一个新的菜单(循环链表)。

void Menu_Price_Init(Menu price,int mode)
{
    Menu Start, Rear, t, End;
    int num;
    num= sizeof(Menu_price_num)/ sizeof(Menu_price_num[0]);
    Start = (Menu)malloc(sizeof(struct Menus));
    Start->link = NULL;
    Rear = Start;
    for (int i = 0; i < num-1; ++i) {
        Attach_Menu_Price(&Rear, i,mode);
    }
    End= Attach_Menu_Price(&Rear, num-1,mode);
    t = Start; Start = Start->link; free(t);
    End->link = Start;
    price->next_Menu=Start;

}

那么,我们还需要在一级菜单的初始化程序中,修改一下,添加一个if判断在哪项菜单添加二级菜单:

Menu Menu_Init(void)
{
    Menu Start, Rear, t, End;
    int num=5;
    num= sizeof(Menu_name)/ sizeof(Menu_name[0]);
    Start = (Menu)malloc(sizeof(struct Menus));
    Start->link = NULL;
    Rear = Start;
    for (int i = 0; i < num-1; i++) {
        Attach_Menu(&Rear, i);        
        if (! strcmp((const char *)Rear->name,"Cal_Price")||! strcmp((const char *)Rear->name,"Add_Price"))
        {
            Menu_Price_Init(Rear,i);
        }  
    }
    End= Attach_Menu(&Rear, num-1);
    t = Start; Start = Start->link; free(t);
    End->link = Start;
    return Start;
}

至此,一个完整的二级菜单创建完毕,如果需要三级菜单,则需要在二级菜单的初始化程序中,假如if判断,步骤同二级菜单建立过程一样。

那么,在按键菜单功能中,如何进行菜单的选择呢?
如果按键为菜单、选择、确认。
我们需要定义两个Menu全局变量,第一个为Start,第二个为pRear,Start指向的菜单的第一项,pRear
指向的是当前选择的菜单,默认为第一项。
通过按键中断,如果是Select可以移动pRear移动到当前指向菜单的下一项(pRear=pRear->link),pRear指向哪一项,就执行pRear所指的菜单的功能函数。当需要重新选择功能时(即再次进入菜单时,将pRear复位,令pRear=Start即可),令pRear指向开头的节点即可。如果是确认按键,先判断当前所指菜单是否有子菜单,如果有,进入子菜单,如果没有,再执行相应的函数即可。
注意:(再用按键中断进行菜单选择时,加入按键防抖程序处理效果会更好!)

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服