首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

关于指针函数的一个范例,供参考(ZT 作者:晓奇)

关于指针函数的一个范例,供参考(ZT 作者:晓奇)

#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 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};       // 总指针表

[此贴子已经被作者于2005-12-28 11:42:37编辑过]

// 指针函数列表
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 && *pTab != 0)    // 按照按键代码查表
   {
        pTab += 3;                          // 查表
   }
   if(*pTab!=0){
      pTab++;
      kbStatus=*pTab;                       // 取状态特征字节
      pTab++;                               // 指向执行函数
      (*KeyProcTab[*pTab])();               // 指针函数调用
   }
}

[此贴子已经被作者于2005-12-28 11:43:48编辑过]

返回列表