标题: 12864多级菜单实现STM32源程序,可方便实现无限级菜单 [打印本页]

作者: qhem    时间: 2017-9-2 23:45
标题: 12864多级菜单实现STM32源程序,可方便实现无限级菜单
分享一个lcd12864液晶屏的多级菜单实现方法,可方便实现无限级菜单
这是移植别人,加以修改的,支持从第一行菜单直接跳转到最后一行,反之如此
由于不知道怎么通过函数指针传递参数,所以在结构体里另定义了一个变,用来传
递参数量,如各位有更好的改法,,请在贴里贴出




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

单片机源程序如下:
  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黑下载附件…………
复制代码



作者: cqh757128    时间: 2017-10-18 19:26
不错不错
作者: wxszx    时间: 2017-11-14 00:35
谢谢分享

作者: huajiata    时间: 2018-1-10 15:33
多谢分享,谢谢
作者: 746228432    时间: 2018-3-6 09:26
请问#define RW_READ PBout(1)什么意思

作者: 746228432    时间: 2018-3-6 09:52
请问我想改引脚,应该改哪里
作者: cnc2020    时间: 2018-3-10 12:01
不错,有用,谢谢楼主分享
作者: 天才小壮    时间: 2018-4-6 21:35
请问 这引脚 怎么接啊??。。。
作者: esmember    时间: 2018-4-20 09:38
最近因为液晶的原因,头很大,这个可以支持。感谢
作者: 1290382834    时间: 2018-5-6 12:21
楼主能私发一份嘛。。。没黑币。。。1290382834@qq.com
作者: 289444124@qq.co    时间: 2018-5-11 16:07
能不能给我发一份289444124@qq.com
作者: HFUT    时间: 2018-5-17 16:54
感谢分享
作者: 芝麻    时间: 2018-5-18 10:13
学习一下
作者: Dragons9527    时间: 2018-5-18 10:32
请问有stm32f103的源码吗
作者: 1757897801    时间: 2018-5-21 00:01

谢谢分享
作者: bz794820302    时间: 2018-6-14 14:25
哇塞,好好玩儿。
作者: vcabcd    时间: 2018-6-28 20:02
能在proteus 下仿真吗
作者: hli0305    时间: 2018-8-4 14:55
谢谢楼主,正需要   
作者: nuannuanfeng    时间: 2018-8-13 09:45
想下载看看

作者: csg    时间: 2018-8-13 11:22

谢谢分享
作者: 竹子开花    时间: 2018-8-14 11:34

不错,有用,谢谢楼主分享
作者: quinn1    时间: 2018-9-4 11:44
大牛出品必须学习
作者: lxguang231    时间: 2018-9-13 14:49
学习学习
作者: mayunzhi    时间: 2018-10-1 21:53
能给点注释就更棒了
作者: kayman    时间: 2018-10-22 17:39
不是下载过了吗,怎么还要扣费
作者: luscu    时间: 2018-11-25 10:54
下载下来试试效果。
作者: luscu    时间: 2018-11-25 12:59
主要是没有演示图片不好评估菜单效果。如果可以iyou图片看看就好了 。
作者: waerdeng    时间: 2018-12-11 20:28
学习一下载下来试试效果
作者: bao12345    时间: 2019-1-1 21:50
不错0.0
作者: 壹勿所知    时间: 2019-5-16 20:50
感谢分享到了
作者: kudar    时间: 2019-5-23 12:48
谢谢,感谢分享。
作者: 陈仕祥    时间: 2019-6-18 22:40
谢谢楼主了
作者: 西点钟灵毓秀    时间: 2019-6-20 08:34
先看看,目前用不着
作者: qq774261351    时间: 2019-6-21 14:17
刚好需要
作者: lincolnplus    时间: 2019-7-13 17:12
不错
不错
作者: zhangjing128    时间: 2019-7-18 10:06
谢谢楼主

作者: flycc    时间: 2019-9-3 22:57
太好了~~~
作者: 西点钟灵毓秀    时间: 2019-9-4 16:37
下来来看看,与其他有什么不同
作者: 2670151640    时间: 2019-9-22 20:07
楼主这是32的什么板子呀mini还是f4
作者: zhzs09200608    时间: 2019-11-1 11:59
感谢,学习了
作者: w1685188403    时间: 2019-11-7 08:47
746228432 发表于 2018-3-6 09:26
请问#define RW_READ PBout(1)什么意思

定义RW_READ宏为 PBout(1)
作者: 256655    时间: 2019-12-2 20:45
楼主能发发实物不?

作者: shark313    时间: 2020-3-19 11:21
谢谢分享
作者: cmxgx    时间: 2021-12-1 15:20
lcd12864液晶屏的多级菜单实现
作者: suph007    时间: 2023-1-2 21:58
看起来好复杂




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