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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10683|回復: 12
打印 上一主題 下一主題
收起左側

一個51單片機1602結構體多級菜單仿真+源程序分享

  [復制鏈接]
跳轉到指定樓層
樓主
ID:246657 發表于 2017-11-7 17:14 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
結構體多級菜單,從網上下來的,移植后覺得還不錯,分享給大家

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #ifndef        _Menu_H_
  2. #define _Menu_H_

  3. #include"LCD1602.h"                                    //液晶顯示器頭文件
  4. #include"KeYsCan.h"
  5. #include"TimEDisPlaY.H"


  6. #define        LCD1602MaxDisplaYLinE        2          //LCD最大顯示行數

  7. #define        UP          0                                   //上                                                  
  8. #define Down  1                            //下
  9. //#define LeFt  4                                               //確定
  10. //#define RigHt 5                                             //退出

  11. #define        Enter 2
  12. #define Esc   3

  13. void NullSubs(void)                                            //空函數                  
  14. {                                   }

  15. struct         MenuItem code        SysTemSet[5];      //這里不聲明一下,MainMenu里不能引用
  16. struct         MenuItem code        BaudRatE[7];           //同上
  17. struct         MenuItem code        EquipmenT[4];           //同上

  18. //*------------------------------------------------------------------------------
  19. //*目錄結構體定義   
  20. //*------------------------------------------------------------------------------
  21. struct         MenuItem                           //結構體名稱
  22. {                 unsigned char         MenuCount;         //當前層節點數、每層菜單能顯示的條目數
  23.             unsigned char         *DisplayString;    //指向菜單標題的字符串
  24.             unsigned char         (*Subs)();         //指向當前狀態應該執行的功能函數
  25.             struct MenuItem         *ChildrenMenus;//指向當前菜單的下級菜單
  26.             struct MenuItem         *ParentMenus;  //指向當前菜單的上級菜單
  27. }                Null;

  28. struct        MenuItem code         MainMenu[4] =      //結構體主菜單
  29. {       
  30.                 {4,"1.SysTem Set    ",&Null,SysTemSet,&Null},
  31.                 {4,"2.EquipmenT ID  ",&Null,EquipmenT,&Null},
  32.                 {4,"3.BaudRatE      ",&Null,BaudRatE, &Null},
  33.                 {4,"4.System Infor  ",&Null,&Null,          &Null},
  34. };

  35. struct         MenuItem code        SysTemSet[5] =           //系統菜單
  36. {
  37.                 {5,"1.DatA  Set     ",&Null,&Null,MainMenu},
  38.                 {5,"2.TimE  Set     ",&Null,&Null,MainMenu},
  39.                 {5,"3.AlarM Set     ",&Null,&Null,MainMenu},
  40.                 {5,"4.BacKLed  Set  ",&Null,&Null,MainMenu},
  41.                 {5,"5.Password Set  ",&Null,&Null,   &Null},
  42. };

  43. struct         MenuItem code        BaudRatE[7] =           //波特率
  44. {
  45.                 {7,"1.2400          ",&Null,&Null,MainMenu},
  46.                 {7,"2.4800          ",&Null,&Null,MainMenu},
  47.                 {7,"3.9600          ",&Null,&Null,MainMenu},
  48.                 {7,"4.19200         ",&Null,&Null,MainMenu},
  49.                 {7,"5.38400         ",&Null,&Null,MainMenu},
  50.                 {7,"6.57600         ",&Null,&Null,MainMenu},
  51.                 {7,"7.115200        ",&Null,&Null,MainMenu},
  52. };

  53. struct         MenuItem code        EquipmenT[4] =           //設備號
  54. {
  55.                 {4,"1.No.01         ",&Null,&Null,MainMenu},
  56.                 {4,"2.No.02         ",&Null,&Null,MainMenu},
  57.                 {4,"3.NO.03         ",&Null,&Null,MainMenu},
  58.                 {4,"4.No.04         ",&Null,&Null,MainMenu},
  59. };

  60. struct         MenuItem (*MenuPoint) = MainMenu;
  61. char        DisplayStart  = 0;                                //顯示菜單的開始位置   
  62. char         UserChoose    = 0;                                    //用戶的選擇
  63. char         DisplayPoint  = 0;                                    //顯示菜單的編號
  64. char         MaxItems      = 0;                             //菜單的數量
  65. char         Option                  = 0;                 //保存用戶的菜單編號


  66. //*------------------------------------------------------------------------------
  67. //*顯示函數
  68. //*------------------------------------------------------------------------------
  69. void        ShowMenu(void)
  70. {
  71.                 unsigned char i = 0;
  72.                 MaxItems = MenuPoint[0].MenuCount;        //獲取當前菜單的條目數
  73.                 DisplayPoint = DisplayStart;
  74.                 if (MaxItems > LCD1602MaxDisplaYLinE){          //如果大于能顯示的菜單數做處理
  75.                         for (i = 0;i < LCD1602MaxDisplaYLinE;i++){
  76.                                         LCD1602wRITESTring(i,1,MenuPoint[DisplayPoint].DisplayString);
  77.                                         if ((DisplayPoint) == (UserChoose)){
  78.                                                         LCD1602SetWZ(0,0,0x7e);   //寫小箭頭
  79.                                                 }
  80.                                         else{
  81.                                                         LCD1602SetWZ(i,0,' ');          //寫空格
  82.                                                 }
  83.                                         DisplayPoint += 1;   //字符串偏移量+1
  84.                                         if ((DisplayPoint) == (MaxItems)){
  85.                                                         DisplayPoint = 0;
  86.                                                 }       
  87.                                 }
  88.                         }
  89.                 else{
  90.                         for (i = 0;i < LCD1602MaxDisplaYLinE;i++){
  91.                                           LCD1602wRITESTring(i,1,MenuPoint[DisplayPoint].DisplayString);
  92.                                         if ((DisplayPoint) == (UserChoose)){
  93.                                                         LCD1602SetWZ(0,0,0x7e);          //寫小箭頭
  94.                                                 }
  95.                                         else{
  96.                                                         LCD1602SetWZ(i,0,' ');    //寫空格
  97.                                                 }
  98.                                         DisplayPoint += 1;        //字符串偏移量+1
  99.                                         if ((DisplayPoint) == (MaxItems)){
  100.                                                         DisplayPoint = 0;
  101.                                                 }
  102.                                 }
  103.                         }
  104. }
  105. //*------------------------------------------------------------------------------
  106. //*菜單執行函數
  107. //*------------------------------------------------------------------------------
  108. void        ChangeMenu(void)
  109. {                unsigned char GetKeyNum;
  110.                 GetKeyNum = KeYsCanFuc();
  111.                 if (GetKeyNum != 0xff){                 //確定有功能按鍵被按下的情況下才執行其功能
  112.                         ShowMenu();                                                //顯示菜單
  113.                         switch (GetKeyNum){
  114.                                 case UP:
  115.                                         UserChoose--;                        //用戶菜單的選擇
  116.                                         if (UserChoose < 0){
  117.                                                 UserChoose = MaxItems - 1;
  118.                                         }
  119.                                         break;
  120.                                 case Down:
  121.                                         UserChoose++;
  122.                                         if (UserChoose == MaxItems){
  123.                                                 UserChoose = 0;
  124.                                         }
  125.                                         break;
  126.                                 case Enter:
  127.                                         if ((MenuPoint[UserChoose].Subs) != NullSubs){
  128.                                 (*MenuPoint[UserChoose].Subs)();
  129.                             }
  130.                             if (MenuPoint[UserChoose].ChildrenMenus != &Null){
  131.                                 MenuPoint          = MenuPoint[UserChoose].ChildrenMenus;  //指向子菜單
  132.                                                 Option                 = UserChoose;
  133.                                 UserChoose          = 0;
  134.                                 DisplayStart = 0;
  135.                             }
  136.                          break;
  137.                                 case Esc:
  138.                             if (MenuPoint[0].ParentMenus != &Null){                                  
  139. ……………………

  140. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
新建文件夾.rar (139.23 KB, 下載次數: 384)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏13 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:292571 發表于 2018-3-16 00:01 | 只看該作者
怎么下載
回復

使用道具 舉報

板凳
ID:292571 發表于 2018-3-16 00:02 | 只看該作者
怎么下載不了呢
回復

使用道具 舉報

地板
ID:304328 發表于 2018-4-9 11:56 | 只看該作者
想學習一下
回復

使用道具 舉報

5#
ID:97310 發表于 2018-4-12 13:19 來自觸屏版 | 只看該作者
多級菜單,蒙圈了。
回復

使用道具 舉報

6#
ID:33713 發表于 2018-11-22 17:40 | 只看該作者
老例子了,不過我改成了STM32 有空傳上來
回復

使用道具 舉報

7#
無效樓層,該帖已經被刪除
8#
ID:82683 發表于 2019-5-7 16:42 | 只看該作者
下載看看
回復

使用道具 舉報

9#
無效樓層,該帖已經被刪除
10#
ID:711846 發表于 2020-6-24 10:27 | 只看該作者
qwrjnb 發表于 2018-11-22 17:40
老例子了,不過我改成了STM32 有空傳上來

你好,請問您STM32的資料還有嗎
回復

使用道具 舉報

11#
ID:495287 發表于 2020-6-27 13:51 | 只看該作者
謝謝樓主分享。
回復

使用道具 舉報

12#
無效樓層,該帖已經被刪除
13#
ID:47634 發表于 2021-4-22 06:21 | 只看該作者
這個很好,下載學習,感謝樓主
回復

使用道具 舉報

14#
ID:903915 發表于 2021-6-29 21:56 | 只看該作者
Thanks for your kind, my master.
回復

使用道具 舉報

15#
無效樓層,該帖已經被刪除
16#
ID:953296 發表于 2021-7-15 21:45 | 只看該作者
下載了,仿真和程序都好用
回復

使用道具 舉報

17#
無效樓層,該帖已經被刪除
18#
無效樓層,該帖已經被刪除
19#
ID:563955 發表于 2022-4-26 09:54 | 只看該作者
試下能看懂不
回復

使用道具 舉報

20#
無效樓層,該帖已經被刪除
21#
無效樓層,該帖已經被刪除
22#
無效樓層,該帖已經被刪除
23#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲成人免费视频 | 国产高清免费视频 | 久久久片 | 亚洲伊人精品酒店 | h视频网站在线观看 | 日韩一区二区福利视频 | 欧美日韩a| 黄色毛片一级 | 亚洲成av人片在线观看 | 欧美日韩一卡二卡 | 毛片网站在线观看 | 久久国产日韩 | 九色网址 | 黑人性hd| 高清av在线 | 婷婷综合在线 | 久久不卡| 亚洲高清一区二区三区 | 91极品欧美视频 | 天天做日日做 | 欧美一区二区在线 | 亚洲精品二三区 | 成人国产精品久久久 | 国产精品久久久久久久久久 | 欧美不卡一区二区三区 | 无码日韩精品一区二区免费 | 国产激情一区二区三区 | 欧美专区在线 | 神马影院一区二区三区 | 国产小视频在线观看 | 最新中文在线视频 | 一级一级一级毛片 | 欧美一级片a| 搞黄视频免费看 | 国产精品成人一区二区 | 色婷婷综合久久久中字幕精品久久 | 国产激情精品一区二区三区 | 国产精品成人久久久久 | 午夜久久久久久久久久一区二区 | 日韩一区二区三区在线 | 91极品尤物在线播放国产 |