标题: 12864多级菜单实现,可方便实现无限级菜单(um0549) [打印本页]

作者: feifei_51    时间: 2017-8-12 14:36
标题: 12864多级菜单实现,可方便实现无限级菜单(um0549)
运行效果图:

选择查询项:

选择查询项并按确定键后:

此时按返回键,将会返回到第二个图片中的界面
首先定义一个菜单结构
  1. typedef struct menu//定义一个菜单
  2. {
  3. u8 range_from,range_to; //当前显示的项开始及结束序号
  4. u8 itemCount;//项目总数
  5. u8 selected;//当前选择项
  6. u8 *menuItems[17];//菜单项目
  7. struct menu **subMenus;//子菜单
  8. struct menu *parent;//上级菜单 ,如果是顶级则为null
  9. void (**func)();//选择相应项按确定键后执行的函数

  10. }Menu;

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

  20. Menu searchMenu = {//查询菜单
  21. 0,3,6,0,
  22. {
  23.   "记帐记录明细    ",
  24.   "未采集记录数    ",
  25.   "设备机号        ",
  26.   "本机IP地址      ",
  27.   "记录空间大小    ",
  28.   "软件版本        "
  29. }
  30. };
  31. Menu *currentMenu;//当前的菜单

  32. 用于显示菜单项
  33. void display(u8 line) //显示菜单项并设置选中的项反白
  34. {
  35. int i;
  36. line = 3-(currentMenu->range_to-line);
  37. Lcd_Fill(0x00);
  38. for(i = 0;i<4;i++)
  39. {
  40.   Lcd_Disp(i+1,0,currentMenu->menuItems[i+currentMenu->range_from]);
  41. }
  42. highlight(0,line,8,255);//反白显示指定行
  43. }
  44. void func(void)
  45. {

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

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

  67. currentMenu = &MainMenu;

  68. }

  69. main

  70. int main(void)
  71. {

  72.   delay_init();
  73.   uart_init(9600);
  74.   Lcd_Init();
  75.   KEY_Init();
  76.   initMenu();
  77.   display(currentMenu->selected);
  78.   while(1)
  79. {
  80.   key = KEY_Scan();
  81.   if(key == 0)
  82.   {
  83.    delay_ms(10);
  84.    continue;
  85.   }
  86.   printf("key %d is press",key);
  87.   switch(key)
  88.   {
  89.    case 12://向上
  90.     if(currentMenu->selected == 0)//到了第一项
  91.      break;
  92.     else
  93.     {
  94.      currentMenu->selected--;
  95.      if(currentMenu->selected < currentMenu->range_from)//更新显示的区域
  96.      {
  97.       currentMenu->range_from = currentMenu->selected;
  98.       currentMenu->range_to = currentMenu->range_from+3;
  99.      }
  100.      display(currentMenu->selected);
  101.      break;
  102.     }
  103.    case 8://向下
  104.     if(currentMenu->selected == currentMenu->itemCount-1)
  105.      break;
  106.     else
  107.     {
  108.      currentMenu->selected++;
  109.      if(currentMenu->selected>currentMenu->range_to)
  110.      {
  111.       currentMenu->range_to = currentMenu->selected;
  112.       currentMenu->range_from = currentMenu->range_to-3;
  113.      }
  114.      display(currentMenu->selected);
  115.      break;
  116.     }
  117.    case 4://Enter键
  118.    {
  119.     if(currentMenu->subMenus[currentMenu->selected] !=NULL)
  120.     {
  121.      currentMenu = currentMenu->subMenus[currentMenu->selected];
  122.      display(0);
  123.     }
  124.     else
  125.     {
  126.      if(currentMenu->func[currentMenu->selected] != NULL)
  127.      {
  128.       currentMenu->func[currentMenu->selected]();//执行相应的函数
  129.       display(currentMenu->selected);//返回后恢复原来的菜单状态
  130.      }
  131.     }
  132.     break;
  133.    }
  134.    case 3://返回键
  135.    {
  136.     if(currentMenu->parent!=NULL)//父菜单不为空,将显示父菜单
  137.     {
  138.      currentMenu = currentMenu->parent;
  139.      display(currentMenu->selected);
  140.     }
  141.     break;
  142.    }
  143.    default:
  144.      break;
  145.   }
  146.   delay_ms(10);
  147. }
  148. }
复制代码

ST公司关于STM3210E-EVAL演示版本的工程中就有菜单的代码,现分享给大家:
um0549.rar (5.26 MB, 下载次数: 1040)


作者: fengye20101112    时间: 2017-9-28 15:51
好东西,无限级菜单扩展
作者: Ning.    时间: 2017-12-29 15:37
好像下载,马上去赚币
作者: qinwenfang    时间: 2018-1-21 20:36
想学习下下,刚好 遇到
作者: Luckyfa    时间: 2018-3-30 14:24
不用下载,这这些够用了,非常感谢。
作者: esmember    时间: 2018-4-20 09:24
这个可以有。正苦于液晶显示跟控制问题呢。感谢
作者: 何必刻意    时间: 2018-4-25 11:40
esmember 发表于 2018-4-20 09:24
这个可以有。正苦于液晶显示跟控制问题呢。感谢

亲 弄出来了吗?能分享一下吗?
作者: mjqing    时间: 2018-7-4 09:42

好东西,无限级菜单扩展
作者: vipwhaha    时间: 2018-8-14 17:07
感谢楼主,正愁控制不知道怎么去做
作者: quinn1    时间: 2018-9-3 17:00
牛人啊,正在做这个
作者: 红烧鱼头    时间: 2018-11-24 14:43
请教一下,第6行的 u8 *menuItems[17] 不需要定义成二维数组吗?
作者: scnclisir1    时间: 2019-4-2 08:55
好东西,可惜没分了。。。。
作者: toney123456    时间: 2019-4-2 16:57
MARK  THIS
作者: yy07090704    时间: 2019-5-6 14:38
感谢楼主分享,实在太好了
作者: 周鹏    时间: 2019-5-11 21:55
求整个包 下载下来 编译不通过哎
作者: 青青梓衿    时间: 2019-6-23 22:49
这个程序厉害,学习下
作者: iamarookie    时间: 2019-7-12 10:56
你好 楼主请问反白一行怎么实现的呢
作者: njchenmin    时间: 2020-2-5 17:09
非常棒的介绍
作者: lvlv99    时间: 2020-2-5 19:04
12864显示屏是带字库,还是不带字库的?
作者: guangshi_wq    时间: 2020-2-6 16:36
这个多级菜单写的好,精辟,不象有的多级菜单程序代码多,难懂
作者: 51hdz3356619    时间: 2020-4-13 09:02
太好了,直接收藏。。。
作者: mini92    时间: 2020-4-21 23:38
好程序值得收藏
作者: wqflyy    时间: 2020-4-27 18:12
正在做多级菜单显示的项目,发现这个挺好的
作者: kevin_cgl    时间: 2020-5-8 20:38
正在找这个,我用的51,不知道是否通用呢
作者: 2399902214    时间: 2020-5-11 11:13
不知道可不可以用在320240LCD仿真电路上

作者: 大米袋    时间: 2020-5-11 12:41
感谢分享
作者: huirunlong    时间: 2020-6-14 12:22
这个挺好的
作者: 炸鸡店老板炸了    时间: 2020-7-27 11:53
多级菜单还有其它的嘛
作者: 炸鸡店老板炸了    时间: 2020-7-28 17:27
你的显示没有设计显示坐标的嘛
作者: 炸鸡店老板炸了    时间: 2020-7-28 17:33
现在可以实现得了翻页,但不知道怎样实现在同一级菜单中来回切换(如:我显示屏只能显示四项目录,但我的目录一共有八项,怎样用按键来控制上下切换滚动),指点会了可以给一二百积分
作者: tomsmiss123    时间: 2020-7-30 15:25
非常感谢楼主分享,谢谢。。。
作者: 15973185691    时间: 2020-8-8 08:48
炸鸡店老板炸了 发表于 2020-7-28 17:33
现在可以实现得了翻页,但不知道怎样实现在同一级菜单中来回切换(如:我显示屏只能显示四项目录,但我的目 ...

你搞定了没,我再在也需要做的跟你的也差不多
作者: 15973185691    时间: 2020-8-8 12:21
炸鸡店老板炸了 发表于 2020-7-28 17:33
现在可以实现得了翻页,但不知道怎样实现在同一级菜单中来回切换(如:我显示屏只能显示四项目录,但我的目 ...

在吗,能用吗?
作者: 鸽子1988    时间: 2020-9-3 10:08
下载文件和上文对不上。不愿意把资料分享,就不要提供下载包。随便弄一个下载包出来算什么
作者: 布莱克先生    时间: 2020-9-5 08:47
实在是太有用了
作者: 蛋黄派@SZPT    时间: 2020-9-12 20:16
MARK 一下,正好需要用到。
作者: cyrs    时间: 2021-1-27 18:01
是编码器控制吗
作者: 网络孤客    时间: 2021-2-2 10:47
本机IP是如何输入的?
作者: zlrong    时间: 2021-2-19 22:48
多谢了!研究研究
作者: chinajhgjhg    时间: 2021-2-20 15:59
这个太有价值了。
作者: cfh435713942    时间: 2021-5-8 10:36
我的怎么打不开
作者: shu_007    时间: 2021-5-13 10:21
12864有带中文字库和没带的两种
作者: sr861126    时间: 2021-8-31 17:04
下载的代码不是12864的,是oled0.96的代码
作者: 孟特特    时间: 2021-9-8 21:24
太恶心啦 没什么用 下载的东西和这贴的完全两码事
作者: Y!NG    时间: 2022-8-18 17:04
太复杂 ,没看懂,好像不是用链表实现的




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1