12864多级菜单实现,可方便实现无限级菜单

运行效果

在这里插入图片描述
选择查询项
在这里插入图片描述
选择查询项并按确定键后
在这里插入图片描述
此时按返回键,将会返回到第二个图片中的界面,首先定义一个菜单结构

菜单程序

话不多说,直接贴代码!!!

typedef struct menu//定义一个菜单
{
u8 range_from,range_to; //当前显示的项开始及结束序号
u8 itemCount;//项目总数
u8 selected;//当前选择项
u8 *menuItems[17];//菜单项目
struct menu **subMenus;//子菜单
struct menu *parent;//上级菜单 ,如果是顶级则为null
void (**func)();//选择相应项按确定键后执行的函数

}Menu;

Menu MainMenu = { //定义主菜单
0,3,4,0,//默认显示0-3项,总共4项,当前选择第0
  {
  "设置1          ",
  "设置2          ",
  "输入指令发送    ",
  "查询           "
  }
};

Menu searchMenu = {//查询菜单
0,3,6,0,
{
  "记帐记录明细    ",
  "未采集记录数    ",
  "设备机号        ",
  "本机IP地址      ",
  "记录空间大小    ",
  "软件版本        "
}
};
Menu *currentMenu;//当前的菜单

用于显示菜单项
void display(u8 line) //显示菜单项并设置选中的项反白
{
int i;
line = 3-(currentMenu->range_to-line);
Lcd_Fill(0x00);
for(i = 0;i<4;i++)
{
  Lcd_Disp(i+1,0,currentMenu->menuItems[i+currentMenu->range_from]);
}
highlight(0,line,8,255);//反白显示指定行
}
void func(void)
{

printf("hello");
}
初始化菜单:
void initMenu()
{
MainMenu.subMenus = malloc(sizeof(&MainMenu)*4);
MainMenu.subMenus[0] = NULL;//13项没有子菜单置null,选择后程序会调用func中相应项中的函数
MainMenu.subMenus[1] = NULL;
MainMenu.subMenus[2] = NULL;
MainMenu.subMenus[3] = &searchMenu;//第四项查询有子菜单
MainMenu.func = malloc(sizeof(&func)*4);
MainMenu.func[0] = NULL;
MainMenu.func[1] = NULL;
MainMenu.func[2] = &func;//当选择了并按了确定,会执行func函数
MainMenu.func[3] = NULL;
MainMenu.parent = NULL;//表示是顶级菜单

searchMenu.subMenus = malloc(sizeof(&searchMenu)*6);
searchMenu.subMenus[0] = searchMenu.subMenus[1] = searchMenu.subMenus[2] = searchMenu.subMenus[3] = searchMenu.subMenus[4] = searchMenu.subMenus[5] = NULL;
searchMenu.func = malloc(sizeof(&printf)*6);
searchMenu.func[0] = searchMenu.func[2] = searchMenu.func[2] = searchMenu.func[3] = searchMenu.func[4] = searchMenu.func[5] = NULL;
searchMenu.parent = &MainMenu;//上一级菜单是MainMenu.进入查询子菜单后按返回键,将会显示这个菜单 

currentMenu = &MainMenu;

}

main

int main(void)
{

  delay_init();
  uart_init(9600);
  Lcd_Init();
  KEY_Init();
  initMenu();
  display(currentMenu->selected);
  while(1)
{
  key = KEY_Scan();
  if(key == 0)
  {
   delay_ms(10);
   continue;
  }
  printf("key %d is press",key);
  switch(key)
  {
   case 12://向上
    if(currentMenu->selected == 0)//到了第一项
     break;
    else
    {
     currentMenu->selected--;
     if(currentMenu->selected < currentMenu->range_from)//更新显示的区域
     {
      currentMenu->range_from = currentMenu->selected;
      currentMenu->range_to = currentMenu->range_from+3;
     }
     display(currentMenu->selected);
     break;
    }
   case 8://向下
    if(currentMenu->selected == currentMenu->itemCount-1)
     break;
    else
    {
     currentMenu->selected++;
     if(currentMenu->selected>currentMenu->range_to)
     {
      currentMenu->range_to = currentMenu->selected;
      currentMenu->range_from = currentMenu->range_to-3;
     }
     display(currentMenu->selected);
     break;
    }
   case 4://Enter键
   {
    if(currentMenu->subMenus[currentMenu->selected] !=NULL)
    {
     currentMenu = currentMenu->subMenus[currentMenu->selected];
     display(0);
    }
    else
    {
     if(currentMenu->func[currentMenu->selected] != NULL)
     {
      currentMenu->func[currentMenu->selected]();//执行相应的函数
      display(currentMenu->selected);//返回后恢复原来的菜单状态
     }
    }
    break;
   }
   case 3://返回键
   {
    if(currentMenu->parent!=NULL)//父菜单不为空,将显示父菜单
    {
     currentMenu = currentMenu->parent;
     display(currentMenu->selected);
    }
    break;
   }
   default:
     break;
  }
  delay_ms(10);
}
}

到这边我相信你已经看懂了,觉得有用的帮忙点个赞!!!

### 回答1: LCD12864多级菜单实现是通过显示屏上的不同菜单实现用户与设备交互和操作的过程。具体实现方式如下: 1. 初始化LCD12864屏幕:首先需要初始化LCD12864屏幕,确保其能正常显示。 2. 设计菜单结构:根据实际需求,设计多级菜单的结构,包括主菜单和子菜单。主菜单是一菜单,子菜单可以有多,组成多级菜单。 3. 显示菜单:将主菜单的选项显示在LCD12864屏幕上,使用屏幕上的光标选择相应的选项。 4. 用户选择选项:通过按键或触摸屏等输入设备,用户可以选择不同的菜单选项。 5. 显示菜单:根据用户选择的菜单选项,在LCD12864屏幕上显示对应的子菜单选项。 6. 用户选择子菜单选项:用户可以通过光标或触摸屏幕等输入设备选择子菜单中的具体选项。 7. 执行操作:根据用户选择的子菜单选项,执行相应的操作,例如显示特定信息、设置参数、执行功能等。 8. 返回上菜单:用户可以通过按返回键返回上一菜单,或者通过选择特定的返回选项返回。 9. 循环操作:循环执行上述步骤,使用户可以在不同菜单之间切换和操作。 通过以上步骤,LCD12864多级菜单实现可以提供用户友好的界面,使用户能够方便地进行操作和配置设备。在实际应用中,还可以根据需要进行其他功能的拓展,例如增加菜单项、添加快捷操作等。 ### 回答2: LCD12864多级菜单实现主要分为以下几个步骤: 1. 初始化LCD屏幕:将LCD屏幕模式设置为128x64点阵模式,并清空屏幕内容。 2. 定义菜单数据结构:根据实际需求定义菜单的结构体,包括菜单名称、菜单项数目、菜单项内容等信息。可以使用数组、链表等数据结构存储菜单数据。 3. 显示菜单:根据菜单数据结构,显示菜单菜单项。可以使用LCD屏幕的绘图函数将菜单项逐个显示出来,同时通过光标或其他标记方式来确定当前选中的菜单项。 4. 处理菜单项选择:通过按键、遥控器等输入方式来选择菜单项。根据不同的输入方式,可以监听对应的按键或遥控器指令,并根据当前选中的菜单项进行相应的操作。 5. 处理上下菜单切换:当选择某个菜单项时,根据当前菜单项的类型(菜单项还是功能项)进行不同的处理。如果是菜单项,需要切换到下一菜单,更新菜单数据结构,并重新显示菜单项。如果是功能项,执行对应的功能代码。 6. 返回上一菜单:在下一菜单中,可以通过返回按钮或其他指令返回上一菜单。返回操作需要更新菜单数据结构,重新显示上一菜单菜单项。 7. 退出菜单系统:当用户退出菜单系统时,清空LCD屏幕内容,并进行必要的资源释放。 通过以上步骤,我们可以实现LCD12864多级菜单的功能,实现用户友好的菜单操作界面,方便用户进行选择和操作。同时,根据具体需求,可以进行个性化的定制和扩展。 ### 回答3: LCD12864多级菜单实现的基本思路是利用LCD12864显示屏和控制器的特性,通过设置不同的菜单和相关操作进行菜单的切换和功能的实现。 首先,需要确定菜单的层结构,可以分为一菜单、二菜单等。每一菜单都有相应的菜单选项和功能操作。 接下来,需要定义菜单切换的条件和方式。通常可以使用按钮、旋钮等控制器来进行菜单项的选择和切换。根据控制器的信号,可以判断当前所处的菜单菜单项,并显示在LCD12864上。 在菜单实现过程中,需要编写相应的代码逻辑。可以通过判断当前所处的菜单菜单项来执行相应的功能操作。例如,当选择某个菜单项后,可以进入下一菜单或执行相应的功能操作,如打开某个功能模块、进行一些设置操作等。不同菜单菜单项之间的切换和操作都需要根据具体需求进行编写。 最后,需要在LCD12864显示当前的菜单和选项内容。可以使用适当的图形和文字来实现清晰易懂的显示效果。在显示的同时,还可以根据需要进行一些动态效果的增加,如闪烁、滚动等,以增强用户的交互体验。 综上所述,LCD12864多级菜单实现涉及到层结构的定义、菜单切换的控制、代码逻辑的编写和LCD12864显示设置等方面。只要根据具体需求和硬件特性进行相应的配置和编码工作,就可以实现一个功能完善的LCD12864多级菜单系统。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森旺电子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值