|
楼主 |
发表于 2010-5-13 15:34:45
|
显示全部楼层
不好意思,发现LCD菜单生成代码中存在BUG,体现在以下一个方面,请自己修改下,软件的后续版本将修正。
结构定义:
struct MENUITEM {
unsigned char* Text;
MenuProc lpProc;
MenuItems Items; //这里少了一个*,应该是MenuItems* Items;
};
常量定义:
CONST mmi_0_0_Item[] = { //这里少了类型声明,应该是CONST MenuItem mmi_0_0_Items[] = {
{"FirstSub1", Func11, NULL},
};
////////////////////////////////////////////////////////////////////////////////////////
下面贴一个Keil的代码,可以通过编译的,占用RAM 14字节(含有8字节通用寄存器),ROM 234字节。
#include <REG52.H>
#define NULL 0 //我使用NULL是为了该方案同时适用于C和C++的,C中没有NULL,所以定义
#define CONST code
struct MENUITEM;
struct MENUITEMS;
typedef struct MENUITEM MenuItem;
typedef struct MENUITEMS MenuItems;
typedef void(*MenuProc)(void);
void Inc(){ //菜单函数声明
P1 ++;
}
struct MENUITEM {
unsigned char* Text;
MenuProc lpProc;
MenuItems* Items; //此处修正
};
struct MENUITEMS {
unsigned char Level, Count;
MenuItems* Parent;
MenuItem** Items;
};
struct CurMenuItem {
unsigned char Path[2]; //此处移植修改
MenuItems* Items;
} CurItem; //此处自己定义变量
//////////////////////////////////////
extern CONST MenuItems mmi_0;
extern CONST MenuItems mmi_0_0;
CONST MenuItem mmi_0_0_Item[] = { //此处修正
{"FirstSub1", NULL, NULL},
};
CONST MenuItem mmi_0_Item[] = { //此处修正
{"First", Inc, &mmi_0_0},
{"Second", NULL, NULL},
};
CONST MenuItems mmi_0 = {0, 2, NULL, &mmi_0_Item};
CONST MenuItems mmi_0_0 = {1, 1, &mmi_0, &mmi_0_0_Item};
void main(){
CurItem.Items = &mmi_0_0;
P0 = (unsigned char)CurItem.Items->Items[0]->lpProc; //复杂的调用关系
while(1);
} |
|