各位大佬:
在写一个程序的时候,参考网上找的多级菜单程序,自己修改了一下,第一次执行菜单的时候狠成功,但是第二次执行的时候就会出现跑偏的现象,求助如何解决。以下为源码。
我有尝试过把初始化菜单定义一个新的函数里面,只执行一次也不行,也尝试过把MenuPoint定义成全局变量也不行。
运行环境为keil MDK5.18a
多谢。
struct MenuItem
{
short MenuCount; //当前菜单项目总数
void (*Subs) (); //选择某一菜单后执行的功能函数
struct MenuItem *ChildrenMenus; //当前项目的子菜单
struct MenuItem *ParentMenus; //当前项目的父菜单
};
struct MenuItem wifi_M_Menu[2] =
{
{2, NULL, NULL, NULL},
{2, NULL, NULL, NULL},
};
struct MenuItem wifi_SUBA_Menu[3] =
{
{3, NULL, NULL, wifi_M_Menu},
{3, NULL, NULL, wifi_M_Menu},
{3, NULL, NULL, wifi_M_Menu},
};
struct MenuItem wifi_SUBB_Menu[3] =
{
{3, NULL, NULL, wifi_M_Menu},
{3, NULL, NULL, wifi_M_Menu},
{3, NULL, NULL, wifi_M_Menu},
};
struct MenuItem wifi_SUBA1_Menu[1] =
{
{1, heart_beat, NULL, wifi_SUBA_Menu},
};
struct MenuItem wifi_SUBA2_Menu[1] =
{
{1, L_state, NULL, wifi_SUBA_Menu},
};
struct MenuItem wifi_SUBA3_Menu[11] =
{
{11, R_M_NO, NULL, wifi_SUBA_Menu},
{11, R_R_NO, NULL, wifi_SUBA_Menu},
{11, R_W_IP, NULL, wifi_SUBA_Menu},
{11, R_S_IP, NULL, wifi_SUBA_Menu},
{11, R_S_Port, NULL, wifi_SUBA_Menu},
{11, R_F_State, NULL, wifi_SUBA_Menu},
{11, R_W_State, NULL, wifi_SUBA_Menu},
{11, R_S_State, NULL, wifi_SUBA_Menu},
{11, R_P_State, NULL, wifi_SUBA_Menu},
{11, R_SoftVer, NULL, wifi_SUBA_Menu},
{11, R_HardVer, NULL, wifi_SUBA_Menu},
};
struct MenuItem wifi_SUBB1_Menu[1] =
{
{1, CMDERR, NULL, wifi_SUBB_Menu},
};
struct MenuItem wifi_SUBB2_Menu[4] =
{
{4, L_RUN, NULL, wifi_SUBB_Menu},
{4, L_STOP, NULL, wifi_SUBB_Menu},
{4, L_EMG, NULL, wifi_SUBB_Menu},
{4, L_Weigh, NULL, wifi_SUBB_Menu},
};
struct MenuItem wifi_SUBB3_Menu[9] =
{
{9, S_M_NO, NULL, wifi_SUBB_Menu},
{9, S_R_NO, NULL, wifi_SUBB_Menu},
{9, S_W_IP, NULL, wifi_SUBB_Menu},
{9, S_S_IP, NULL, wifi_SUBB_Menu},
{9, S_S_Port, NULL, wifi_SUBB_Menu},
{9, S_F_State, NULL, wifi_SUBB_Menu},
{9, S_W_State, NULL, wifi_SUBB_Menu},
{9, S_S_State, NULL, wifi_SUBB_Menu},
{9, S_P_State, NULL, wifi_SUBB_Menu},
};
void ESP07_process(void)
{
struct MenuItem *MenuPoint; //当前菜单的地址
u8 selectItem = 0;
wifi_M_Menu[0].ChildrenMenus = wifi_SUBA_Menu;
wifi_M_Menu[1].ChildrenMenus = wifi_SUBB_Menu;
wifi_SUBA_Menu[0].ChildrenMenus = wifi_SUBA1_Menu;
wifi_SUBA_Menu[1].ChildrenMenus = wifi_SUBA2_Menu;
wifi_SUBA_Menu[2].ChildrenMenus = wifi_SUBA3_Menu;
wifi_SUBB_Menu[0].ChildrenMenus = wifi_SUBB1_Menu;
wifi_SUBB_Menu[1].ChildrenMenus = wifi_SUBB2_Menu;
wifi_SUBB_Menu[2].ChildrenMenus = wifi_SUBB3_Menu;
MenuPoint=wifi_M_Menu;
selectItem = RX_DATA[2];
if (MenuPoint[selectItem].ChildrenMenus != NULL)
{
MenuPoint = MenuPoint[selectItem].ChildrenMenus;
}
else if (MenuPoint[selectItem].Subs != NULL)
{
MenuPoint[selectItem].Subs();
}
selectItem = RX_DATA[3];
if (MenuPoint[selectItem].ChildrenMenus != NULL)
{
MenuPoint = MenuPoint[selectItem].ChildrenMenus;
}
else if (MenuPoint[selectItem].Subs != NULL)
{
MenuPoint[selectItem].Subs();
}
selectItem = RX_DATA[4];
if (MenuPoint[selectItem].ChildrenMenus != NULL)
{
MenuPoint = MenuPoint[selectItem].ChildrenMenus;
}
else if (MenuPoint[selectItem].Subs != NULL)
{
MenuPoint[selectItem].Subs();
}
return;
}
|