|
发表于 2010-3-18 12:22:12
|
显示全部楼层
我的是基本上和《一个占用内存极小的菜单的实现》是一样的
不过是改了下菜单结构
他的原来每级菜单要占用35字节
而我的则为11字节
如下:
typedef struct
{
uchar MenuIndex; //当前状态索引 1字节
void (*InitOperate)(void);//菜单初始化操作 2字节
void (*KeyUpOperate)(void); //按Up键时 操作函数 2字节
void (*KeyDnOperate)(void); //按Dn键时 操作函数 2字节
void (*KeyEscOperate)(void);//按BackSpace键时 的操作函数 2字节
void (*KeyEtrOperate)(void);//按Enter键时转向的 操作函数 //2字节
}MenuStruct;
const MenuFSM[] PROGMEM ={
#ifdef MenuSleep
#define MenuSleepIndex 0
{\
MenuSleepIndex,(*MenuSleepInit),(*MenuSleepUp),\
(*MenuSleepDn),(*MenuSleepEsc),(*MenuSleepEtr)\
},
#endif
#ifdef MenuTop
#define MenuTopIndex 1
{ \
MenuTopIndex,(*MenuTopInit),(*MenuTopUp), \
(*MenuTopDn),(*MenuTopEsc),(*MenuTopEtr)\
},
#endif
……
}
void JumpToMenu(uchar Index,uchar FlashMode) //跳转到菜单
{
KeyFuncIndex = Index; //jump to Menu index 适用于MenuIndex 有序排列
PgmFun(KeyTab[KeyFuncIndex].InitOperate); //运行初始化函数
if(FlashMode){
GUI_Flash = FlashMode;
}
}
main()
{
……
switch(KEY){
case UP:
PgmFun(KeyTab[KeyFuncIndex].KeyUpOperate);
break;
case DN:
PgmFun(KeyTab[KeyFuncIndex].KeyDnOperate);
break;
case ESC:
PgmFun(KeyTab[KeyFuncIndex].KeyEscOperate);
break;
case ETR:
PgmFun(KeyTab[KeyFuncIndex].KeyEtrOperate);
break;
default:
break;
}
……
}
----------------------下面是个MenuTop的Demo----------
void MenuTopInit(void)
{
pMenu=memcpy_P(pMenu,&MenuTop[Language],sizeof(Menu));
Item=0;
Where=0;
WDT_OFF();
BackLight_ON(); //如果有按键 背光 亮
AvrXSuspend(&task2Pid);
AvrXResume(&task4Pid);
}
void MenuTopUp(void) //Up键
{
myKeyUp();
}
void MenuTopDn(void) //Dn键
{
myKeyDn();
}
void MenuTopEsc(void) //退出
{
wdt_enable(WDTO_1S);
wdt_reset();
BackLight_OFF(); //背光 关
MENU_POP();
}
void MenuTopEtr(void) //Enter键
{
MENU_PUSH(); //备份菜单
switch(Item+Where)
{
case 0x00:
JumpToMenu(MenuViewIndex,0x01);
break;
case 0x01:
JumpToMenu(MenuSetsIndex,0x01);
break;
case 0x02:
case 0x03:
JumpToMenu(MenuPwdIndex,0x00);
break;
default:
break;
}
} |
|