#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])();// 指针函数调用
}
}