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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4600|回復: 6
打印 上一主題 下一主題
收起左側(cè)

12864液晶菜單設計-轉(zhuǎn)子傻孩子

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:152547 發(fā)表于 2017-2-10 11:29 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
完整內(nèi)容下載:
傻孩子菜單歷程.rar (3.42 KB, 下載次數(shù): 96)

這一章,我囫圇吞棗的給大家撤了很多原理的東西,章節(jié)前后時間跨度之大也是前面諸多章節(jié)無法比擬的。本來,按照原來的計劃,整篇文章寫道這里就應該全部結束了。但是,,實際情況是我們擁有了一種方法卻不知道這種方法應該運用的場合。一個GUI創(chuàng)立的目的往往是服務于菜單系統(tǒng),或者是游戲系統(tǒng)。于是接下來的兩張,我就扯一下和本文有千絲萬縷關系卻是主題之外的東西:1、菜單的結構和實現(xiàn);2、GUI在游戲中的簡單應用。

    以上的文字就算是一個結尾加上一個附錄的開頭吧。(爭取100樓圓滿結束全文)



    ADDENDUM ONE:  THE MENU STRUCT AND IT`S USAGE

    附錄一:菜單的結構和實現(xiàn)



    為什么菜單被叫做菜單,我想起原因已經(jīng)無從查考了,這個問題上我再掉故紙堆,羅列一堆各家之言,怕又是要挨罵了。不管你承認與否,菜單的概念已經(jīng)隨著計算機的普及滲透到了我們生活的各個方面。很多東西都可以被稱作菜單,很多東西從實質(zhì)上都擁有菜單的結構。網(wǎng)頁中有菜單,網(wǎng)頁本身甚至就是一個菜單選項,等等諸如此類。那么菜單擁有怎樣的一種結構,我們?nèi)绾稳崿F(xiàn)這一結構呢?

    要說清楚這個問題,我想從兩個方面來說:第一,菜單是由許多具有一定功能的單位按照一定分類組織在一起的圖;第二,如果聽不懂第一條,就假象菜單是互聯(lián)網(wǎng),一個網(wǎng)頁就是一個子菜單,子菜單中很多超鏈接又連接到其他網(wǎng)頁,如此往復,他們之間是通過指針,或者說是通過超鏈接來溝通的。也就是說,我們已經(jīng)搞清楚了一個菜單的基本結構單元組成就是一個多鏈表中的一個結構體單元,他往往被簡化成樹,或者說在執(zhí)行退回上一級菜單這個功能的時候,被看作是一個樹的結構,但是,它實際是圖。菜單之間的任何菜單項之間都有可能產(chǎn)生聯(lián)系。但是記住,菜單一般是多入一出的結構。

    說的越來越抽象了哈。其實看不懂前面的文字不要緊,我們看下面的代碼就沒有那么神秘了。

  1. /***********************

  2. *     結構體宏定義     *

  3. ***********************/

  4. struct MenuItem        

  5. {

  6.     char MenuCount;

  7.     char *DisplayString;

  8.     void (*Subs)();

  9.     struct MenuItem *ChildrenMenus;

  10.     struct MenuItem *ParentMenus;

  11. }NULL_MENU;



  12. void NULL_FUNCTION(void){}



  13. 我們看到,菜單的最小單元MenuItem的組成其實非常簡單:

  14. 菜單項所在層的菜單項數(shù)目(度);

  15. 菜單項顯示出來的字符串;

  16. 菜單需要執(zhí)行的功能的函數(shù)指針(可以為空);

  17. 孩子指針(表明選擇該菜單項后,跳轉(zhuǎn)到哪個子菜單去);

  18. 父指針(表明選擇ESC后,跳轉(zhuǎn)到哪個菜單去);



  19. 看一個菜單實例:

  20. (源代碼)



  21. struct MenuItem MainMenu[3];

  22. struct MenuItem TimeMenu[4];

  23. struct MenuItem VoiceMenu[5];

  24. struct MenuItem RobotMenu[5];

  25. struct MenuItem FlashMenu[5];



  26. /***********************

  27. *     函 數(shù) 聲 明 區(qū)   *

  28. ***********************/

  29. void MainMenuInit(void);

  30. void TimeMenuInit(void);

  31. void VoiceMenuInit(void);

  32. void RobotMenuInit(void);

  33. void FlashMenuInit(void);



  34. /**************************************************************

  35. *  函數(shù)說明:Flash處理目錄初始化函數(shù)                          *

  36. **************************************************************/

  37. void FlashMenuInit(void)

  38. {

  39.     FlashMenu[0].MenuCount = 5;

  40.     FlashMenu[0].DisplayString = "  Flash Record  ";

  41.     FlashMenu[0].Subs = FlashRecord;

  42.     FlashMenu[0].ChildrenMenus = &Null;

  43.     FlashMenu[0].ParentMenus = MainMenu;

  44.    

  45.     FlashMenu[1].MenuCount = 5;

  46.     FlashMenu[1].DisplayString = "      Play      ";

  47.     FlashMenu[1].Subs = FlashPlay;

  48.     FlashMenu[1].ChildrenMenus = &Null;

  49.     FlashMenu[1].ParentMenus = MainMenu;

  50.    

  51.     FlashMenu[2].MenuCount = 5;

  52.     FlashMenu[2].DisplayString = "      Pause     ";

  53.     FlashMenu[2].Subs = FlashPause;

  54.     FlashMenu[2].ChildrenMenus = &Null;

  55.     FlashMenu[2].ParentMenus = MainMenu;

  56.    

  57.     FlashMenu[3].MenuCount = 5;

  58.     FlashMenu[3].DisplayString = "  Flash Delete  ";

  59.     FlashMenu[3].Subs = FlashDelete;

  60.     FlashMenu[3].ChildrenMenus = &Null;

  61.     FlashMenu[3].ParentMenus = MainMenu;

  62.    

  63.     FlashMenu[4].MenuCount = 5;

  64.     FlashMenu[4].DisplayString = "      Back      ";

  65.     FlashMenu[4].Subs = NullSubs;

  66.     FlashMenu[4].ChildrenMenus = MainMenu;

  67.     FlashMenu[4].ParentMenus = MainMenu;

  68. }



  69. /**************************************************************

  70. *  函數(shù)說明:機器人控制目錄初始化函數(shù)                         *

  71. **************************************************************/

  72. void RobotMenuInit(void)

  73. {

  74.     RobotMenu[0].MenuCount = 5;

  75.     RobotMenu[0].DisplayString = "   Turn  Left   ";

  76.     RobotMenu[0].Subs = RobotTurnLeft;

  77.     RobotMenu[0].ChildrenMenus = &Null;

  78.     RobotMenu[0].ParentMenus = MainMenu;

  79.    

  80.     RobotMenu[1].MenuCount = 5;

  81.     RobotMenu[1].DisplayString = "   Turn Right   ";

  82.     RobotMenu[1].Subs = RobotTurnRight;

  83.     RobotMenu[1].ChildrenMenus = &Null;

  84.     RobotMenu[1].ParentMenus = MainMenu;

  85.    

  86.     RobotMenu[2].MenuCount = 5;

  87.     RobotMenu[2].DisplayString = "    Go  Ahead   ";

  88.     RobotMenu[2].Subs = RobotGoAhead;

  89.     RobotMenu[2].ChildrenMenus = &Null;

  90.     RobotMenu[2].ParentMenus = MainMenu;

  91.    

  92.     RobotMenu[3].MenuCount = 5;

  93.     RobotMenu[3].DisplayString = "     Go Back    ";

  94.     RobotMenu[3].Subs = RobotGoBack;

  95.     RobotMenu[3].ChildrenMenus = &Null;

  96.     RobotMenu[3].ParentMenus = MainMenu;

  97.    

  98.     RobotMenu[4].MenuCount = 5;

  99.     RobotMenu[4].DisplayString = "      Back      ";

  100.     RobotMenu[4].Subs = NullSubs;

  101.     RobotMenu[4].ChildrenMenus = MainMenu;

  102.     RobotMenu[4].ParentMenus = MainMenu;

  103.    

  104. }



  105. /**************************************************************

  106. *  函數(shù)說明:聲音處理目錄初始化函數(shù)                           *

  107. **************************************************************/

  108. void VoiceMenuInit(void)

  109. {

  110.     VoiceMenu[0].MenuCount = 5;

  111.     VoiceMenu[0].DisplayString = "  Voice Record  ";

  112.     VoiceMenu[0].Subs = VoiceRecord;

  113.     VoiceMenu[0].ChildrenMenus = &Null;

  114.     VoiceMenu[0].ParentMenus = MainMenu;

  115.    

  116.     VoiceMenu[1].MenuCount = 5;

  117.     VoiceMenu[1].DisplayString = "      Play      ";

  118.     VoiceMenu[1].Subs = Play;

  119.     VoiceMenu[1].ChildrenMenus = &Null;

  120.     VoiceMenu[1].ParentMenus = MainMenu;

  121.    

  122.     VoiceMenu[2].MenuCount = 5;

  123.     VoiceMenu[2].DisplayString = "      Pause     ";

  124.     VoiceMenu[2].Subs = Pause;

  125.     VoiceMenu[2].ChildrenMenus = &Null;

  126.     VoiceMenu[2].ParentMenus = MainMenu;

  127.    

  128.     VoiceMenu[3].MenuCount = 5;

  129.     VoiceMenu[3].DisplayString = "  Voice Delete  ";

  130.     VoiceMenu[3].Subs = VoiceDelete;

  131.     VoiceMenu[3].ChildrenMenus = &Null;

  132.     VoiceMenu[3].ParentMenus = MainMenu;

  133.    

  134.     VoiceMenu[4].MenuCount = 5;

  135.     VoiceMenu[4].DisplayString = "      Back      ";

  136.     VoiceMenu[4].Subs = NullSubs;

  137.     VoiceMenu[4].ChildrenMenus = MainMenu;

  138.     VoiceMenu[4].ParentMenus = MainMenu;

  139. }



  140. /**************************************************************

  141. *  函數(shù)說明:時間設定子目錄初始化                             *

  142. **************************************************************/

  143. void TimeMenuInit(void)

  144. {

  145.     TimeMenu[0].MenuCount = 4;

  146.     TimeMenu[0].DisplayString = "    Time Set    ";

  147.     TimeMenu[0].Subs = TimeSet;

  148.     TimeMenu[0].ChildrenMenus = &Null;

  149.     TimeMenu[0].ParentMenus = MainMenu;

  150.    

  151.     TimeMenu[1].MenuCount = 4;

  152.     TimeMenu[1].DisplayString = "    Date Set    ";

  153.     TimeMenu[1].Subs = DateSet;

  154.     TimeMenu[1].ChildrenMenus = &Null;

  155.     TimeMenu[1].ParentMenus = MainMenu;

  156.    

  157.     TimeMenu[2].MenuCount = 4;

  158.     TimeMenu[2].DisplayString = "    AlertSet    ";

  159.     TimeMenu[2].Subs = AlertSet;

  160.     TimeMenu[2].ChildrenMenus = &Null;

  161.     TimeMenu[2].ParentMenus = MainMenu;

  162.    

  163.     TimeMenu[3].MenuCount = 4;

  164.     TimeMenu[3].DisplayString = "      Back      ";

  165.     TimeMenu[3].Subs = NullSubs;

  166.     TimeMenu[3].ChildrenMenus = MainMenu;

  167.     TimeMenu[3].ParentMenus = MainMenu;

  168.    

  169. }



  170. /**************************************************************

  171. *  函數(shù)說明:根目錄初始化                                     *

  172. **************************************************************/

  173. void MainMenuInit(void)

  174. {

  175.      MainMenu[0].MenuCount = 3;

  176.      MainMenu[0].DisplayString = "    Time Set    ";

  177.      MainMenu[0].Subs = NullSubs;

  178.      MainMenu[0].ChildrenMenus = TimeMenu;

  179.      MainMenu[0].ParentMenus = &Null;



  180.      MainMenu[1].MenuCount = 3;

  181.      MainMenu[1].DisplayString = "  Voice Center  ";

  182.      MainMenu[1].Subs = NullSubs;

  183.      MainMenu[1].ChildrenMenus = VoiceMenu;

  184.      MainMenu[1].ParentMenus = &Null;

  185. /*

  186.      MainMenu[2].MenuCount = 3;

  187.      MainMenu[2].DisplayString = "  Robot Control ";

  188.      MainMenu[2].Subs = NullSubs;

  189.      MainMenu[2].ChildrenMenus = RobotMenu;  

  190.      MainMenu[2].ParentMenus = &Null;

  191. */     

  192.      MainMenu[2].MenuCount = 3;

  193.      MainMenu[2].DisplayString = "  Flash Option  ";

  194.      MainMenu[2].Subs = NullSubs;

  195.      MainMenu[2].ChildrenMenus = FlashMenu;     

  196.      MainMenu[2].ParentMenus = &Null;



  197. }



  198.    

  199.     struct MenuItem (*MenuPoint) = MainMenu;

  200.     short DisplayStart = 0;

  201.     short UserChoose = 0;

  202.     short DisplayPoint = 0;

  203.     short MaxItems;   





  204. /*****************************

  205. * Struct MenuItem:           *

  206. *    short MenuCount;        *

  207. *    char *DisplayString;    *

  208. *    void (*Subs)();         *

  209. *    MenuItem *ChildrenMenus;*

  210. *    MenuItem *ParentMenus;  *

  211. *****************************/



  212. /***********************

  213. *     函 數(shù) 聲 明 區(qū)   *

  214. ***********************/

  215. extern void ClearWatchDog();

  216. void MenuInitialation(void);

  217. void SystemInitialation(void);

  218. void ShowMenu(void);

  219. short GetKeyNum(void);



  220. /**************************************************************

  221. *  函數(shù)說明:系統(tǒng)初始化函數(shù)                                   *

  222. **************************************************************/

  223. void SystemInitialation(void)

  224. {

  225.         Init_sys();         

  226.         Enable_LCD();                          //初始化字庫      函數(shù)定義在Splc501sys.asm

  227.         MenuInitialation();               //初始化菜單

  228.         GRAPH                             //圖形初始化

  229. }



  230. /**************************************************************

  231. *  函數(shù)說明:目錄初始化函數(shù)                                   *

  232. **************************************************************/

  233. void MenuInitialation(void)

  234. {

  235.     MainMenuInit();

  236.     TimeMenuInit();

  237.     VoiceMenuInit();

  238.     RobotMenuInit();

  239.     FlashMenuInit();

  240. }



  241. /**************************************************************

  242. *  函數(shù)說明:目錄顯示函數(shù)                                     *

  243. **************************************************************/

  244. void ShowMenu(void)

  245. {

  246.     short n = 0;



  247.     MaxItems = MenuPoint[0].MenuCount;

  248.     DisplayPoint = DisplayStart;

  249.         if (MaxItems >= 4)

  250.         {

  251.              for (n = 0;n<4;n++)

  252.              {

  253.                         

  254.                  LOCATE(n+1,1);

  255.                  PRINT(MenuPoint[DisplayPoint].DisplayString);

  256.                  

  257.                  if ((DisplayPoint) == UserChoose)

  258.                      {

  259.                          BOX(1,n*16+1,126,(n+1)*16-2,1,1);

  260.                      }

  261.                  

  262.                      DisplayPoint +=1;

  263.                      if ((DisplayPoint) == (MaxItems))

  264.                      {

  265.                          DisplayPoint = 0;

  266.                      }

  267.              }

  268.          }

  269.          else

  270.          {

  271.              for (n = 0;n<MaxItems;n++)

  272.              {

  273.                         

  274.                  LOCATE(n+1,1);

  275.                  PRINT(MenuPoint[DisplayPoint].DisplayString);

  276.                  

  277.                  if ((DisplayPoint) == UserChoose)

  278.                      {

  279.                          BOX(1,n*16+1,126,(n+1)*16-2,1,1);

  280.                      }

  281.                  

  282.                      DisplayPoint +=1;

  283.                      if ((DisplayPoint) == (MaxItems))

  284.                      {

  285.                          DisplayPoint = 0;

  286.                      }

  287.                  

  288.              }

  289.          }

  290.         //BOX(0,0,127,63,2,2);

  291. }



  292. /**************************************************************

  293. *  函數(shù)說明:獲得鍵值函數(shù)                                     *

  294. **************************************************************/

  295. short GetKeyNum(void)

  296. {

  297.     short TempKeyNum = 0;

  298.         TempKeyNum = F_Key_Scan();       //獲取按鍵值

  299.         *P_IOA_Dir = 0x01ff;

  300.         *P_IOA_Attrib = 0x01ff;      

  301.         *P_IOA_Data = 0x01ff;

  302.             

  303.         return TempKeyNum;



  304. }



  305. /**************************************************************

  306. *  函數(shù)說明:主函數(shù)                                           *

  307. **************************************************************/

  308. int main()

  309. {                     

  310.     short KeyNum = 0xff;

  311.    

  312.     SystemInitialation();            //系統(tǒng)初始化

  313.    

  314.     ShowMenu();

  315.         while(1)

  316.         {

  317.             ClearWatchDog();             //喂狗

  318.             KeyNum = GetKeyNum();        //獲取按鍵值



  319.             /*******************目錄操作*********************/

  320.             

  321.             /***************************************

  322.             *   [按鍵說明]                         *

  323.             *  ----------------------------------- *

  324.             *   [K1]            UP(向上)           *

  325.             *   [K5]            Down(向下)         *

  326.             *   [K2]            Esc(后退)          *

  327.             *   [K6]            Enter(確定)        *

  328.             *   [K3]            返回根目錄         *

  329.             ***************************************/

  330.             if (KeyNum != 0xff)

  331.             {

  332.              ShowMenu();

  333.                  switch(KeyNum)

  334.                  {

  335.                      case UP:

  336.                          UserChoose --;

  337.                          if (UserChoose < 0)

  338.                          {

  339.                              UserChoose = MaxItems-1;

  340.                          }

  341.                          break;

  342.                      case Esc:

  343.                          if (MenuPoint[0].ParentMenus != &Null)

  344.                          {

  345.                              MenuPoint = MenuPoint[0].ParentMenus;

  346.                              UserChoose = 0;

  347.                              DisplayStart = 0;

  348.                          }

  349.                          break;

  350.                      case Down:

  351.                          UserChoose ++;

  352.                          if (UserChoose == MaxItems)

  353.                          {

  354.                              UserChoose = 0;

  355.                          }

  356.                         

  357.                          break;

  358.                      case Enter:

  359.                          if (MenuPoint[UserChoose].Subs != NullSubs)

  360.                          {

  361.                              (*MenuPoint[UserChoose].Subs)();

  362.                          }

  363.                          else if (MenuPoint[UserChoose].ChildrenMenus != &Null)

  364.                          {

  365.                              MenuPoint = MenuPoint[UserChoose].ChildrenMenus;

  366.                              UserChoose = 0;

  367.                              DisplayStart = 0;

  368.                          }

  369.                          break;

  370.                      case Reset:

  371.                          MenuPoint = MainMenu;

  372.                          UserChoose = 0;

  373.                          DisplayStart = 0;

  374.                          break;

  375.                  }

  376.                  

  377.                  if ((UserChoose < DisplayStart) || (UserChoose > (DisplayStart+3)))

  378.                  {

  379.                     DisplayStart = UserChoose;

  380.                  }

  381.                  

  382.                  CLS

  383.                  ShowMenu();

  384.                  

  385.             }

  386.             /*******************目錄操作*********************/

  387.         }

  388.         



  389. }
復制代碼





過多的廢話我就不多說了,大家看了就清楚了哈。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:59202 發(fā)表于 2017-2-13 02:13 | 只看該作者
這個資料都出來好多年了,我現(xiàn)在寫菜單程序就是學這個的
回復

使用道具 舉報

板凳
ID:184267 發(fā)表于 2017-7-21 21:01 | 只看該作者
注釋有點少啊,有沒有效果圖,看了不是很懂
回復

使用道具 舉報

地板
ID:212343 發(fā)表于 2017-7-22 08:09 | 只看該作者
應該加個仿真的
回復

使用道具 舉報

5#
ID:221534 發(fā)表于 2018-4-7 16:11 | 只看該作者
評論有黑幣嗎,  我來試著評論一下.
回復

使用道具 舉報

6#
ID:753283 發(fā)表于 2020-6-1 23:06 來自手機 | 只看該作者
樓主有電路圖嗎
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产日产久久高清欧美一区 | 久久伊 | 精国产品一区二区三区四季综 | 国产精品久久国产精品久久 | www.日韩欧美 | 天堂资源| 日本中文字幕在线观看 | 国产精品一区二区视频 | 亚洲一区二区三 | 久久久91精品国产一区二区三区 | 日韩一区二区三区在线视频 | 亚洲高清视频在线观看 | 欧美精品在线播放 | 三级黄色网址 | 日韩成人在线观看 | 亚洲第一女人av | 日韩视频一区在线观看 | 国产精品99久久久久久宅男 | 日韩视频中文字幕 | 先锋av资源网 | 亚洲欧美视频 | 成人免费小视频 | 亚洲一区二区三区在线 | 欧美日韩国产精品一区 | 亚洲国产精品久久久久 | 老司机67194精品线观看 | 鲁一鲁资源影视 | 视频在线一区二区 | 成人婷婷 | 亚洲视频在线免费观看 | 亚洲高清视频一区二区 | www.日韩| 日韩精品一区二区三区在线播放 | 波波电影院一区二区三区 | 成人国产免费视频 | 国产91九色 | 成年人在线观看视频 | 久久免费视频网 | 日本中文在线视频 | 一级看片免费视频囗交动图 | 日韩欧美一区二区三区四区 |