MENU_NO,MENU_PRINT_DATA,MENU_PRINT_SET,
MENU_PRINT_DATA_TROUBLE,*MenuPrintDataIn},
{MENU_PRINT_SET,4,MENU_NO,
MENU_NO,MENU_PRINT_DATA,MENU_PRINT_DATA_FIRE,
MENU_PRINTER_CHECK,*MenuPrintSet},
};
const struct MenuDispDataMenuEditShow[][MENU_MAX] = {
{{MENU_NO, 0, 0, "选择:消音→退出"},//主菜单
{MENU_DATA_VIEW, 1, 6, "⒈数据查看"},
{MENU_SYS_EDIT, 2, 6, "⒉系统编程"},
{MENU_PRINT_DATA, 3, 6, "⒊数据打印"}},
{{MENU_NO, 0, 0, "数据查看:消音→退出"},//数据查
看
{MENU_DATA_VIEW_FIRE, 1, 4, "⒈火警"},
{MENU_DATA_VIEW_TROUBLE, 2, 4, "⒉故障"},
{MENU_DATA_VIEW_REPEAT , 3, 4, "⒊重码"},
{MENU_FACE_CHECK, 1,12, "⒋面板检测"},
{MENU_STEP_FOLLOW, 2,12, "⒌单步跟踪"}},
{{MENU_NO, 0, 0, "系统编程:消音→退出"},//系统编程
{MENU_SUM_SET, 1, 0, "⒈容量设置"},
{MENU_EDIT_INSULATE, 2, 0, "⒉隔离点"},
{MENU_EDIT_HZ, 3, 0, "⒊汉字描述"},
{MENU_LD_CONTROL, 1,12, "⒋联动控制"},
{MENU_LD_DELAY, 2,12, "⒌模块延时"},
{MENU_TIME_SET, 3,12, "⒍时钟调整"}},
{{MENU_NO, 0, 0, "数据打印:消音→退出"},//数据打印
{MENU_PRINT_DATA_FIRE, 1, 0, "⒈火警数据"},
{MENU_PRINT_DATA_TROUBLE,2, 0, "⒉故障数据"},
{MENU_PRINTER_CHECK, 3, 0, "⒊打印机自检"},
{MENU_PRINT_SET, 1,12, "⒋打印设置"}},
};
void WaitKey(void)
{
uint32 time;
time = RTCFlag;
WhichKey = KEY_NONE;
while(!EscFlag){
if(RTCFlag - time >= EDIT_TIME)
EscFlag = TRUE;
if(WhichKey != KEY_NONE){
KeySound(300);//按键音
return;
}
}
}
void MenuEdit()
{
uint32 i,j=0;
uint32 oldid;
j = KeyTab[MenuID].ShowLevel;
if(WhichKey == KEY_ESC || WhichKey == KEY_OK){
ClearScreen();
for(i=0;i
ShowString(MenuEditShow[j][i].Lin,MenuEditShow[j]
[i].Column,MenuEditShow[j][i].Pdata,0);//初始化显示
oldid =
0;
//没有原先选择的项
}else{
if(WhichKey == KEY_UP)
oldid = KeyTab[MenuNextID].PressDown;
else
oldid = KeyTab
[MenuNextID].PressUp;
//指示原先的项
}
for(i=1;i
if(MenuEditShow[j][i].Id == oldid)
ShowString(MenuEditShow[j][i].Lin,MenuEditShow[j]
[i].Column,MenuEditShow[j][i].Pdata,0);//正常显示原先的项
else{
if(MenuEditShow[j][i].Id == MenuNextID)
ShowString(MenuEditShow[j][i].Lin,MenuEditShow
[j][i].Column,MenuEditShow[j][i].Pdata,1);//反显当前选择的项
}
}
WhichKey = KEY_NONE;
}
uint32 Edit(void)
{
struct KeyTabStruct NowKeyTab;//指示当前的菜单值
uint32 escflag = FALSE;
ResetFlag = FALSE;
ChangeFlag = FALSE;
EscFlag = FALSE;
MenuID = MENU_EDIT;
NowKeyTab = KeyTab[MenuID];
MenuNextID = NowKeyTab.PressOk;
(*NowKeyTab.CurrentOperate)();//显示主菜单
do{
if(WhichKey == KEY_NONE)
WaitKey();//等待按键
switch(WhichKey){
case KEY_ESC : if(NowKeyTab.PressEsc != MENU_NO)
{
MenuID =
NowKeyTab.PressEsc;
MenuNextID =
NowKeyTab.MenuIndex;
NowKeyTab = KeyTab
[MenuID];
NowKeyTab.PressOk =
MenuNextID;
(*NowKeyTab.CurrentOperate)
();//显示当前菜单
}else
escflag =
TRUE;//退出编程状态
break;
case KEY_OK:if(NowKeyTab.PressOk != MENU_NO)
{
MenuID =
NowKeyTab.PressOk;
NowKeyTab = KeyTab
[MenuID];
MenuNextID =
NowKeyTab.PressOk;
}
(*NowKeyTab.CurrentOperate)
();//执行当前按键的操作
break;
case KEY_UP:if((MenuNextID != MENU_NO) &&
(KeyTab[MenuNextID].PressUp != MENU_NO)){
NowKeyTab.PressOk =
KeyTab[MenuNextID].PressUp;
MenuNextID = KeyTab
[MenuNextID].PressUp;
(*NowKeyTab.CurrentOperate)();//执行当前按键的操作
}
break;
case KEY_DOWN:if((MenuNextID != MENU_NO) &&
(KeyTab[MenuNextID].PressDown != MENU_NO)){
NowKeyTab.PressOk =
KeyTab[MenuNextID].PressDown;
MenuNextID = KeyTab
[MenuNextID].PressDown;
(*NowKeyTab.CurrentOperate)();//执行当前按键的操作
}
break;
case KEY_RESET: ResetFlag = TRUE;
break;
default: break;
}
}while(!ResetFlag && !EscFlag && !escflag);
if(ChangeFlag && !EscFlag && !ResetFlag)
EditDataChange();
if(ResetFlag)
returnSYS_RESET;
else{
return0;
}
}
关于这个菜单的说明:
1.我用的是ARM处理器,所以51的时候把const改成code,uint32改成unsigned char。
2.在网上的资料中,结构体数组是存在RAM中的,我