/**********************
* 目录结构体定义 *
**********************/
typedef struct datas
{
unsigned char MenuCount; //当前层节点数
unsigned int str[8]; //菜单标题
void (*Subs)(void); //节点函数
struct datas const *ChildrenMenus; //子节点
struct datas const *ParentMenus; //父节点
}MenuItem;
MenuItem const MainMenu[]=
{
{4, {'时','间','设','置'},Main_son, TimsMenu, Null},
{4, {'参','数','设','置'},Main_son, DatfMenu, Null},
{4, {'系','数','标','定'},Main_son, DatdMenu, Null},
{4, {'退','出','设','置'},Exit_son, Null, Null},
};
void NullSubs(void)
{
}
int main()
{
short KeyNum = 0xff;
SystemInitialation(); //系统初始化
ShowMenu();
while(1)
{
ClearWatchDog(); //喂狗
KeyNum = GetKeyNum(); //获取按键值
/*******************目录操作*********************/
/***************************************
* [按键说明] *
* ----------------------------------- *
* [K1] UP(向上) *
* [K5] Down(向下) *
* [K2] Esc(后退) *
* [K6] Enter(确定) *
* [K3] 返回根目录 *
***************************************/
if (KeyNum != 0xff)
{
ShowMenu();
switch(KeyNum)
{
case UP:
UserChoose --;
if (UserChoose < 0)
{
UserChoose = MaxItems-1;
}
break;
case Esc:
if (MenuPoint[0].ParentMenus != &Null)
{
MenuPoint = MenuPoint[0].ParentMenus;
UserChoose = 0;
DisplayStart = 0;
}
break;
case Down:
UserChoose ++;
if (UserChoose == MaxItems)
{
UserChoose = 0;
}
break;
case Enter:
if (MenuPoint[UserChoose].Subs != NullSubs)
{
(*MenuPoint[UserChoose].Subs)();
}
else if (MenuPoint[UserChoose].ChildrenMenus != &Null)
{
MenuPoint = MenuPoint[UserChoose].ChildrenMenus;
UserChoose = 0;
DisplayStart = 0;
}
break;
case Reset:
MenuPoint = MainMenu;
UserChoose = 0;
DisplayStart = 0;
break;
}
if ((UserChoose < DisplayStart) || (UserChoose > (DisplayStart+3)))
{
DisplayStart = UserChoose;
}
CLS
ShowMenu();
}
/*******************目录操作*********************/
}
}
请教傻孩子大侠,当进入void (*Subs)();函数后,如在里面设置完数据后,如何退出.还有菜单操作部分全部是死循环:即死等按键直到退出菜单。
也就是说,进入菜单操作过程时,主程序中的其它程序就无法执行了.如何才能避免.大侠能不能发表一个最简单的示例.谢谢!