找回密码
 立即注册

QQ登录

只需一步,快速开始

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

12864多级菜单实现STM32源程序,可方便实现无限级菜单

  [复制链接]
跳转到指定楼层
楼主
分享一个lcd12864液晶屏的多级菜单实现方法,可方便实现无限级菜单
这是移植别人,加以修改的,支持从第一行菜单直接跳转到最后一行,反之如此
由于不知道怎么通过函数指针传递参数,所以在结构体里另定义了一个变,用来传
递参数量,如各位有更好的改法,,请在贴里贴出




所有资料51hei提供下载:
多级菜单 按键切换.zip (122.07 KB, 下载次数: 636)

单片机源程序如下:
  1. #include "muti_menu.h"
  2. #include "stdlib.h"
  3. #include "stdio.h"
  4. #include "string.h"

  5. Menu Menu_main={
  6.         3,0,
  7.         "    主菜单",
  8.         {
  9.                 "显示",
  10.                 "设置",
  11.                 "更多"
  12.         }
  13. };

  14. Menu Menu_set={
  15.         2, 0,
  16.         "    设置",
  17.         {
  18.                 "运行参数",
  19.                 "参数2"
  20.         }
  21. };

  22. Menu Menu_more={
  23.         8,0,
  24.         "    更多",
  25.         {
  26.                 "菜单1",
  27.                 "菜单2",
  28.                 "菜单3",
  29.                 "菜单4",
  30.                 "菜单5",
  31.                 "菜单6",
  32.                 "菜单7",
  33.                 "菜单8"
  34.         }
  35. };
  36.         
  37. Menu Interface_showData={
  38.         0,0
  39. };
  40. Menu Interface_setRunningData={
  41.         0,0
  42. };
  43. Menu Interface_showTest={
  44.         0,0
  45. };

  46. struct currMenu
  47. {
  48.         Menu *menu;                           //指向的菜单指针
  49.         //u8 selectRow;      //当前选择的是哪一项
  50.         
  51.         
  52. }CurrMenu;


  53. void keyEvent_menuUP(void);
  54. void keyEvent_menuDOWN(void);
  55. void keyEvent_menuENTER(void);
  56. void keyEvent_menuBACK(void);
  57. void keyEvent_Empty(void);
  58. void GUIfunc_showTest(void);
  59. void GUIfunc_setRunningData(void);
  60. void GUIfunc_showData(void);

  61. void initMenu(void)
  62. {
  63.         u8 i;
  64.         Menu_main.submenuPtr=malloc(sizeof(&Menu_main)*Menu_main.num);
  65.         Menu_main.submenuPtr[0]=&Interface_showData;
  66.         Menu_main.submenuPtr[1]=&Menu_set;
  67.         Menu_main.submenuPtr[2]=&Menu_more;
  68.         Menu_main.parent=NULL;
  69.         Menu_main.funcKeyUP=&keyEvent_menuUP;
  70.         Menu_main.funcKeyDOWN=&keyEvent_menuDOWN;
  71.         Menu_main.funcKeyLEFT=&keyEvent_Empty;
  72.         Menu_main.funcKeyRIGHT=&keyEvent_menuENTER;
  73.         
  74.         Menu_set.submenuPtr=malloc(sizeof(&Menu_set)*Menu_set.num);
  75.         Menu_set.submenuPtr[0]=&Interface_setRunningData;
  76.         Menu_set.submenuPtr[1]=&Interface_showTest;
  77.         Menu_set.parent=&Menu_main;
  78.         Menu_set.funcKeyUP=&keyEvent_menuUP;
  79.         Menu_set.funcKeyDOWN=&keyEvent_menuDOWN;
  80.         Menu_set.funcKeyLEFT=&keyEvent_menuBACK;
  81.         Menu_set.funcKeyRIGHT=&keyEvent_menuENTER;
  82.         
  83.         
  84.         Menu_more.submenuPtr=malloc(sizeof(&Menu_more)*Menu_more.num);
  85.         for(i=0;i<Menu_more.num;i++) Menu_more.submenuPtr[i]=&Interface_showTest;
  86.         Menu_more.parent=&Menu_main;
  87.         Menu_more.funcKeyUP=&keyEvent_menuUP;
  88.         Menu_more.funcKeyDOWN=&keyEvent_menuDOWN;
  89.         Menu_more.funcKeyLEFT=&keyEvent_menuBACK;
  90.         Menu_more.funcKeyRIGHT=&keyEvent_menuENTER;
  91.         
  92.         Interface_showData.func=&GUIfunc_showData;
  93.         Interface_showData.parent=&Menu_main;
  94.         Interface_showData.funcKeyUP=&keyEvent_Empty;
  95.         Interface_showData.funcKeyDOWN=&keyEvent_Empty;
  96.         Interface_showData.funcKeyLEFT=&keyEvent_menuBACK;
  97.         Interface_showData.funcKeyRIGHT=&keyEvent_Empty;
  98.         
  99.         Interface_setRunningData.func=&GUIfunc_setRunningData;
  100.         Interface_setRunningData.parent=&Menu_set;
  101.         Interface_setRunningData.funcKeyUP=&keyEvent_Empty;
  102.         Interface_setRunningData.funcKeyDOWN=&keyEvent_Empty;
  103.         Interface_setRunningData.funcKeyLEFT=&keyEvent_menuBACK;
  104.         Interface_setRunningData.funcKeyRIGHT=&keyEvent_Empty;
  105.         
  106.         Interface_showTest.func=&GUIfunc_showTest;
  107.         Interface_showTest.parent=&Menu_more;
  108.         Interface_showTest.funcKeyUP=&keyEvent_Empty;
  109.         Interface_showTest.funcKeyDOWN=&keyEvent_Empty;
  110.         Interface_showTest.funcKeyLEFT=&keyEvent_menuBACK;
  111.         Interface_showTest.funcKeyRIGHT=&keyEvent_Empty;
  112.         
  113.         
  114.         CurrMenu.menu=&Menu_main;
  115.         //CurrMenu.selectRow=0;
  116.         
  117.         
  118.         
  119. }


  120. void displayCurrentMenu(void)
  121. {
  122.         u8 i,j;
  123.         u8 page;
  124.         char tempstr[16]={0};
  125.         if (CurrMenu.menu->num > 0)
  126.         {
  127.                 displayString(0,0,CurrMenu.menu->menuName);
  128.                 CurrMenu.menu->recordSubNum<3?(page=1):(page=CurrMenu.menu->recordSubNum/3+1);
  129.                 //printf("%d",CurrMenu.menu->recordSubNum);
  130.                 for(i=0;i<3;i++)
  131.                 {
  132.                         j=(page-1)*3+i;
  133.                         if (j<CurrMenu.menu->num)
  134.                         {
  135.                                 sprintf(tempstr,"%d",j+1);
  136.                                 displayString(i+1,0,tempstr);
  137.                                 displayString(i+1,1,CurrMenu.menu->submenuName[j]);
  138.                                 if ((CurrMenu.menu->submenuPtr[j])->num != 0) displayString(i+1,7,"\x10");
  139.                         }else
  140.                         {
  141.                                 displayString(i+1,0,"        ");
  142.                         }
  143.                 }
  144.                 writeWhiteLine(CurrMenu.menu->recordSubNum%3+2);
  145.         }
  146.         else
  147.         {
  148.                 CurrMenu.menu->func();
  149.         }
  150. }

  151. void GUIfunc_showTest(void)
  152. {
  153.         displayString(0,0,"测试  ");
  154.         displayString(1,0,"                ");
  155.         displayString(2,0,"        ");
  156.         displayString(3,0,"返回        确认");
  157. }
  158. void GUIfunc_showData(void)
  159. {
  160.         displayString(0,0,"主速度=   ");
  161.         displayString(1,0,"转速=");
  162.         displayString(2,0,"        ");
  163.         displayString(3,0,"        ");
  164. }
  165. void GUIfunc_setRunningData(void)
  166. {
  167.         displayString(0,0,"设置选项");
  168.         displayString(1,0,"最大转速");
  169.         displayString(2,0,"是否启用自动控制");
  170.         displayString(3,0,"        ");
  171. }

  172. void keyEvent_menuUP(void)
  173. {
  174.         if (CurrMenu.menu->recordSubNum<(CurrMenu.menu->num-1))
  175.         {
  176.                 CurrMenu.menu->recordSubNum++;
  177.                 //CurrMenu.menu->recordSubNum=CurrMenu.selectRow;
  178.         }
  179. }

  180. void keyEvent_menuDOWN(void)
  181. {
  182.         if (CurrMenu.menu->recordSubNum>0)
  183.         {
  184.                 CurrMenu.menu->recordSubNum--;
  185.                 //CurrMenu.menu->recordSubNum=CurrMenu.selectRow;
  186.         }
  187. }

  188. void keyEvent_menuENTER(void)
  189. {
  190.         clearLcd();
  191.         CurrMenu.menu=CurrMenu.menu->submenuPtr[CurrMenu.menu->recordSubNum];
  192.         CurrMenu.menu->recordSubNum=0;
  193. }

  194. void keyEvent_menuBACK(void)
  195. {
  196.         
  197.         if (CurrMenu.menu->parent != NULL)
  198.         {
  199.                 clearLcd();
  200.                 CurrMenu.menu=CurrMenu.menu->parent;
  201.         }
  202. }

  203. void keyEvent_Empty(void){}


  204. void KeyProc(void)
  205. {

  206.         
  207.         if (Trg>0)
  208.         {
  209.                 if(Trg&(1<<UP_Press))
  210.                 {
  211.                         CurrMenu.menu->funcKeyUP();
  212.                 }
  213.                 else if(Trg&(1<<DOWN_Press))
  214.                 {
  215.                         CurrMenu.menu->funcKeyDOWN();
  216.                 }
  217.                 else if(Trg&(1<<LEFT_Press))
  218. ……………………

  219. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


评分

参与人数 2黑币 +52 收起 理由
zhangli019 + 2 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:77462 发表于 2017-10-18 19:26 | 只看该作者
不错不错
回复

使用道具 举报

板凳
ID:236426 发表于 2017-11-14 00:35 | 只看该作者
谢谢分享
回复

使用道具 举报

地板
ID:262983 发表于 2018-1-10 15:33 | 只看该作者
多谢分享,谢谢
回复

使用道具 举报

5#
ID:148337 发表于 2018-3-6 09:26 | 只看该作者
请问#define RW_READ PBout(1)什么意思
回复

使用道具 举报

6#
ID:148337 发表于 2018-3-6 09:52 | 只看该作者
请问我想改引脚,应该改哪里
回复

使用道具 举报

7#
ID:68875 发表于 2018-3-10 12:01 | 只看该作者
不错,有用,谢谢楼主分享
回复

使用道具 举报

8#
ID:251714 发表于 2018-4-6 21:35 | 只看该作者
请问 这引脚 怎么接啊??。。。
回复

使用道具 举报

9#
ID:185372 发表于 2018-4-20 09:38 | 只看该作者
最近因为液晶的原因,头很大,这个可以支持。感谢
回复

使用道具 举报

10#
ID:323253 发表于 2018-5-6 12:21 | 只看该作者
楼主能私发一份嘛。。。没黑币。。。1290382834@qq.com
回复

使用道具 举报

11#
ID:327685 发表于 2018-5-11 16:07 | 只看该作者
能不能给我发一份289444124@qq.com
回复

使用道具 举报

12#
ID:305287 发表于 2018-5-17 16:54 | 只看该作者
感谢分享
回复

使用道具 举报

13#
ID:284462 发表于 2018-5-18 10:13 来自手机 | 只看该作者
学习一下
回复

使用道具 举报

14#
ID:293829 发表于 2018-5-18 10:32 | 只看该作者
请问有stm32f103的源码吗
回复

使用道具 举报

15#
ID:329571 发表于 2018-5-21 00:01 | 只看该作者

谢谢分享
回复

使用道具 举报

16#
ID:288488 发表于 2018-6-14 14:25 | 只看该作者
哇塞,好好玩儿。
回复

使用道具 举报

17#
ID:340846 发表于 2018-6-28 20:02 | 只看该作者
能在proteus 下仿真吗
回复

使用道具 举报

18#
ID:72898 发表于 2018-8-4 14:55 | 只看该作者
谢谢楼主,正需要   
回复

使用道具 举报

19#
ID:364813 发表于 2018-8-13 09:45 | 只看该作者
想下载看看
回复

使用道具 举报

20#
ID:223688 发表于 2018-8-13 11:22 | 只看该作者

谢谢分享
回复

使用道具 举报

21#
ID:368583 发表于 2018-8-14 11:34 | 只看该作者

不错,有用,谢谢楼主分享
回复

使用道具 举报

22#
ID:307825 发表于 2018-9-4 11:44 | 只看该作者
大牛出品必须学习
回复

使用道具 举报

23#
ID:304328 发表于 2018-9-13 14:49 | 只看该作者
学习学习
回复

使用道具 举报

24#
ID:214383 发表于 2018-10-1 21:53 | 只看该作者
能给点注释就更棒了
回复

使用道具 举报

25#
ID:389852 发表于 2018-10-22 17:39 | 只看该作者
不是下载过了吗,怎么还要扣费
回复

使用道具 举报

26#
ID:281047 发表于 2018-11-25 10:54 | 只看该作者
下载下来试试效果。
回复

使用道具 举报

27#
ID:281047 发表于 2018-11-25 12:59 | 只看该作者
主要是没有演示图片不好评估菜单效果。如果可以iyou图片看看就好了 。
回复

使用道具 举报

28#
ID:71535 发表于 2018-12-11 20:28 | 只看该作者
学习一下载下来试试效果
回复

使用道具 举报

29#
ID:459593 发表于 2019-1-1 21:50 | 只看该作者
不错0.0
回复

使用道具 举报

30#
ID:112865 发表于 2019-5-16 20:50 | 只看该作者
感谢分享到了
回复

使用道具 举报

31#
ID:511677 发表于 2019-5-23 12:48 | 只看该作者
谢谢,感谢分享。
回复

使用道具 举报

32#
ID:202803 发表于 2019-6-18 22:40 | 只看该作者
谢谢楼主了
回复

使用道具 举报

33#
ID:87000 发表于 2019-6-20 08:34 | 只看该作者
先看看,目前用不着
回复

使用道具 举报

34#
ID:228853 发表于 2019-6-21 14:17 | 只看该作者
刚好需要
回复

使用道具 举报

35#
ID:499661 发表于 2019-7-13 17:12 | 只看该作者
不错
不错
回复

使用道具 举报

36#
ID:552299 发表于 2019-7-18 10:06 | 只看该作者
谢谢楼主
回复

使用道具 举报

37#
ID:607158 发表于 2019-9-3 22:57 | 只看该作者
太好了~~~
回复

使用道具 举报

38#
ID:87000 发表于 2019-9-4 16:37 | 只看该作者
下来来看看,与其他有什么不同
回复

使用道具 举报

39#
ID:614910 发表于 2019-9-22 20:07 | 只看该作者
楼主这是32的什么板子呀mini还是f4
回复

使用道具 举报

40#
ID:607641 发表于 2019-11-1 11:59 | 只看该作者
感谢,学习了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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