久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 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
看起來好復雜
作者: longjikai    時間: 2025-6-17 11:44
怎么用在STM32F407ZGT6啊 兄弟們





歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲一区二区三区视频 | 国产精品精品视频一区二区三区 | 97在线超碰| 欧美一级片久久 | 欧美精三区欧美精三区 | 成年无码av片在线 | 国产综合精品 | 日本天堂视频在线观看 | 亚洲精品久久久久久一区二区 | 午夜伦4480yy私人影院 | 日韩亚洲一区二区 | 操久久| 国产www在线 | 亚洲成人av在线播放 | 欧美一区二区三区在线看 | 99在线播放| 毛片综合| 一区二区三区国产在线观看 | 国产精品久久亚洲 | 在线视频成人 | 日韩精品一区二区三区中文字幕 | 日韩欧美一区二区三区在线播放 | 成人 在线 | 黄网站涩免费蜜桃网站 | 综合久久综合久久 | 涩爱av一区二区三区 | 日日操操 | 国产精品亚洲成在人线 | 国产精品国产三级国产aⅴ无密码 | 中文精品视频 | 欧美久久久久 | 亚洲情综合五月天 | 欧美一区二区在线观看 | 在线观看欧美日韩视频 | 日本一区二区三区视频在线 | 日韩一二三区视频 | 亚洲一区精品在线 | 国产一级精品毛片 | aⅴ色国产 欧美 | 91精品国产综合久久久久蜜臀 | 欧美激情第一区 |