結構體多級菜單,從網上下來的,移植后覺得還不錯,分享給大家
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (18.47 KB, 下載次數: 81)
下載附件
2017-11-8 03:14 上傳
0.png (47.53 KB, 下載次數: 74)
下載附件
2017-11-8 03:14 上傳
單片機源程序如下:
- #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){
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
新建文件夾.rar
(139.23 KB, 下載次數: 384)
2017-11-7 17:14 上傳
點擊文件名下載附件
1602菜單 下載積分: 黑幣 -5
|