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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 31458|回復(fù): 44
打印 上一主題 下一主題
收起左側(cè)

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

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:227255 發(fā)表于 2017-8-12 14:36 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
運(yùn)行效果圖:

選擇查詢項(xiàng):

選擇查詢項(xiàng)并按確定鍵后:

此時(shí)按返回鍵,將會返回到第二個圖片中的界面
首先定義一個菜單結(jié)構(gòu)
  1. typedef struct menu//定義一個菜單
  2. {
  3. u8 range_from,range_to; //當(dāng)前顯示的項(xiàng)開始及結(jié)束序號
  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;//上級菜單 ,如果是頂級則為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ī)號        ",
  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,選擇后程序會調(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)選擇了并按了確定,會執(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.進(jìn)入查詢子菜單后按返回鍵,將會顯示這個菜單 項(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)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏53 分享淘帖 頂4 踩
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

沙發(fā)
ID:236322 發(fā)表于 2017-9-28 15:51 | 只看該作者
好東西,無限級菜單擴(kuò)展
回復(fù)

使用道具 舉報(bào)

無效樓層,該帖已經(jīng)被刪除
地板
ID:268890 發(fā)表于 2017-12-29 15:37 | 只看該作者
好像下載,馬上去賺幣
回復(fù)

使用道具 舉報(bào)

5#
無效樓層,該帖已經(jīng)被刪除
6#
ID:278406 發(fā)表于 2018-1-21 20:36 | 只看該作者
想學(xué)習(xí)下下,剛好 遇到
回復(fù)

使用道具 舉報(bào)

7#
無效樓層,該帖已經(jīng)被刪除
8#
無效樓層,該帖已經(jīng)被刪除
9#
ID:299412 發(fā)表于 2018-3-30 14:24 | 只看該作者
不用下載,這這些夠用了,非常感謝。
回復(fù)

使用道具 舉報(bào)

10#
ID:185372 發(fā)表于 2018-4-20 09:24 | 只看該作者
這個可以有。正苦于液晶顯示跟控制問題呢。感謝
回復(fù)

使用道具 舉報(bào)

11#
ID:316075 發(fā)表于 2018-4-25 11:40 | 只看該作者
esmember 發(fā)表于 2018-4-20 09:24
這個可以有。正苦于液晶顯示跟控制問題呢。感謝

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

使用道具 舉報(bào)

12#
無效樓層,該帖已經(jīng)被刪除
13#
無效樓層,該帖已經(jīng)被刪除
14#
無效樓層,該帖已經(jīng)被刪除
15#
ID:143232 發(fā)表于 2018-7-4 09:42 | 只看該作者

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

使用道具 舉報(bào)

16#
無效樓層,該帖已經(jīng)被刪除
17#
ID:121852 發(fā)表于 2018-8-14 17:07 | 只看該作者
感謝樓主,正愁控制不知道怎么去做
回復(fù)

使用道具 舉報(bào)

18#
無效樓層,該帖已經(jīng)被刪除
19#
ID:307825 發(fā)表于 2018-9-3 17:00 | 只看該作者
牛人啊,正在做這個
回復(fù)

使用道具 舉報(bào)

20#
無效樓層,該帖已經(jīng)被刪除
21#
ID:188720 發(fā)表于 2018-11-24 14:43 | 只看該作者
請教一下,第6行的 u8 *menuItems[17] 不需要定義成二維數(shù)組嗎?
回復(fù)

使用道具 舉報(bào)

22#
無效樓層,該帖已經(jīng)被刪除
23#
無效樓層,該帖已經(jīng)被刪除
24#
無效樓層,該帖已經(jīng)被刪除
25#
無效樓層,該帖已經(jīng)被刪除
26#
ID:464365 發(fā)表于 2019-4-2 08:55 | 只看該作者
好東西,可惜沒分了。。。。
回復(fù)

使用道具 舉報(bào)

27#
ID:457896 發(fā)表于 2019-4-2 16:57 | 只看該作者
MARK  THIS
回復(fù)

使用道具 舉報(bào)

28#
ID:499981 發(fā)表于 2019-5-6 14:38 | 只看該作者
感謝樓主分享,實(shí)在太好了
回復(fù)

使用道具 舉報(bào)

29#
無效樓層,該帖已經(jīng)被刪除
30#
ID:37147 發(fā)表于 2019-5-11 21:55 | 只看該作者
求整個包 下載下來 編譯不通過哎
回復(fù)

使用道具 舉報(bào)

31#
無效樓層,該帖已經(jīng)被刪除
32#
ID:564898 發(fā)表于 2019-6-23 22:49 來自觸屏版 | 只看該作者
這個程序厲害,學(xué)習(xí)下
回復(fù)

使用道具 舉報(bào)

33#
無效樓層,該帖已經(jīng)被刪除
34#
ID:378467 發(fā)表于 2019-7-12 10:56 | 只看該作者
你好 樓主請問反白一行怎么實(shí)現(xiàn)的呢
回復(fù)

使用道具 舉報(bào)

35#
無效樓層,該帖已經(jīng)被刪除
36#
無效樓層,該帖已經(jīng)被刪除
37#
ID:270390 發(fā)表于 2020-2-5 17:09 | 只看該作者
非常棒的介紹
回復(fù)

使用道具 舉報(bào)

38#
ID:240034 發(fā)表于 2020-2-5 19:04 | 只看該作者
12864顯示屏是帶字庫,還是不帶字庫的?
回復(fù)

使用道具 舉報(bào)

39#
ID:375003 發(fā)表于 2020-2-6 16:36 | 只看該作者
這個多級菜單寫的好,精辟,不象有的多級菜單程序代碼多,難懂
回復(fù)

使用道具 舉報(bào)

40#
無效樓層,該帖已經(jīng)被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品国产一区 | 日韩国产一区 | 欧美日韩1区2区 | 欧美日韩成人在线 | 久久免费香蕉视频 | 老司机狠狠爱 | 日韩不卡在线 | 国产免费a | 久久综合色综合 | 91原创视频| 欧美一卡二卡在线观看 | 国产精品久久国产精品 | 一级黄色裸片 | 91电影在线 | 九九久久国产 | 一级片免费观看 | 精品免费国产一区二区三区 | 精品毛片在线观看 | 日日干日日操 | 黄色小视频入口 | 精品一区二区三区av | 91av在线免费观看 | 成年人在线观看视频 | 国产日韩精品一区 | 久久久久久久香蕉 | 国产激情自拍视频 | 国产特一级黄色片 | 日韩不卡一二区 | 在线观看成人小视频 | 亚洲精品一区二区在线观看 | 91se在线| h在线播放 | 欧美日高清视频 | 国产日韩欧美在线 | 久久九九网站 | 亚洲色图图片 | 国产精品不卡 | 久草新在线| 天堂成人av| 一区二区三区在线 | 免费在线观看一区二区三区 |