|
楼主 |
发表于 2008-8-22 19:05:54
|
显示全部楼层
在我的按键菜单里是每次按下时,将一个全局变量清0,在给定的时间内没有按键在次按下时,退出按键程序。但是一直没有做出一个好的多级菜单出来。看了傻孩子大侠的示例后,觉得算法很好,但是里面设置完数据后,如何退出。还有菜单操作部分全部是死循环:即死等按键直到退出菜单。这个部分一直没有想出好的算法,不知道有没有哪位大侠能指导一下。谢谢!在网上看到下面的示例觉得也没有想的很全。也存在这个问题。
void GetKeyInput(void)
{
void (*KeyFuncPtr)(); //按键功能指针
}
unsigned char KeyValue;
typedef struct
{
unsigned char state; //当前索引号
unsigned char keydn; //同一级菜单下移索引号
unsigned char keyon; //同一级菜单上移索引号
unsigned char keynext; //下一级菜单索引号
unsigned char keyback; //上一级菜单索引号
void (*pFun)();
}_Fun_Test;
_Fun_Test code KeyTab [23]=
{
{0,1,5,6,0,lcdm},
{1,2,0,10,1,lcdm2},
{2,3,1,11,2,lcdm3},
{3,4,2,12,3,lcdm4},
{4,5,3,13,4,lcdm5},
{5,0,4,14,5,lcdm6},
{6,7,20,21,0,lcdse1},
{7,15,6,22,0,lcdse2},
{8,8,8,8,6,lcdth1},
{9,9,9,9,6,lcdth2},
{10,10,10,10,1,lcdsetemp},
{11,11,11,11,2,lcdsetemp},
{12,12,12,12,3,lcdsetemp},
{13,13,13,13,4,lcdsetemp},
{14,14,14,14,5,lcdsetemp},
{15,16,7,8,0,lcdse3},
{16,17,15,9,0,lcdse4},
{17,18,16,17,0,lcdse5},
{18,19,17,18,0,lcdse6},
{19,20,18,19,0,lcdse7},
{20,6,19,20,0,lcdse8},
{21,21,21,21,6,simulation},
{22,22,22,22,7,onoff}
};
//LEDRUN = 0;
KeyValue = P2 & 0XFF; //
DelayMs(20*3);
lightflashon(); //工作标志灯
switch(KeyValue)
{
case LCDKEY1: //回车键,找出新的菜单状态编号
{
KeyFuncIndex=KeyTab[KeyFuncIndex].keynext;
sound = 1;
DelayMs(5*3);
sound = 0;
delchar(); //del all char
delzipic(); //del haizi and picture
break;
}
case LCDKEY2: //向上键,找出新的菜单状态编号
{
KeyFuncIndex=KeyTab[KeyFuncIndex].keyon;
sound = 1;
DelayMs(5*3);
sound = 0;
break;
}
case LCDKEY3: //向下键,找出新的菜单状态编号
{
KeyFuncIndex=KeyTab[KeyFuncIndex].keydn;
sound = 1;
DelayMs(5*3);
sound = 0;
break;
}
case LCDKEY4: //返回键,找出新的菜单状态编号
{
KeyFuncIndex=KeyTab[KeyFuncIndex].keyback;
sound = 1;
DelayMs(5*3);
sound = 0;
delchar(); //del all char
delzipic(); //del haizi and picture
break;
}
default: //按键错误的处理
break;
}
KeyFuncPtr=KeyTab[KeyFuncIndex].pFun;
(*KeyFuncPtr)(); //执行当前按键的操作
lightflashoff(); //工作标志灯
//LEDRUN = 1;
} |
|