请教各位大虾:根据网上流行比较广泛的单片机菜单的设计,感觉菜单之间互相切换确实比较方便。但是如果调整参数,我怎么感觉不方便呢,譬如说我有一个时间调整的函数void D3_SetYear(void) 时,需要通过向上或向下键调整年,显示年月日的代码没问题,但是按键的处理这块我怎么也想不出来怎么做。若在D3_SetYear()函数里面执行的话,因向上、向下键已经在KbdTabStruct code KeyTab中定义了状态索引号了,所以必须使用 do{}while语句,那么这样的话就必须在D3_SetYear()函数中通过按OK键或Menu键退出,这感觉又不方便;而如果不在D3_SetYear()里面执行向上、向下键处理的话,程序直接跳到另外一个状态索引的菜单显示去了。各位大虾有啥好办法呢? void D3_SetYear(void) { 年月日显示代码;
} 以下是网上拷贝的菜单设计的源程序 ———————————————————— #define SIZE_OF_KEYBD_MENU 20 //菜单长度 uchar KeyFuncIndex=0; //uchar KeyFuncIndexNew=0;
void (*KeyFuncPtr)(); //按键功能指针
typedef struct { uchar KeyStateIndex; //当前状态索引号 uchar KeyDnState; //按下"向下"键时转向的状态索引号 uchar KeyUpState; //按下"向上"键时转向的状态索引号 uchar KeyCrState; //按下"回车"键时转向的状态索引号 void (*CurrentOperate)(); //当前状态应该执行的功能操作 } KbdTabStruct;
KbdTabStruct code KeyTab[SIZE_OF_KEYBD_MENU]= { { 0, 0, 0, 1,(*DummyJob)},//顶层 { 1, 2, 0, 3,(*DspUserInfo)},//第二层 { 2, 1, 1, 9,(*DspServiceInfo)}, //第二层 { 3, 0, 0, 1,(*DspVoltInfo)},//第三层>>DspUserInfo的展开 { 4, 0, 0, 1,(*DspCurrInfo)},//第三层>>DspUserInfo的展开 { 5, 0, 0, 1,(*DspFreqInfo)},//第三层>>DspUserInfo的展开 { 6, 0, 0, 1,(*DspCableInfo)},//第三层>>DspUserInfo的展开 ........... { 9, 0, 0, 1,(*DspSetVoltLevel)}//第三层>>DspServiceInfo的展 开 .......... };
void GetKeyInput(void) { uchar KeyValue; KeyValue=P1&0x07; //去掉高5bit delay(50000); switch(KeyValue) { case 1: //回车键,找出新的菜单状态编号 { KeyFuncIndex=KeyTab[KeyFuncIndex].KeyCrState; break; } case 2: //向上键,找出新的菜单状态编号 { KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState; break; } case 4: //向下键,找出新的菜单状态编号 { KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDnState; break; } default: //按键错误的处理 ...... break; } KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate; (*KeyFuncPtr)();//执行当前按键的操作 } //其中KeyTab的设计颇费尽心机 (
|