指针函数的范例
2013-03-25
标签:



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



可能会用到的工具/仪表
相关文章
推荐文章
热门文章
章节目录
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号