单片机交流
直播中

fansz

8年用户 1243经验值
擅长:制造/封装
私信 关注
[问答]

在按键菜单功能中,如何进行菜单的选择呢

在按键菜单功能中,如何进行菜单的选择呢?
如何实现基于单片机等C语言开发环境的菜单程序设计?

回帖(1)

石璞璞

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

更多回帖

发帖
×
20
完善资料,
赚取积分