找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 27371|回复: 44
收起左侧

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

  [复制链接]
ID:227255 发表于 2017-8-12 14:36 | 显示全部楼层 |阅读模式
运行效果图:
46bfe1931c0f6545cbb566d45bb2ecd9_994.jpg
选择查询项:
736b9f3ccc38ef7d11f21da03f2e21cb_986.jpg
选择查询项并按确定键后:
93385e78de732c5d44f5ad7e44aa40cb_912.jpg
此时按返回键,将会返回到第二个图片中的界面
首先定义一个菜单结构
  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, 下载次数: 1022)

评分

参与人数 1黑币 +16 收起 理由
王朗的诱惑 + 16 赞一个!

查看全部评分

回复

使用道具 举报

ID:500999 发表于 2020-7-28 17:33 | 显示全部楼层
现在可以实现得了翻页,但不知道怎样实现在同一级菜单中来回切换(如:我显示屏只能显示四项目录,但我的目录一共有八项,怎样用按键来控制上下切换滚动),指点会了可以给一二百积分
回复

使用道具 举报

ID:236322 发表于 2017-9-28 15:51 | 显示全部楼层
好东西,无限级菜单扩展
回复

使用道具 举报

ID:268890 发表于 2017-12-29 15:37 | 显示全部楼层
好像下载,马上去赚币
回复

使用道具 举报

ID:278406 发表于 2018-1-21 20:36 | 显示全部楼层
想学习下下,刚好 遇到
回复

使用道具 举报

ID:299412 发表于 2018-3-30 14:24 | 显示全部楼层
不用下载,这这些够用了,非常感谢。
回复

使用道具 举报

ID:185372 发表于 2018-4-20 09:24 | 显示全部楼层
这个可以有。正苦于液晶显示跟控制问题呢。感谢
回复

使用道具 举报

ID:316075 发表于 2018-4-25 11:40 | 显示全部楼层
esmember 发表于 2018-4-20 09:24
这个可以有。正苦于液晶显示跟控制问题呢。感谢

亲 弄出来了吗?能分享一下吗?
回复

使用道具 举报

ID:143232 发表于 2018-7-4 09:42 | 显示全部楼层

好东西,无限级菜单扩展
回复

使用道具 举报

ID:121852 发表于 2018-8-14 17:07 | 显示全部楼层
感谢楼主,正愁控制不知道怎么去做
回复

使用道具 举报

ID:307825 发表于 2018-9-3 17:00 | 显示全部楼层
牛人啊,正在做这个
回复

使用道具 举报

ID:188720 发表于 2018-11-24 14:43 | 显示全部楼层
请教一下,第6行的 u8 *menuItems[17] 不需要定义成二维数组吗?
回复

使用道具 举报

ID:464365 发表于 2019-4-2 08:55 | 显示全部楼层
好东西,可惜没分了。。。。
回复

使用道具 举报

ID:457896 发表于 2019-4-2 16:57 | 显示全部楼层
MARK  THIS
回复

使用道具 举报

ID:499981 发表于 2019-5-6 14:38 | 显示全部楼层
感谢楼主分享,实在太好了
回复

使用道具 举报

ID:37147 发表于 2019-5-11 21:55 | 显示全部楼层
求整个包 下载下来 编译不通过哎
回复

使用道具 举报

ID:564898 发表于 2019-6-23 22:49 来自手机 | 显示全部楼层
这个程序厉害,学习下
回复

使用道具 举报

ID:378467 发表于 2019-7-12 10:56 | 显示全部楼层
你好 楼主请问反白一行怎么实现的呢
回复

使用道具 举报

ID:270390 发表于 2020-2-5 17:09 | 显示全部楼层
非常棒的介绍
回复

使用道具 举报

ID:240034 发表于 2020-2-5 19:04 | 显示全部楼层
12864显示屏是带字库,还是不带字库的?
回复

使用道具 举报

ID:375003 发表于 2020-2-6 16:36 | 显示全部楼层
这个多级菜单写的好,精辟,不象有的多级菜单程序代码多,难懂
回复

使用道具 举报

ID:286761 发表于 2020-4-13 09:02 | 显示全部楼层
太好了,直接收藏。。。
回复

使用道具 举报

ID:733461 发表于 2020-4-21 23:38 | 显示全部楼层
好程序值得收藏
回复

使用道具 举报

ID:739523 发表于 2020-4-27 18:12 | 显示全部楼层
正在做多级菜单显示的项目,发现这个挺好的
回复

使用道具 举报

ID:747196 发表于 2020-5-8 20:38 | 显示全部楼层
正在找这个,我用的51,不知道是否通用呢
回复

使用道具 举报

ID:712792 发表于 2020-5-11 11:13 | 显示全部楼层
不知道可不可以用在320240LCD仿真电路上
回复

使用道具 举报

ID:446681 发表于 2020-5-11 12:41 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:502805 发表于 2020-6-14 12:22 | 显示全部楼层
这个挺好的
回复

使用道具 举报

ID:500999 发表于 2020-7-27 11:53 | 显示全部楼层
多级菜单还有其它的嘛
回复

使用道具 举报

ID:500999 发表于 2020-7-28 17:27 | 显示全部楼层
你的显示没有设计显示坐标的嘛
回复

使用道具 举报

ID:471579 发表于 2020-7-30 15:25 | 显示全部楼层
非常感谢楼主分享,谢谢。。。
回复

使用道具 举报

ID:255514 发表于 2020-8-8 08:48 | 显示全部楼层
炸鸡店老板炸了 发表于 2020-7-28 17:33
现在可以实现得了翻页,但不知道怎样实现在同一级菜单中来回切换(如:我显示屏只能显示四项目录,但我的目 ...

你搞定了没,我再在也需要做的跟你的也差不多
回复

使用道具 举报

ID:255514 发表于 2020-8-8 12:21 来自手机 | 显示全部楼层
炸鸡店老板炸了 发表于 2020-7-28 17:33
现在可以实现得了翻页,但不知道怎样实现在同一级菜单中来回切换(如:我显示屏只能显示四项目录,但我的目 ...

在吗,能用吗?
回复

使用道具 举报

ID:813815 发表于 2020-9-3 10:08 | 显示全部楼层
下载文件和上文对不上。不愿意把资料分享,就不要提供下载包。随便弄一个下载包出来算什么
回复

使用道具 举报

ID:292460 发表于 2020-9-5 08:47 | 显示全部楼层
实在是太有用了
回复

使用道具 举报

ID:685684 发表于 2020-9-12 20:16 | 显示全部楼层
MARK 一下,正好需要用到。
回复

使用道具 举报

ID:81138 发表于 2021-1-27 18:01 | 显示全部楼层
是编码器控制吗
回复

使用道具 举报

ID:470485 发表于 2021-2-2 10:47 | 显示全部楼层
本机IP是如何输入的?
回复

使用道具 举报

ID:88756 发表于 2021-2-19 22:48 | 显示全部楼层
多谢了!研究研究
回复

使用道具 举报

ID:643918 发表于 2021-2-20 15:59 | 显示全部楼层
这个太有价值了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表