登錄|立即注冊|使用QQ帳號(hào)登錄
論壇 > STM32/8
發(fā)帖|
看26135|回44|收藏
樓主 ID:230628 只看他
2017-9-2 23:45
分享一個(gè)lcd12864液晶屏的多級(jí)菜單實(shí)現(xiàn)方法,可方便實(shí)現(xiàn)無限級(jí)菜單
這是移植別人,加以修改的,支持從第一行菜單直接跳轉(zhuǎn)到最后一行,反之如此
由于不知道怎么通過函數(shù)指針傳遞參數(shù),所以在結(jié)構(gòu)體里另定義了一個(gè)變,用來傳
遞參數(shù)量,如各位有更好的改法,,請?jiān)谫N里貼出

0.png


所有資料51hei提供下載:
多級(jí)菜單 按鍵切換.zip (122.07 KB)
(下載次數(shù): 637, 2017-9-2 23:45 上傳)

下載積分: 黑幣 -5



單片機(jī)源程序如下:

代碼:

  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.                 "設(shè)置",
  11.                 "更多"
  12.         }
  13. };

  14. Menu Menu_set={
  15.         2, 0,
  16.         "    設(shè)置",
  17.         {
  18.                 "運(yùn)行參數(shù)",
  19.                 "參數(shù)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;      //當(dāng)前選擇的是哪一項(xiàng)
  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,"返回        確認(rèn)");
  157. }
  158. void GUIfunc_showData(void)
  159. {
  160.         displayString(0,0,"主速度=   ");
  161.         displayString(1,0,"轉(zhuǎn)速=");
  162.         displayString(2,0,"        ");
  163.         displayString(3,0,"        ");
  164. }
  165. void GUIfunc_setRunningData(void)
  166. {
  167.         displayString(0,0,"設(shè)置選項(xiàng)");
  168.         displayString(1,0,"最大轉(zhuǎn)速");
  169.         displayString(2,0,"是否啟用自動(dòng)控制");
  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黑下載附件…………


沙發(fā) ID:77462 只看他
2017-10-18 19:26
不錯(cuò)不錯(cuò)
板凳 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
請問我想改引腳,應(yīng)該改哪里
7# ID:68875 只看他
2018-3-10 12:01
不錯(cuò),有用,謝謝樓主分享
8# ID:251714 只看他
2018-4-6 21:35
請問 這引腳 怎么接????。。。
9# ID:185372 只看他
2018-4-20 09:38
最近因?yàn)橐壕У脑?,頭很大,這個(gè)可以支持。感謝
10# ID:323253 只看他
2018-5-6 12:21
樓主能私發(fā)一份嘛。。。沒黑幣。。。1290382834@qq.com
11# ID:327685 只看他
2018-5-11 16:07
能不能給我發(fā)一份289444124@qq.com
12# ID:305287 只看他
2018-5-17 16:54
感謝分享
13# ID:284462 只看他
2018-5-18 10:13
學(xué)習(xí)一下
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

不錯(cuò),有用,謝謝樓主分享
22# ID:307825 只看他
2018-9-4 11:44
大牛出品必須學(xué)習(xí)
23# ID:304328 只看他
2018-9-13 14:49
學(xué)習(xí)學(xué)習(xí)
24# ID:214383 只看他
2018-10-1 21:53
能給點(diǎn)注釋就更棒了
25# ID:389852 只看他
2018-10-22 17:39
不是下載過了嗎,怎么還要扣費(fèi)
26# ID:281047 只看他
2018-11-25 10:54
下載下來試試效果。
27# ID:281047 只看他
2018-11-25 12:59
主要是沒有演示圖片不好評(píng)估菜單效果。如果可以iyou圖片看看就好了 。
28# ID:71535 只看他
2018-12-11 20:28
學(xué)習(xí)一下載下來試試效果
29# ID:459593 只看他
2019-1-1 21:50
不錯(cuò)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
不錯(cuò)
不錯(cuò)
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
感謝,學(xué)習(xí)了

51黑電子論壇

Powered by Discuz! X3.1

首頁|標(biāo)準(zhǔn)版|觸屏版|電腦版