標(biāo)題: 12864多級菜單實現(xiàn),可方便實現(xiàn)無限級菜單(um0549) [打印本頁]

作者: feifei_51    時間: 2017-8-12 14:36
標(biāo)題: 12864多級菜單實現(xiàn),可方便實現(xiàn)無限級菜單(um0549)
運行效果圖:

選擇查詢項:

選擇查詢項并按確定鍵后:

此時按返回鍵,將會返回到第二個圖片中的界面
首先定義一個菜單結(jié)構(gòu)
  1. typedef struct menu//定義一個菜單
  2. {
  3. u8 range_from,range_to; //當(dāng)前顯示的項開始及結(jié)束序號
  4. u8 itemCount;//項目總數(shù)
  5. u8 selected;//當(dāng)前選擇項
  6. u8 *menuItems[17];//菜單項目
  7. struct menu **subMenus;//子菜單
  8. struct menu *parent;//上級菜單 ,如果是頂級則為null
  9. void (**func)();//選擇相應(yīng)項按確定鍵后執(zhí)行的函數(shù)

  10. }Menu;

  11. Menu MainMenu = { //定義主菜單
  12. 0,3,4,0,//默認顯示0-3項,總共4項,當(dāng)前選擇第0項
  13.   {
  14.   "設(shè)置1          ",
  15.   "設(shè)置2          ",
  16.   "輸入指令發(fā)送    ",
  17.   "查詢           "
  18.   }
  19. };

  20. Menu searchMenu = {//查詢菜單
  21. 0,3,6,0,
  22. {
  23.   "記帳記錄明細    ",
  24.   "未采集記錄數(shù)    ",
  25.   "設(shè)備機號        ",
  26.   "本機IP地址      ",
  27.   "記錄空間大小    ",
  28.   "軟件版本        "
  29. }
  30. };
  31. Menu *currentMenu;//當(dāng)前的菜單

  32. 用于顯示菜單項
  33. void display(u8 line) //顯示菜單項并設(shè)置選中的項反白
  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,選擇后程序會調(diào)用func中相應(yīng)項中的函數(shù)
  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;//當(dāng)選擇了并按了確定,會執(zhí)行func函數(shù)
  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)//更新顯示的區(qū)域
  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]();//執(zhí)行相應(yīng)的函數(shù)
  129.       display(currentMenu->selected);//返回后恢復(fù)原來的菜單狀態(tài)
  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. }
復(fù)制代碼

ST公司關(guān)于STM3210E-EVAL演示版本的工程中就有菜單的代碼,現(xiàn)分享給大家:
um0549.rar (5.26 MB, 下載次數(shù): 1040)


作者: fengye20101112    時間: 2017-9-28 15:51
好東西,無限級菜單擴展
作者: Ning.    時間: 2017-12-29 15:37
好像下載,馬上去賺幣
作者: qinwenfang    時間: 2018-1-21 20:36
想學(xué)習(xí)下下,剛好 遇到
作者: Luckyfa    時間: 2018-3-30 14:24
不用下載,這這些夠用了,非常感謝。
作者: esmember    時間: 2018-4-20 09:24
這個可以有。正苦于液晶顯示跟控制問題呢。感謝
作者: 何必刻意    時間: 2018-4-25 11:40
esmember 發(fā)表于 2018-4-20 09:24
這個可以有。正苦于液晶顯示跟控制問題呢。感謝

親 弄出來了嗎?能分享一下嗎?
作者: mjqing    時間: 2018-7-4 09:42

好東西,無限級菜單擴展
作者: vipwhaha    時間: 2018-8-14 17:07
感謝樓主,正愁控制不知道怎么去做
作者: quinn1    時間: 2018-9-3 17:00
牛人啊,正在做這個
作者: 紅燒魚頭    時間: 2018-11-24 14:43
請教一下,第6行的 u8 *menuItems[17] 不需要定義成二維數(shù)組嗎?
作者: scnclisir1    時間: 2019-4-2 08:55
好東西,可惜沒分了。。。。
作者: toney123456    時間: 2019-4-2 16:57
MARK  THIS
作者: yy07090704    時間: 2019-5-6 14:38
感謝樓主分享,實在太好了
作者: 周鵬    時間: 2019-5-11 21:55
求整個包 下載下來 編譯不通過哎
作者: 青青梓衿    時間: 2019-6-23 22:49
這個程序厲害,學(xué)習(xí)下
作者: iamarookie    時間: 2019-7-12 10:56
你好 樓主請問反白一行怎么實現(xiàn)的呢
作者: njchenmin    時間: 2020-2-5 17:09
非常棒的介紹
作者: lvlv99    時間: 2020-2-5 19:04
12864顯示屏是帶字庫,還是不帶字庫的?
作者: guangshi_wq    時間: 2020-2-6 16:36
這個多級菜單寫的好,精辟,不象有的多級菜單程序代碼多,難懂
作者: 51hdz3356619    時間: 2020-4-13 09:02
太好了,直接收藏。。。
作者: mini92    時間: 2020-4-21 23:38
好程序值得收藏
作者: wqflyy    時間: 2020-4-27 18:12
正在做多級菜單顯示的項目,發(fā)現(xiàn)這個挺好的
作者: kevin_cgl    時間: 2020-5-8 20:38
正在找這個,我用的51,不知道是否通用呢
作者: 2399902214    時間: 2020-5-11 11:13
不知道可不可以用在320240LCD仿真電路上

作者: 大米袋    時間: 2020-5-11 12:41
感謝分享
作者: huirunlong    時間: 2020-6-14 12:22
這個挺好的
作者: 炸雞店老板炸了    時間: 2020-7-27 11:53
多級菜單還有其它的嘛
作者: 炸雞店老板炸了    時間: 2020-7-28 17:27
你的顯示沒有設(shè)計顯示坐標(biāo)的嘛
作者: 炸雞店老板炸了    時間: 2020-7-28 17:33
現(xiàn)在可以實現(xiàn)得了翻頁,但不知道怎樣實現(xiàn)在同一級菜單中來回切換(如:我顯示屏只能顯示四項目錄,但我的目錄一共有八項,怎樣用按鍵來控制上下切換滾動),指點會了可以給一二百積分
作者: tomsmiss123    時間: 2020-7-30 15:25
非常感謝樓主分享,謝謝。。。
作者: 15973185691    時間: 2020-8-8 08:48
炸雞店老板炸了 發(fā)表于 2020-7-28 17:33
現(xiàn)在可以實現(xiàn)得了翻頁,但不知道怎樣實現(xiàn)在同一級菜單中來回切換(如:我顯示屏只能顯示四項目錄,但我的目 ...

你搞定了沒,我再在也需要做的跟你的也差不多
作者: 15973185691    時間: 2020-8-8 12:21
炸雞店老板炸了 發(fā)表于 2020-7-28 17:33
現(xiàn)在可以實現(xiàn)得了翻頁,但不知道怎樣實現(xiàn)在同一級菜單中來回切換(如:我顯示屏只能顯示四項目錄,但我的目 ...

在嗎,能用嗎?
作者: 鴿子1988    時間: 2020-9-3 10:08
下載文件和上文對不上。不愿意把資料分享,就不要提供下載包。隨便弄一個下載包出來算什么
作者: 布萊克先生    時間: 2020-9-5 08:47
實在是太有用了
作者: 蛋黃派@SZPT    時間: 2020-9-12 20:16
MARK 一下,正好需要用到。
作者: cyrs    時間: 2021-1-27 18:01
是編碼器控制嗎
作者: 網(wǎng)絡(luò)孤客    時間: 2021-2-2 10:47
本機IP是如何輸入的?
作者: zlrong    時間: 2021-2-19 22:48
多謝了!研究研究
作者: chinajhgjhg    時間: 2021-2-20 15:59
這個太有價值了。
作者: cfh435713942    時間: 2021-5-8 10:36
我的怎么打不開
作者: shu_007    時間: 2021-5-13 10:21
12864有帶中文字庫和沒帶的兩種
作者: sr861126    時間: 2021-8-31 17:04
下載的代碼不是12864的,是oled0.96的代碼
作者: 孟特特    時間: 2021-9-8 21:24
太惡心啦 沒什么用 下載的東西和這貼的完全兩碼事
作者: Y!NG    時間: 2022-8-18 17:04
太復(fù)雜 ,沒看懂,好像不是用鏈表實現(xiàn)的




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1