单片机多级菜单编程实现Word文档下载推荐.docx
《单片机多级菜单编程实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单片机多级菜单编程实现Word文档下载推荐.docx(9页珍藏版)》请在冰点文库上搜索。
![单片机多级菜单编程实现Word文档下载推荐.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/6b10107c-ba0b-450c-8cce-7f815d2c521d/6b10107c-ba0b-450c-8cce-7f815d2c521d1.gif)
structMenuTyp*pParent;
//指向上层菜单得指针
structMenuTyp*pChiId:
//指向子菜单得指针
structMenuTyp次pRight;
〃指向右菜单得指针
structMenuTyp*pLeft;
〃指向左菜单得指针b}MENUTYP:
b我根据网上得资料做得一个菜单:
/****************菜单数据结构**********次********
***/bst「uctKeyTabstruct{
uint8Menulndex;
〃当前状态索引号
uint8MaxItems:
//本级菜单最大条目数buint8ShowLeveI;
//菜单显示内容buint8PressOk:
//按下“回车”键时转向得状态索引号uint8PressEsc;
//按下"
返回"
键时转向得状态索引号
uint8PressDown:
〃按下”向下"
键时转向得状态索引号buint8PressUp;
〃按下"
向上“键时转向得状态索引号
void(*Current0perate)();
〃当前状态应该执行得功能操作b};
uint8MenuID:
〃菜单ID号
uint8MenuNextID;
〃下级菜单ID号b//CurMenulD=本菜单IDb//MaxMenuItem=同级菜单最大项数
//OkMenuID二子菜单层所对应得菜单ID,ID=999为菜单已经到底了
//EscMenUID=父菜单层所对应得菜单ID,ID=999为菜单已经到顶了b〃DownMenuID=弟菜单层所对应得菜单ID,ID=999为菜单就是独生子b//UpMenuID二兄菜单层所对应得菜单ID,ID=999为菜单就是独生子
//CurFunction二本菜单所对应得菜单函数指针
conststructKeyTabStructKeyTab[MAXKEYTABSTRUCT_NUM]=S〃Cu「MenuID,axMenuItem,MenuShowLevel,OkMenuID,EscMenuID,DownMenuID,UpMenuID,CurFunction{MENU_EDIT,
0,0zMENUDATAVIEW,MENUNO,MENUNO,MENUNO,
*MenuEdit},
{MENU_DATA一VIEW,3,1,MENUDATA_VIEW_FIRE,MENUE
DIT,MENUSYSEDIT,MENUPRINTDATA,*MenuEdit},(MENU_DATA^VIEW_FIREZ5,MENU_NO,MENU_NO,MEN
UDATAVIEW,MENUDATAVIEWTROUBLE,MENUSTEPFOLLOW,*MenuDataViewIn},
{MENU_DATA_VIEW一TROUBLE,5,MENU_NO,MENU_NO,MENU_DATA_VIEW,MENU_DATA_VIEW_REPEAT,MENU_DATA_VIEW_FIRE,*MenuDataViewIn},
{MENU_DATA_VIEW_REPEAT,5,MENU_NO,bMENU_NO,MENUDATAVIEW,MENUFACECHECK,bMENUDATAVIEWTROUBLE,*MenuDataViewin},
{MENUFACECHECK,5,MENUNO,bMENUNO,MENUDATA_VIEW,MENUSTEP_FOLLOW,
MENU_DATA_VIEW_REPEAT,*MenuFaceCheck},b{MENU_STEP
FOLLOW,5,MENUNO,bMENUNO,MENUDATAVIEW,
MENU_DATA_VIEWFIRE,MENU_FACECHECKMenuStepFoiiow},
{MENUSYS_EDIT,3,
2,MENU_SUMSET,MENU_EDITZ
MENU_PRINT_DATAZMENU_DATA_VIEW,*MenuEdit},{MENU_SUM_SET,6,MENU_NO,bMENU_NO,MENU_SYSEDIT,
MENU_EDIT_INSULATE,
MENU_TIME_SET,*MenuSumSet},
(MENU_EDIT_INSULATE,6,MENU_N0,
MENUNO,MENUSYSEDIT,MENUEDITHZ,MENUSUMSET,*MenuEditlnsulate},b{MENUEDIT_HZ,6,MENU_NO,
MENU_NO,MENU_SYS_EDITzMENU_LD_CONTROL,MENU_EDIT_INSULATE,*MenuEditHZ},
{MENU_LDCONTROL,6,
MENUNO,MENUNO,MENUSYSEDIT,MENULDDELAYMENUEDIT_HZ,*MenuLDControl},
{MENULDDELAY,6,bMENUNO,MENUNO,MENUSYSEDIT,MENU_TIME_SET,bMENULD_CONTROL,*MenuLDDelay}q{MENU_TIME_SET,6,MENU_NO,
MENUNO,MENUSYSEDIT,MENUSUMSET,MENULDDELAY,b*MenuTimeSet},
{MENU_PRINT_DATA,3,3,bMENU_PRINTDATAFIRE,MEN
U_EDIT,MENU_DATAVIEW,bMENU_SYS_EDIT,*MenuEdit}z{MENU_PRINTDATA_FIRE,4,
MENUNO,MENUNO,MENUPRINTDATA,bMENUPRINTDATA_TROUBLE,MENU_PRINT_SET,*MenuPrintDataIn},b{MENU_PRINT_DATA_TROUBLE,4,MENUNO,
MENU_NO,MENU_PRINT_DATA,MENU_PRINTER_CHECK,bMENUPRINT_DATA_FIRE,*MenuPrintDataln},
{MENU_PRINTERCHECK,4,MENU_NO,
MENUNO,MENUPRINTDATA,MENUPRINTSET,bMENUPRINTDATA_TROUBLE,*MenuPZntDataIn},b{MENU_PRINT
SET,4,MENU_NOZ
MENUNO,MENUPRINTDATA,MENUPRINTDATAFIRE,bMENU_PRINTER_CHECK,*MenuPrintSet},
}:
/"
k**'
k*******次**次次**'
k'
k*****************编程菜单显示数据
******************************/
conststruetMenuDispDataMenuEditShow[][MENU_MAX]=
{{MENU_NO,0,0,〃选择:
消音一退出”},//主菜单
{MENU_DATA_VIEW,1,6,"
1•数据查瞧〃},b{MENU_SYS_E
DIT,2,6,”2.系统编程"
}q{MENUPRINT_DATA,3,6Z"
3.
数据打印”}}q{(MENU_NO,0,0,"
数据查瞧:
消音一退出“},//数据查
瞧^{MENU_DATA_VIEW_FIRE,1,4,"
1•火警}b{MENU_DATA_V
{MENUDATA_VIEW_REPEAT,3,4,"
3.重码”},
{MENUFACE_CHECK,1,12,“4.面板检测)
{MENUSTEP_FOLLOW,2,12,“5.单步跟踪"
}}q{{MENU_NO,0,
0z“系统编程:
消音一退出”},〃系统编程
(MENU_SUM_SET,1,0,"
1.容量设置号,
{MENU_EDITINSULATE,2,0,“2.隔离点“},
(MENU_EDIT_HZ,3,0,"
3.汉字描述"
}q{MENU_LD_CONTROL,
1,12,“4.联动控制“},
{MENU_LDDELAY,2,12,"
5.模块延时“}q{MENU_TIME_SET,
3,12,"
6.时钟调整"
}},b{(MENU_NO,0,0,”数据打印:
消音
-退出”},〃数据打印b{MENU_PRINT_DATA_FIRE,lz0,"
1.火警数据”},
{MENUPRINT_DATA_TROUBLE,2,0,"
2.故障数据“}z
{MENU_PRINTER_CHECK,3,0,“3.打印机自检”},
{MENU_PRINT_SET,1,12,"
4.打印设置"
}},b};
b/******
*****************************等待按键********
*********次*次*次*次**********/
voidWaitKey(void)
{buint32time;
time=RTCFlag:
WhichKey=KEY_NONE:
bwhi1e(!
EscFlag){
if(RTCFIag—time>
=EDIT_TIME>
EscFlag=TRUE;
bif(WhichKey!
=KEYNONE){bKeySound(300);
//按键音return;
}
**/
}b/***'
k******'
k***********'
k*******显示多级菜单b
*******夫*******夫夫*********夫
voidMenuEdit(陆{buint32i,j=0;
buint32oIdid;
j=KeyTab[MenuID]、ShowLevel:
bif(WhichKey==KEY_ESCII
WhichKey==KEY_OK){
C1earSereen():
bfor(i=0:
i<
KeyTab[MenuNextID]、Maxltems+1;
i++)
ShowString(MenuEditshow[j][i]、Lin,MenuEditShow[j]b[i]、Column,MenuEditShow[j][i]、PdatazO);
〃初始化显示boldid=bO:
b//没有原先选择得项b}else{
if(WhichKey==KEYUP)
o1did=KeyTab[MenuNextID]、PressDown;
elseoldid=KeyTab
[MenuNextID]、PressUp;
b〃指示原先得项b}bfor(i=1:
KeyTab
[MenuNextID]、MaxItems+l;
i++){bif(MenuEditShow[j][i]、Id==oldid)
ShowString(MenuEditShow[j][订、LinzMenuEditShow[j]b[i]、Column,MenuEditShow[j][i]、Pdataz0);
〃正常显示原先得项beIse{bif(MenuEditShow[j][订、Id==MenuNextID)howString(MenuEditShow[j][i]、Lin,MenuEditShow
[j][i]、Column,MenuEditShow[j][i]、Pdata,1);
//反显当前选择得项b}
WhichKey=KEYNONE;
/**********火夫夫夫****************系统编程*******
**********夫************
uint32Edit(void)b{
structKeyTabStructNowKeyTab;
〃指示当前得菜单值buint32
escfIag=FALSE;
bResetFlag=FALSE:
bChangeFIag=FALSE;
bEscFlag=FALSE;
bMenuID=MENU_EDIT:
NowKeyTab=KeyTab[MenuID];
bMenuNextID=NowKeyTab.PressOk:
(^NowKeyTab.CurrentOperate)();
〃显示主菜单
do{
if(WhichKey==KEY_NONE)
WaitKey():
〃等待按键bswitch(WhichKey){
caseKEYESC:
if(NowKeyTab、PressEsc!
=MENU_NO)b{
MenuID=bNowKeyTab、PressEsc;
MenuNextID=bNowKeyTab、MenuIndex;
NowKeyTab=KeyTabb[MenuID];
NowKeyTab.PressOk=
MenuNextID;
b(*NowKeyTab、CurrentOperate)
O:
//显示当前菜单b}else
escflag=
TRUE;
//退出编程状态
break;
bcaseKEY_OK:
if(NowKeyTab>
PressOk!
=MENU_NO)b{bMenuID=
NowKeyTab>
PressOk;
NowKeyTab=KeyTab^[MenuID];
MenuNextID=bNowKeyTab、PressOk;
^}
(*NowKeyTab、CurrentOperate)
();
〃执行当前按键得操作bb「eak;
bcaseKEY_UP:
if((MenuNext
ID!
=MENU_NO)&
&
(KeyTab[MenuNextID].PressUp!
=MENU_NO)){bNowKeyTab、Pr
essOk=JiKeyTabfMenuNextID].PressUp:
MenuNextID=KeyTabb[MenuNextlD]、PressUp;
b
(*NowKeyTab>
CurrentOperate)();
〃执行当前按键得操作b}
break;
bcaseKEY_DOWN:
if((MenuNextlD!
=MENU_NO)&
(KeyTab[MenuNextID]、PressDown!
=MENU一NO))owKeyTab、PressOk=^KeyTab[MenuNextID]、PressDown;
bMenuNextID=KeyTab
[MenuNextID].PressDown;
(水NowKeyTab、Current0perate)();
〃执行当前按键得操作b}
bcaseKEY_RESET:
ResetFlag=TRUE;
break;
defau1t:
break:
}while(!
ResetF1ag&
!
EscFla吕&
escfIag);
bif(ChangeF1ag&
EscFlag&
ResetFleg)bEditDataChange();
if(ResetFIag)breturnSYS_RESET:
belse{
return0;
b}b}
b关于这个菜单得说明:
1、我用得就是ARM处理器,所以5i得时候把const改成code,uint32改成unsignedcharo
2、在网上得资料中,结构体数组就是存在RAM中得,我把它放在也f1ash中了,然后再定义一个
结构体变量,就样就可以省很多RAM,比较适合51、b3、在网上资料中,因为保存了原来得选择,当您离开编程状态重新进行后,会发现选择上会
就是原来进行得顺序,我改动之后,退出上一级菜单还就是您选得那一项,但重新进入后就就是第
一个指定项・4b、增加UP与DOWN显示,可以反显最新选定得选项,正常显示原来得选项。