找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 31109|回復(fù): 44
收起左側(cè)

12864多級(jí)菜單實(shí)現(xiàn),可方便實(shí)現(xiàn)無限級(jí)菜單(um0549)

  [復(fù)制鏈接]
ID:227255 發(fā)表于 2017-8-12 14:36 | 顯示全部樓層 |閱讀模式
運(yùn)行效果圖:
46bfe1931c0f6545cbb566d45bb2ecd9_994.jpg
選擇查詢項(xiàng):
736b9f3ccc38ef7d11f21da03f2e21cb_986.jpg
選擇查詢項(xiàng)并按確定鍵后:
93385e78de732c5d44f5ad7e44aa40cb_912.jpg
此時(shí)按返回鍵,將會(huì)返回到第二個(gè)圖片中的界面
首先定義一個(gè)菜單結(jié)構(gòu)
  1. typedef struct menu//定義一個(gè)菜單
  2. {
  3. u8 range_from,range_to; //當(dāng)前顯示的項(xiàng)開始及結(jié)束序號(hào)
  4. u8 itemCount;//項(xiàng)目總數(shù)
  5. u8 selected;//當(dāng)前選擇項(xiàng)
  6. u8 *menuItems[17];//菜單項(xiàng)目
  7. struct menu **subMenus;//子菜單
  8. struct menu *parent;//上級(jí)菜單 ,如果是頂級(jí)則為null
  9. void (**func)();//選擇相應(yīng)項(xiàng)按確定鍵后執(zhí)行的函數(shù)

  10. }Menu;

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

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

  32. 用于顯示菜單項(xiàng)
  33. void display(u8 line) //顯示菜單項(xiàng)并設(shè)置選中的項(xiàng)反白
  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項(xiàng)沒有子菜單置null,選擇后程序會(huì)調(diào)用func中相應(yīng)項(xiàng)中的函數(shù)
  53. MainMenu.subMenus[1] = NULL;
  54. MainMenu.subMenus[2] = NULL;
  55. MainMenu.subMenus[3] = &searchMenu;//第四項(xiàng)查詢有子菜單
  56. MainMenu.func = malloc(sizeof(&func)*4);
  57. MainMenu.func[0] = NULL;
  58. MainMenu.func[1] = NULL;
  59. MainMenu.func[2] = &func;//當(dāng)選擇了并按了確定,會(huì)執(zhí)行func函數(shù)
  60. MainMenu.func[3] = NULL;
  61. MainMenu.parent = NULL;//表示是頂級(jí)菜單

  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;//上一級(jí)菜單是MainMenu.進(jìn)入查詢子菜單后按返回鍵,將會(huì)顯示這個(gè)菜單 項(xiàng)

  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)//到了第一項(xiàng)
  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)

評(píng)分

參與人數(shù) 1黑幣 +16 收起 理由
王朗的誘惑 + 16 贊一個(gè)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:500999 發(fā)表于 2020-7-28 17:33 | 顯示全部樓層
現(xiàn)在可以實(shí)現(xiàn)得了翻頁,但不知道怎樣實(shí)現(xiàn)在同一級(jí)菜單中來回切換(如:我顯示屏只能顯示四項(xiàng)目錄,但我的目錄一共有八項(xiàng),怎樣用按鍵來控制上下切換滾動(dòng)),指點(diǎn)會(huì)了可以給一二百積分
回復(fù)

使用道具 舉報(bào)

ID:236322 發(fā)表于 2017-9-28 15:51 | 顯示全部樓層
好東西,無限級(jí)菜單擴(kuò)展
回復(fù)

使用道具 舉報(bào)

ID:268890 發(fā)表于 2017-12-29 15:37 | 顯示全部樓層
好像下載,馬上去賺幣
回復(fù)

使用道具 舉報(bào)

ID:278406 發(fā)表于 2018-1-21 20:36 | 顯示全部樓層
想學(xué)習(xí)下下,剛好 遇到
回復(fù)

使用道具 舉報(bào)

ID:299412 發(fā)表于 2018-3-30 14:24 | 顯示全部樓層
不用下載,這這些夠用了,非常感謝。
回復(fù)

使用道具 舉報(bào)

ID:185372 發(fā)表于 2018-4-20 09:24 | 顯示全部樓層
這個(gè)可以有。正苦于液晶顯示跟控制問題呢。感謝
回復(fù)

使用道具 舉報(bào)

ID:316075 發(fā)表于 2018-4-25 11:40 | 顯示全部樓層
esmember 發(fā)表于 2018-4-20 09:24
這個(gè)可以有。正苦于液晶顯示跟控制問題呢。感謝

親 弄出來了嗎?能分享一下嗎?
回復(fù)

使用道具 舉報(bào)

ID:143232 發(fā)表于 2018-7-4 09:42 | 顯示全部樓層

好東西,無限級(jí)菜單擴(kuò)展
回復(fù)

使用道具 舉報(bào)

ID:121852 發(fā)表于 2018-8-14 17:07 | 顯示全部樓層
感謝樓主,正愁控制不知道怎么去做
回復(fù)

使用道具 舉報(bào)

ID:307825 發(fā)表于 2018-9-3 17:00 | 顯示全部樓層
牛人啊,正在做這個(gè)
回復(fù)

使用道具 舉報(bào)

ID:188720 發(fā)表于 2018-11-24 14:43 | 顯示全部樓層
請(qǐng)教一下,第6行的 u8 *menuItems[17] 不需要定義成二維數(shù)組嗎?
回復(fù)

使用道具 舉報(bào)

ID:464365 發(fā)表于 2019-4-2 08:55 | 顯示全部樓層
好東西,可惜沒分了。。。。
回復(fù)

使用道具 舉報(bào)

ID:457896 發(fā)表于 2019-4-2 16:57 | 顯示全部樓層
MARK  THIS
回復(fù)

使用道具 舉報(bào)

ID:499981 發(fā)表于 2019-5-6 14:38 | 顯示全部樓層
感謝樓主分享,實(shí)在太好了
回復(fù)

使用道具 舉報(bào)

ID:37147 發(fā)表于 2019-5-11 21:55 | 顯示全部樓層
求整個(gè)包 下載下來 編譯不通過哎
回復(fù)

使用道具 舉報(bào)

ID:564898 發(fā)表于 2019-6-23 22:49 來自手機(jī) | 顯示全部樓層
這個(gè)程序厲害,學(xué)習(xí)下
回復(fù)

使用道具 舉報(bào)

ID:378467 發(fā)表于 2019-7-12 10:56 | 顯示全部樓層
你好 樓主請(qǐng)問反白一行怎么實(shí)現(xiàn)的呢
回復(fù)

使用道具 舉報(bào)

ID:270390 發(fā)表于 2020-2-5 17:09 | 顯示全部樓層
非常棒的介紹
回復(fù)

使用道具 舉報(bào)

ID:240034 發(fā)表于 2020-2-5 19:04 | 顯示全部樓層
12864顯示屏是帶字庫,還是不帶字庫的?
回復(fù)

使用道具 舉報(bào)

ID:375003 發(fā)表于 2020-2-6 16:36 | 顯示全部樓層
這個(gè)多級(jí)菜單寫的好,精辟,不象有的多級(jí)菜單程序代碼多,難懂
回復(fù)

使用道具 舉報(bào)

ID:286761 發(fā)表于 2020-4-13 09:02 | 顯示全部樓層
太好了,直接收藏。。。
回復(fù)

使用道具 舉報(bào)

ID:733461 發(fā)表于 2020-4-21 23:38 | 顯示全部樓層
好程序值得收藏
回復(fù)

使用道具 舉報(bào)

ID:739523 發(fā)表于 2020-4-27 18:12 | 顯示全部樓層
正在做多級(jí)菜單顯示的項(xiàng)目,發(fā)現(xiàn)這個(gè)挺好的
回復(fù)

使用道具 舉報(bào)

ID:747196 發(fā)表于 2020-5-8 20:38 | 顯示全部樓層
正在找這個(gè),我用的51,不知道是否通用呢
回復(fù)

使用道具 舉報(bào)

ID:712792 發(fā)表于 2020-5-11 11:13 | 顯示全部樓層
不知道可不可以用在320240LCD仿真電路上
回復(fù)

使用道具 舉報(bào)

ID:446681 發(fā)表于 2020-5-11 12:41 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:502805 發(fā)表于 2020-6-14 12:22 | 顯示全部樓層
這個(gè)挺好的
回復(fù)

使用道具 舉報(bào)

ID:500999 發(fā)表于 2020-7-27 11:53 | 顯示全部樓層
多級(jí)菜單還有其它的嘛
回復(fù)

使用道具 舉報(bào)

ID:500999 發(fā)表于 2020-7-28 17:27 | 顯示全部樓層
你的顯示沒有設(shè)計(jì)顯示坐標(biāo)的嘛
回復(fù)

使用道具 舉報(bào)

ID:471579 發(fā)表于 2020-7-30 15:25 | 顯示全部樓層
非常感謝樓主分享,謝謝。。。
回復(fù)

使用道具 舉報(bào)

ID:255514 發(fā)表于 2020-8-8 08:48 | 顯示全部樓層
炸雞店老板炸了 發(fā)表于 2020-7-28 17:33
現(xiàn)在可以實(shí)現(xiàn)得了翻頁,但不知道怎樣實(shí)現(xiàn)在同一級(jí)菜單中來回切換(如:我顯示屏只能顯示四項(xiàng)目錄,但我的目 ...

你搞定了沒,我再在也需要做的跟你的也差不多
回復(fù)

使用道具 舉報(bào)

ID:255514 發(fā)表于 2020-8-8 12:21 來自手機(jī) | 顯示全部樓層
炸雞店老板炸了 發(fā)表于 2020-7-28 17:33
現(xiàn)在可以實(shí)現(xiàn)得了翻頁,但不知道怎樣實(shí)現(xiàn)在同一級(jí)菜單中來回切換(如:我顯示屏只能顯示四項(xiàng)目錄,但我的目 ...

在嗎,能用嗎?
回復(fù)

使用道具 舉報(bào)

ID:813815 發(fā)表于 2020-9-3 10:08 | 顯示全部樓層
下載文件和上文對(duì)不上。不愿意把資料分享,就不要提供下載包。隨便弄一個(gè)下載包出來算什么
回復(fù)

使用道具 舉報(bào)

ID:292460 發(fā)表于 2020-9-5 08:47 | 顯示全部樓層
實(shí)在是太有用了
回復(fù)

使用道具 舉報(bào)

ID:685684 發(fā)表于 2020-9-12 20:16 | 顯示全部樓層
MARK 一下,正好需要用到。
回復(fù)

使用道具 舉報(bào)

ID:81138 發(fā)表于 2021-1-27 18:01 | 顯示全部樓層
是編碼器控制嗎
回復(fù)

使用道具 舉報(bào)

ID:470485 發(fā)表于 2021-2-2 10:47 | 顯示全部樓層
本機(jī)IP是如何輸入的?
回復(fù)

使用道具 舉報(bào)

ID:88756 發(fā)表于 2021-2-19 22:48 | 顯示全部樓層
多謝了!研究研究
回復(fù)

使用道具 舉報(bào)

ID:643918 發(fā)表于 2021-2-20 15:59 | 顯示全部樓層
這個(gè)太有價(jià)值了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表