#define ubyte unsigned char #define uint unsigned int #define ulong unsigned long ubyte kbCode;// 按键编码纪录 ubyte kbStatus;// 键盘当前状态,可以理解为菜单层次 // 按键的四种不同工作状态对应的函数指针对照表,每三字节对应一个按键 // 每一项包含三个字节,分别代表按键码,键盘状态,对应处理程序编号 // 本表对应于日常操作,不是修改状态 ubyte code TAB0[46] = { 0x11, 0x00, 0x01, // 按键'1'func1 0x12, 0x00, 0x01, // 按键'2'func1 0x14, 0x00, 0x01, // 按键'3'func1 0x1a, 0x00, 0x01, // 按键'4'func1 0x2a, 0x00, 0x01, // 按键'5'func1 0x4a, 0x00, 0x01, // 按键'6'func1 0x01, 0x00, 0x01, // 按键'7'func1 0x02, 0x00, 0x01, // 按键'8'func1 0x04, 0x00, 0x01, // 按键'9'func1 0x10, 0x00, 0x01, // 按键'0'func1 0x20, 0x00, 0x01, // 按键'.'func1 0x08, 0x00, 0x02, // 按键'Clear'func2 0x18, 0x00, 0x03, // 按键'U/D'func3 0x8a, 0x01, 0x04, // 按键'shift'func4 0x40, 0x02, 0x05, // 按键'last'func5 0x00 };// 本表结束标志 ubyte code TAB1[40] = { 0x12, 0x03, 0x06, // 按键'2'func6 0x14, 0x03, 0x07, // 按键'3'func7 0x2a, 0x03, 0x08, // 按键'5'func8 0x4a, 0x03, 0x09, // 按键'6'func9 0x01, 0x03, 0x12, // 按键'7'func18 0x8a, 0x03, 0x14, // 按键'shift'func20 0x11, 0x01, 0x0a, // 按键'1'func10 0x1a, 0x01, 0x0b, // 按键'4'func11 0x04, 0x01, 0x0c, // 按键'9'func12 0x10, 0x01, 0x0d, // 按键'0'func13 0x80, 0x01, 0x0e, // 按键'Enter'func14 0x08, 0x00, 0x02, // 按键'Clear'func2 0x20, 0x03, 0x13, // 按键'.'func19 0x00 };// 本表结束标志 ubyte code TAB2[7] = { 0x40, 0x02, 0x0f, // 按键'last'func15 0x08, 0x00, 0x02, // 按键'Clear'func2 0x00 };// 本表结束标志 ubyte code TAB3[40] = { 0x11, 0x03, 0x10, // 按键'1'func16 0x12, 0x03, 0x10, // 按键'2'func16 0x14, 0x03, 0x10, // 按键'3'func16 0x1a, 0x03, 0x10, // 按键'4'func16 0x2a, 0x03, 0x10, // 按键'5'func16 0x4a, 0x03, 0x10, // 按键'6'func16 0x01, 0x03, 0x10, // 按键'7'func16 0x02, 0x03, 0x10, // 按键'8'func16 0x04, 0x03, 0x10, // 按键'9'func16 0x10, 0x03, 0x10, // 按键'0'func16 0x20, 0x03, 0x10, // 按键'.'func16 0x08, 0x00, 0x02, // 按键'clear'func2 0x80, 0x01, 0x11, // 按键'Enter'func17 0x00 };// 本表结束标志 ubyte code *TAB[4] = {TAB0, TAB1, TAB2, TAB3}; // 总指针表 // 指针函数列表 code void(code *KeyProcTab[])() = { NoKey,/*0#(00H)#*/ func1,/*1#(01H)#*/ func2,/*2#(02H)#*/ func3,/*3#(03H)#*/ func4,/*4#(04H)#*/ func5,/*5#(05H)#*/ func6,/*6#(06H)#*/ func7,/*7#(07H)#*/ func8,/*8#(08H)#*/ func9,/*9#(09H)#*/ func10,/*10# (0AH)#*/ func11,/*11# (0BH)#*/ func12,/*12# (0CH)#*/ func13,/*13# (0DH)#*/ func14,/*14# (0EH)#*/ func15,/*15# (0FH)#*/ func16,/*16# (10H)#*/ func17,/*17# (11H)#*/ func18,/*18# (12H)#*/ func19,/*19# (13H)#*/ func20/*20# (14H)#*/ }; void NoKey() { return; } void func0() { ; } void func1() { ; } .................... void func20() { ; } ////////////////////////////////////////////////////////////////////// // 键盘监控,根据当前状态特征指向不同的指针表,并调用相应的函数// ////////////////////////////////////////////////////////////////////// void mon(ubyte key) { ubyte code *data pTab; kbCode = key; pTab = *(TAB + kbStatus); // 根据当前状态特征指向分指针表 while (*pTab != key & amp; & *pTab != 0) { // 按照按键代码查表 pTab += 3;// 查表 } if (*pTab != 0) { pTab++; kbStatus = *pTab; // 取状态特征字节 pTab++;// 指向执行函数 (*KeyProcTab[*pTab])();// 指针函数调用 } }