单片机多级菜单编程实现.docx

上传人:b****2 文档编号:1441592 上传时间:2023-05-01 格式:DOCX 页数:9 大小:19.76KB
下载 相关 举报
单片机多级菜单编程实现.docx_第1页
第1页 / 共9页
单片机多级菜单编程实现.docx_第2页
第2页 / 共9页
单片机多级菜单编程实现.docx_第3页
第3页 / 共9页
单片机多级菜单编程实现.docx_第4页
第4页 / 共9页
单片机多级菜单编程实现.docx_第5页
第5页 / 共9页
单片机多级菜单编程实现.docx_第6页
第6页 / 共9页
单片机多级菜单编程实现.docx_第7页
第7页 / 共9页
单片机多级菜单编程实现.docx_第8页
第8页 / 共9页
单片机多级菜单编程实现.docx_第9页
第9页 / 共9页
亲,该文档总共9页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

单片机多级菜单编程实现.docx

《单片机多级菜单编程实现.docx》由会员分享,可在线阅读,更多相关《单片机多级菜单编程实现.docx(9页珍藏版)》请在冰点文库上搜索。

单片机多级菜单编程实现.docx

单片机多级菜单编程实现

单片机多级菜单编程实现单片机多级菜单编程实现(ZT)建立一个树状得菜单结构,用链表实现

链表中包含:

bl、指向同级左右菜单与指向父菜单、子菜单得四个菜单结构体指针;

2、进入该菜单时需要执行得初始化函数指针3b、退出该菜单时需要执行得结束函数指针

4、该菜单内得按键处理函数指针数组得指针操作菜单模块需要得按键操作有:

左、右、确

认、退出・b采用这种办法,可以方便得添加或删减菜单•并且只需要在其头文件中修改初始变量就可b以实现,完全无须修改C文件中得任何函数.

具体结构定义b我得定义,做个参考:

#defineMENU_HLP_EN//菜单帮助信息使能

typedefstruetb{

void(^pMenuTasklnit)(Void):

〃指向菜单任务初始化函数得指针

void(^pMenuTaskEnd)(void):

〃指向菜单任务结束函数得指针

}MENU_TASK_TYP;

typedefstructMenuTypb{bINT8U*MenuName;//菜单名称字

符串bWORK_MODWorkMod:

//工作状态编号

MENU_TASK_TYP*pMenuTask;//指向菜单任务得指针

void(**pTaskKeyDeal)(void);//指向菜单任务按键处理函数数组得指针

#ifdefMENUHLP_ENbINT8U次MenuHlp;〃菜单帮助字符串

#endif

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'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'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

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:

i

[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)&&b

(KeyTab[MenuNextID]、PressDown!

=MENU一NO))owKeyTab、PressOk=^KeyTab[MenuNextID]、PressDown;bMenuNextID=KeyTab

[MenuNextID].PressDown;

(水NowKeyTab、Current0perate)();〃执行当前按键得操作b}

break;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显示,可以反显最新选定得选项,正常显示原来得选项。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2