找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4483|回复: 6
收起左侧

带菜单的LCD1602电子时钟源码与proteus仿真工程

[复制链接]
ID:343814 发表于 2018-6-3 08:33 | 显示全部楼层 |阅读模式
基本功能
1.显示日期、时钟
2.显示温湿度
3.带菜单功能,可以轻松扩展N级菜单

设置界面

设置界面

设置界面


设置界面

设置界面

设置界面


二级菜单

二级菜单

二级菜单


一级菜单

一级菜单

一级菜单


时钟界面

时钟界面

时钟界面


仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

单片机源程序(菜单处理文件)如下:
  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.                                     MenuPoint          = MenuPoint[0].ParentMenus;                          //指向父菜单
  140.                                     UserChoose          = 0;
  141.                                     DisplayStart = 0;
  142.                                                 UserChoose   = Option;        //恢复先前的菜单
  143.                             }
  144.                          break;                                 
  145.                         }
  146.                         //*--------------------------------------------------------------------
  147.                         //*菜单循环处理
  148.                         if ((UserChoose < DisplayStart) || (UserChoose >= (DisplayStart + 1 ))){
  149.                             DisplayStart = UserChoose;
  150.                     }  
  151.                         //*--------------------------------------------------------------------
  152.                         LCD1602CLEARDisplaY();
  153.                     ShowMenu();               
  154.                 }
  155. }

  156. #endif
复制代码

  1. /**
  2. **************************************************************
  3. *Program Name:
  4. *    MCU     :                STC89C52RC   
  5. *  CrystaL   :        12MHz
  6. **************************************************************/

  7. #include"LCD1602.h"         //液晶显示器头文件
  8. #include"Menu.h"
  9. #include"AT89X52.h"         //51MCU头文件
  10. #include"KeYsCan.h"
  11. #include"AT24C02.h"
  12. #include"DHT11.h"
  13. #include"DS1302.h"
  14. #include"TimEDisPlay.h"



  15. void        main(void)
  16. {                LCD1602Initial();                        //液晶显示初始化
  17.                 ShowMenu();                 //显示菜单
  18. //                DS1302InitiaL();
  19.                 while(1){        
  20.                 //                TimeDisPlaYFuc();
  21.                                 ChangeMenu();               
  22.                 }
  23. }
复制代码

0.png

所有资料51hei提供下载:

Protues.rar (31.99 KB, 下载次数: 80)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:466655 发表于 2019-3-7 21:00 | 显示全部楼层
多级菜单源代码 找了好几个 没有积分 无法下载
回复

使用道具 举报

ID:425191 发表于 2019-3-7 21:50 | 显示全部楼层
感谢楼主,正在找这个学习
回复

使用道具 举报

ID:454155 发表于 2019-4-20 14:12 | 显示全部楼层
设置菜单的界面没有出来代码
回复

使用道具 举报

ID:472369 发表于 2019-4-20 20:24 | 显示全部楼层
感谢楼主,正在学习时钟显示,这个帮助很大
回复

使用道具 举报

ID:503370 发表于 2019-6-17 10:33 | 显示全部楼层
为啥是两个啊
回复

使用道具 举报

ID:564509 发表于 2019-6-17 14:03 | 显示全部楼层
多谢大佬,拯救我的实训谢谢谢!!!!!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表