二级菜单的建立
在本例中,二级菜单只涉及到价格属性,因此,我们只需要在原先定义的节点中添加价格变量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指向开头的节点即可。如果是确认按键,先判断当前所指菜单是否有子菜单,如果有,进入子菜单,如果没有,再执行相应的函数即可。
注意:(再用按键中断进行菜单选择时,加入按键防抖程序处理效果会更好!)
二级菜单的建立
在本例中,二级菜单只涉及到价格属性,因此,我们只需要在原先定义的节点中添加价格变量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指向开头的节点即可。如果是确认按键,先判断当前所指菜单是否有子菜单,如果有,进入子菜单,如果没有,再执行相应的函数即可。
注意:(再用按键中断进行菜单选择时,加入按键防抖程序处理效果会更好!)
举报