C语言二级菜单无法退出,请教傻孩子大侠多级菜单的问题.

/**********************

*    目录结构体定义   *

**********************/

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)();函数后,如在里面设置完数据后,如何退出.还有菜单操作部分全部是死循环:即死等按键直到退出菜单。

也就是说,进入菜单操作过程时,主程序中的其它程序就无法执行了.如何才能避免.大侠能不能发表一个最简单的示例.谢谢!

#include "menu.h" //菜单资源头文件 #include "menu_res.h" //外部显示库函数 #include "lcm.h" /* 名称:C语言两级菜单(对于大内存可扩展N级菜单)V1.0 作者:中国传惠 Transmart gongxd@126.com 单位:山东科技大学 时间:2009-3-4 编译环境: IDE-Version: uVision3 V3.33 Copyright (c) Keil Elektronik GmbH / Keil Software, Inc 2006 License Information: gongxd 微软用户 微软中国 LIC=BU373-A1HZU-EZJW0-DRWR6-C682M-E9HMS Tool Version Numbers: 工具链路径:C:\Keil\C51\BIN\ C Compiler: C51.Exe V8.05a Assembler: A51.Exe Linker/Locator: BL51.Exe V6.00 Librarian: LIB51.Exe V4.24 Hex Converter: OH51.Exe V2.6 CPU DLL: S8051.DLL V3.06 Dialog DLL: DP51.DLL V2.48b Target DLL: C:\KEIL\VW_C.DLL Dialog DLL: TP51.DLL V2.48b 使用说明: 1.向"menu_res.h"中添加菜单列表 2.向 "Menu_Function.h"中添加菜单响应函数声明 3.在"lcm.h"中替换自己的外部显示库函数,可以用类似的宏定义#define DisplayFunction(int,int) MyDisplayFunction(int,int) 其中"lcm.h"的X,Y坐标起始定义为0,0 (0,0)X------> Y | | \|/ */ #include "Menu_Function.h" //菜单条目格式 //{要显示的的菜单文本,子菜单号,功能函数地址) MenuItemStruct code MenuMain[]={ {"主1 条目1",1,Null}, {"主1 条目2",2,Null}, {"主1 条目3",3,Null}, {"功能函数1",MenuHasFunction,MenuFuntion1}, {"主1 条目5",0,Null}, }; MenuItemStruct code MenuSub1[]={ {"次1 条目1",0,Null}, {"次1 条目2",0,Null}, {"功能函数2",MenuHasFunction,MenuFuntion2}, {"次1 条目4",0,Null}, {"次1 条目5",0,Null}, {"次1 条目6",0,Null}, }; MenuItemStruct code MenuSub2[]={ {"次2 条目1",0,Null}, {"次2 条目2",0,Null}, {"次2 条目3",0,Null}, }; MenuItemStruct code MenuSub3[]={ {"次3 条目1",0,Null}, {"次3 条目2",0,Null}, {"次3 条目3",0,Null}, {"次3 条目4",0,Null}, {"次3 条目5",0,Null}, {"次3 条目6",0,Null}, {"次3 条目7",0,Null}, {"次3 条目8",0,Null}, {"次3 条目9",0,Null}, }; //菜单板列表 MenuPanelStruct code MenuPanel[]={ {MenuPanelID(MenuMain)}, {MenuPanelID(MenuSub1)}, {MenuPanelID(MenuSub2)}, {MenuPanelID(MenuSub3)}, };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值