在网上找了一个例子,
这是对结构体的定义部分
#define MENU_SIZE 25 //菜单长度 volatile unsigned char KeyFuncIndex=0; //存放当前的菜单索引 void (*KeyFuncPtr)(); //定义按键功能指针 //定义类型 typedef struct { unsigned char KeyStateIndex; //当前的状态索引号 unsigned char KeyUpState; //按下向左键时的状态索引号 unsigned char KeyDownState; //按下向右键时的状态索引号 unsigned char KeyLiftState; //按下向左键时的状态索引号 unsigned char KeyRightState; //按下向右键时的状态索引号 unsigned char KeyEscState; //按下返回键时的状态索引号 unsigned char KeyEnterState; //按下确定键时的状态索引号 void (*CurrentOperate)(); //当前状态应该执行的功能操作 } StateTab;
根据按键操作执行相应的菜单操作,并控制按键计数 用于调节时间,KeyFuncIndex=20的时候调节时间 KeyFuncIndex=20的时候调节日期与星期, 并调用函数Timer_Convt
void MenuOperate(void) { if(key_value==ENTER) {KeyFuncIndex=KeyTab[KeyFuncIndex].KeyEnterState;} if(key_value==ESC) {KeyFuncIndex=KeyTab[KeyFuncIndex].KeyEscState;} if(key_value==LEFT) { KeyFuncIndex=KeyTab[KeyFuncIndex].KeyLiftState; if(KeyFuncIndex==20) ++hour; if(KeyFuncIndex==19) ++year; } if(key_value==RIGHT) { KeyFuncIndex=KeyTab[KeyFuncIndex].KeyRightState; if(KeyFuncIndex==20) ++second; if(KeyFuncIndex==19) ++day; } if(key_value==UP) {KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState;} if(key_value==DOWN) { KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDownState; if(KeyFuncIndex==19) ++week; } if(key_value==SURE) { KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDownState; if(KeyFuncIndex==20) ++minute; if(KeyFuncIndex==19) ++month; } Timer_Convt(); //下面是执行按键的操作 KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate; (*KeyFuncPtr)(); //执行当前的按键操作 }
这部分红色有些不太明白