找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 31458|回复: 44
打印 上一主题 下一主题
收起左侧

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

  [复制链接]
跳转到指定楼层
楼主
ID:227255 发表于 2017-8-12 14:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
运行效果图:

选择查询项:

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

此时按返回键,将会返回到第二个图片中的界面
首先定义一个菜单结构
  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)

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏53 分享淘帖 顶4 踩
回复

使用道具 举报

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

使用道具 举报

沙发
ID:236322 发表于 2017-9-28 15:51 | 只看该作者
好东西,无限级菜单扩展
回复

使用道具 举报

无效楼层,该帖已经被删除
地板
ID:268890 发表于 2017-12-29 15:37 | 只看该作者
好像下载,马上去赚币
回复

使用道具 举报

5#
无效楼层,该帖已经被删除
6#
ID:278406 发表于 2018-1-21 20:36 | 只看该作者
想学习下下,刚好 遇到
回复

使用道具 举报

7#
无效楼层,该帖已经被删除
8#
无效楼层,该帖已经被删除
9#
ID:299412 发表于 2018-3-30 14:24 | 只看该作者
不用下载,这这些够用了,非常感谢。
回复

使用道具 举报

10#
ID:185372 发表于 2018-4-20 09:24 | 只看该作者
这个可以有。正苦于液晶显示跟控制问题呢。感谢
回复

使用道具 举报

11#
ID:316075 发表于 2018-4-25 11:40 | 只看该作者
esmember 发表于 2018-4-20 09:24
这个可以有。正苦于液晶显示跟控制问题呢。感谢

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

使用道具 举报

12#
无效楼层,该帖已经被删除
13#
无效楼层,该帖已经被删除
14#
无效楼层,该帖已经被删除
15#
ID:143232 发表于 2018-7-4 09:42 | 只看该作者

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

使用道具 举报

16#
无效楼层,该帖已经被删除
17#
ID:121852 发表于 2018-8-14 17:07 | 只看该作者
感谢楼主,正愁控制不知道怎么去做
回复

使用道具 举报

18#
无效楼层,该帖已经被删除
19#
ID:307825 发表于 2018-9-3 17:00 | 只看该作者
牛人啊,正在做这个
回复

使用道具 举报

20#
无效楼层,该帖已经被删除
21#
ID:188720 发表于 2018-11-24 14:43 | 只看该作者
请教一下,第6行的 u8 *menuItems[17] 不需要定义成二维数组吗?
回复

使用道具 举报

22#
无效楼层,该帖已经被删除
23#
无效楼层,该帖已经被删除
24#
无效楼层,该帖已经被删除
25#
无效楼层,该帖已经被删除
26#
ID:464365 发表于 2019-4-2 08:55 | 只看该作者
好东西,可惜没分了。。。。
回复

使用道具 举报

27#
ID:457896 发表于 2019-4-2 16:57 | 只看该作者
MARK  THIS
回复

使用道具 举报

28#
ID:499981 发表于 2019-5-6 14:38 | 只看该作者
感谢楼主分享,实在太好了
回复

使用道具 举报

29#
无效楼层,该帖已经被删除
30#
ID:37147 发表于 2019-5-11 21:55 | 只看该作者
求整个包 下载下来 编译不通过哎
回复

使用道具 举报

31#
无效楼层,该帖已经被删除
32#
ID:564898 发表于 2019-6-23 22:49 来自触屏版 | 只看该作者
这个程序厉害,学习下
回复

使用道具 举报

33#
无效楼层,该帖已经被删除
34#
ID:378467 发表于 2019-7-12 10:56 | 只看该作者
你好 楼主请问反白一行怎么实现的呢
回复

使用道具 举报

35#
无效楼层,该帖已经被删除
36#
无效楼层,该帖已经被删除
37#
ID:270390 发表于 2020-2-5 17:09 | 只看该作者
非常棒的介绍
回复

使用道具 举报

38#
ID:240034 发表于 2020-2-5 19:04 | 只看该作者
12864显示屏是带字库,还是不带字库的?
回复

使用道具 举报

39#
ID:375003 发表于 2020-2-6 16:36 | 只看该作者
这个多级菜单写的好,精辟,不象有的多级菜单程序代码多,难懂
回复

使用道具 举报

40#
无效楼层,该帖已经被删除
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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