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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 30997|回復: 44
收起左側

12864多級菜單實現,可方便實現無限級菜單(um0549)

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

  10. }Menu;

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

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

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

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

評分

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

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

ID:236322 發表于 2017-9-28 15:51 | 顯示全部樓層
好東西,無限級菜單擴展
回復

使用道具 舉報

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

使用道具 舉報

ID:278406 發表于 2018-1-21 20:36 | 顯示全部樓層
想學習下下,剛好 遇到
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

親 弄出來了嗎?能分享一下嗎?
回復

使用道具 舉報

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

好東西,無限級菜單擴展
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:564898 發表于 2019-6-23 22:49 來自手機 | 顯示全部樓層
這個程序厲害,學習下
回復

使用道具 舉報

ID:378467 發表于 2019-7-12 10:56 | 顯示全部樓層
你好 樓主請問反白一行怎么實現的呢
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:739523 發表于 2020-4-27 18:12 | 顯示全部樓層
正在做多級菜單顯示的項目,發現這個挺好的
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:502805 發表于 2020-6-14 12:22 | 顯示全部樓層
這個挺好的
回復

使用道具 舉報

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

使用道具 舉報

ID:500999 發表于 2020-7-28 17:27 | 顯示全部樓層
你的顯示沒有設計顯示坐標的嘛
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

在嗎,能用嗎?
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:643918 發表于 2021-2-20 15:59 | 顯示全部樓層
這個太有價值了。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: pacopacomama在线| 日韩中文字幕一区二区三区 | 日韩一区二区三区在线观看 | 在线观看免费高清av | 欧美激情 一区 | 久久99蜜桃综合影院免费观看 | 国产精品欧美一区二区三区不卡 | 一区二区三区在线免费观看 | 一区二区激情 | 精品视频久久久久久 | 手机av在线 | 亚洲二区视频 | 色网站在线免费观看 | 亚洲视频在线一区 | 亚洲1区 | 欧美日韩不卡合集视频 | 日韩一级黄色片 | 在线视频 中文字幕 | 91精品国产综合久久香蕉麻豆 | 午夜a v电影 | 91嫩草精品 | 日韩精品一区二区三区视频播放 | 网页av | 日韩欧美成人一区二区三区 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 福利视频网站 | 久草青青草 | 日韩av第一页 | 久久成人一区 | 亚洲啊v| 久草网址| 国产精品99久久久久久久vr | 91综合在线视频 | 亚洲成人中文字幕 | 中文字幕亚洲免费 | 精品一区二区三区在线播放 | 99久久影院 | 在线视频a | 中文字幕亚洲视频 | 日韩视频在线一区 | 日本三级网址 |