基本功能
1.顯示日期、時鐘
2.顯示溫濕度
3.帶菜單功能,可以輕松擴展N級菜單
設置界面
356737568.jpg (92.44 KB, 下載次數: 31)
下載附件
設置界面
2018-6-3 08:31 上傳
設置界面
1952022184.jpg (89.81 KB, 下載次數: 35)
下載附件
設置界面
2018-6-3 08:31 上傳
二級菜單
2129843992.jpg (102.35 KB, 下載次數: 31)
下載附件
二級菜單
2018-6-3 08:31 上傳
一級菜單
356063761.jpg (93.08 KB, 下載次數: 22)
下載附件
一級菜單
2018-6-3 08:31 上傳
時鐘界面
2085769803.jpg (107.43 KB, 下載次數: 24)
下載附件
時鐘界面
2018-6-3 08:30 上傳
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (18.71 KB, 下載次數: 36)
下載附件
2018-6-3 17:30 上傳
單片機源程序(菜單處理文件)如下:
- #ifndef _Menu_H_
- #define _Menu_H_
- #include"LCD1602.h" //液晶顯示器頭文件
- #include"KeYsCan.h"
- #include"TimEDisPlaY.H"
- #define LCD1602MaxDisplaYLinE 2 //LCD最大顯示行數
- #define UP 0 //上
- #define Down 1 //下
- //#define LeFt 4 //確定
- //#define RigHt 5 //退出
- #define Enter 2
- #define Esc 3
- void NullSubs(void) //空函數
- { }
- struct MenuItem code SysTemSet[5]; //這里不聲明一下,MainMenu里不能引用
- struct MenuItem code BaudRatE[7]; //同上
- struct MenuItem code EquipmenT[4]; //同上
- //*------------------------------------------------------------------------------
- //*目錄結構體定義
- //*------------------------------------------------------------------------------
- struct MenuItem //結構體名稱
- { unsigned char MenuCount; //當前層節點數、每層菜單能顯示的條目數
- unsigned char *DisplayString; //指向菜單標題的字符串
- unsigned char (*Subs)(); //指向當前狀態應該執行的功能函數
- struct MenuItem *ChildrenMenus;//指向當前菜單的下級菜單
- struct MenuItem *ParentMenus; //指向當前菜單的上級菜單
- } Null;
- struct MenuItem code MainMenu[4] = //結構體主菜單
- {
- {4,"1.SysTem Set ",&Null,SysTemSet,&Null},
- {4,"2.EquipmenT ID ",&Null,EquipmenT,&Null},
- {4,"3.BaudRatE ",&Null,BaudRatE, &Null},
- {4,"4.System Infor ",&Null,&Null, &Null},
- };
- struct MenuItem code SysTemSet[5] = //系統菜單
- {
- {5,"1.DatA Set ",&Null,&Null,MainMenu},
- {5,"2.TimE Set ",&Null,&Null,MainMenu},
- {5,"3.AlarM Set ",&Null,&Null,MainMenu},
- {5,"4.BacKLed Set ",&Null,&Null,MainMenu},
- {5,"5.Password Set ",&Null,&Null, &Null},
- };
- struct MenuItem code BaudRatE[7] = //波特率
- {
- {7,"1.2400 ",&Null,&Null,MainMenu},
- {7,"2.4800 ",&Null,&Null,MainMenu},
- {7,"3.9600 ",&Null,&Null,MainMenu},
- {7,"4.19200 ",&Null,&Null,MainMenu},
- {7,"5.38400 ",&Null,&Null,MainMenu},
- {7,"6.57600 ",&Null,&Null,MainMenu},
- {7,"7.115200 ",&Null,&Null,MainMenu},
- };
- struct MenuItem code EquipmenT[4] = //設備號
- {
- {4,"1.No.01 ",&Null,&Null,MainMenu},
- {4,"2.No.02 ",&Null,&Null,MainMenu},
- {4,"3.NO.03 ",&Null,&Null,MainMenu},
- {4,"4.No.04 ",&Null,&Null,MainMenu},
- };
- struct MenuItem (*MenuPoint) = MainMenu;
- char DisplayStart = 0; //顯示菜單的開始位置
- char UserChoose = 0; //用戶的選擇
- char DisplayPoint = 0; //顯示菜單的編號
- char MaxItems = 0; //菜單的數量
- char Option = 0; //保存用戶的菜單編號
- //*------------------------------------------------------------------------------
- //*顯示函數
- //*------------------------------------------------------------------------------
- void ShowMenu(void)
- {
- unsigned char i = 0;
- MaxItems = MenuPoint[0].MenuCount; //獲取當前菜單的條目數
- DisplayPoint = DisplayStart;
- if (MaxItems > LCD1602MaxDisplaYLinE){ //如果大于能顯示的菜單數做處理
- for (i = 0;i < LCD1602MaxDisplaYLinE;i++){
- LCD1602wRITESTring(i,1,MenuPoint[DisplayPoint].DisplayString);
- if ((DisplayPoint) == (UserChoose)){
- LCD1602SetWZ(0,0,0x7e); //寫小箭頭
- }
- else{
- LCD1602SetWZ(i,0,' '); //寫空格
- }
- DisplayPoint += 1; //字符串偏移量+1
- if ((DisplayPoint) == (MaxItems)){
- DisplayPoint = 0;
- }
- }
- }
- else{
- for (i = 0;i < LCD1602MaxDisplaYLinE;i++){
- LCD1602wRITESTring(i,1,MenuPoint[DisplayPoint].DisplayString);
- if ((DisplayPoint) == (UserChoose)){
- LCD1602SetWZ(0,0,0x7e); //寫小箭頭
- }
- else{
- LCD1602SetWZ(i,0,' '); //寫空格
- }
- DisplayPoint += 1; //字符串偏移量+1
- if ((DisplayPoint) == (MaxItems)){
- DisplayPoint = 0;
- }
- }
- }
- }
- //*------------------------------------------------------------------------------
- //*菜單執行函數
- //*------------------------------------------------------------------------------
- void ChangeMenu(void)
- { unsigned char GetKeyNum;
- GetKeyNum = KeYsCanFuc();
- if (GetKeyNum != 0xff){ //確定有功能按鍵被按下的情況下才執行其功能
- ShowMenu(); //顯示菜單
- switch (GetKeyNum){
- case UP:
- UserChoose--; //用戶菜單的選擇
- if (UserChoose < 0){
- UserChoose = MaxItems - 1;
- }
- break;
- case Down:
- UserChoose++;
- if (UserChoose == MaxItems){
- UserChoose = 0;
- }
- break;
- case Enter:
- if ((MenuPoint[UserChoose].Subs) != NullSubs){
- (*MenuPoint[UserChoose].Subs)();
- }
- if (MenuPoint[UserChoose].ChildrenMenus != &Null){
- MenuPoint = MenuPoint[UserChoose].ChildrenMenus; //指向子菜單
- Option = UserChoose;
- UserChoose = 0;
- DisplayStart = 0;
- }
- break;
- case Esc:
- if (MenuPoint[0].ParentMenus != &Null){
- MenuPoint = MenuPoint[0].ParentMenus; //指向父菜單
- UserChoose = 0;
- DisplayStart = 0;
- UserChoose = Option; //恢復先前的菜單
- }
- break;
- }
- //*--------------------------------------------------------------------
- //*菜單循環處理
- if ((UserChoose < DisplayStart) || (UserChoose >= (DisplayStart + 1 ))){
- DisplayStart = UserChoose;
- }
- //*--------------------------------------------------------------------
- LCD1602CLEARDisplaY();
- ShowMenu();
- }
- }
- #endif
復制代碼
- /**
- **************************************************************
- *Program Name:
- * MCU : STC89C52RC
- * CrystaL : 12MHz
- **************************************************************/
- #include"LCD1602.h" //液晶顯示器頭文件
- #include"Menu.h"
- #include"AT89X52.h" //51MCU頭文件
- #include"KeYsCan.h"
- #include"AT24C02.h"
- #include"DHT11.h"
- #include"DS1302.h"
- #include"TimEDisPlay.h"
- void main(void)
- { LCD1602Initial(); //液晶顯示初始化
- ShowMenu(); //顯示菜單
- // DS1302InitiaL();
- while(1){
- // TimeDisPlaYFuc();
- ChangeMenu();
- }
- }
復制代碼
0.png (10.79 KB, 下載次數: 35)
下載附件
2018-6-3 17:32 上傳
所有資料51hei提供下載:
Protues.rar
(31.99 KB, 下載次數: 81)
2018-6-3 08:33 上傳
點擊文件名下載附件
仿真 下載積分: 黑幣 -5
Clock.rar
(109.3 KB, 下載次數: 91)
2018-6-3 08:33 上傳
點擊文件名下載附件
程序 下載積分: 黑幣 -5
|