关于指针函数的范例

发布者:数字之舞最新更新时间:2015-01-20 来源: laogu关键字:指针函数 手机看文章 扫描二维码
随时随地手机看文章

关于指针函数的范例

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

关键字:指针函数 引用地址:关于指针函数的范例

上一篇:555时基电路原理以及应用
下一篇:怎样在我的源程序中实现软件复位?

推荐阅读最新更新时间:2024-03-16 13:51

C51中的函数指针
概述 函数指针是C编程语言众多难懂的特性之一。由于C编译器对关于8051架构的独特要求,函数指针和可重入函数需要克服更大的挑战。这主要是因为函数参数传递的方式。 通常,(对于大多数非8051的芯片),函数参数是在栈上以压入和弹出的汇编指令来完成。由于8051的栈大小有限(仅128字节,某些设备上更低至64字节),函数参数传递必须用不同的技术来传递。 英特尔为8051推出PL/ML-51编译器时,他们引入了将参数存储在固定内存位置的技术。当链接器被调用时,它会建立程序的调用树,找出哪些函数参数是相互独立的,然后覆盖它们。这就是链接器OVERLAY指令的开始。 由于PL/M-51不支持函数指针,所以从未出现间接函数调用的问
[单片机]
第53节:指针让一个函数可以封装多个参数
开场白: 当我们想把某种算法通过一个函数来实现的时候,如果不会指针,那么只有两种方法。 第1种:用不带参数返回的空函数。这是最原始的做法,也是我当年刚毕业就开始做项目的时候经常用的方法。它完全依靠全局变量作为函数的输入和输出口。我们要用到这个函数,就要把参与运算的变量直接赋给对应的输入全局变量,调用一次函数之后,再找到对应的输出变量,这些输出变量就是我们要的结果。这种方法的缺点是阅读不直观,封装性不强,没有面对用户的输入输出接口。 第2种:用return返回参数和带输入形参的函数,这种方法已经具备了完整的输入和输出性能,比第1种方法直观多了。但是这种方法有它的局限性,因为return只能返回一个变量,如果要用在返回多个输出结果的
[单片机]
STM32-使用函数指针时莫名复位问题原因
程序莫名复位,经检查是如下原因引起,访问了未知的空间! 这个1不应该加,改正后就没有复位了,所以在编程和测试中,一定要注意边界条件。
[单片机]
STM32-使用<font color='red'>函数</font><font color='red'>指针</font>时莫名复位问题原因
关于指针函数的范例
关于指针函数的范例 #define ubyte unsigned char #define uint unsigned int #define ulong unsigned long ubyte kbCode; // 按键编码纪录 ubyte kbStatus; // 键盘当前状态,可以理解为菜单层次 // 按键的四种不同工作状态对应的函数指针对照表,每三字节对应一个按键 // 每一项包含三个字节,分别代表按键码,键盘状态,对应处理程序编号 // 本表对应于日常操作,不是修改状态 ubyte code TAB0 ={ 0x11,0x00,0x01, // 按键'
[单片机]
C51里的函数指针
在C语言里面提供了函数指针,我认为它比较重要的功能就是用来提供接口,使得C语言可以模拟面向对象的语言为某些功能提供接口,实现功能代码的隔离。 这不,前些日子写了个小程序,用C51写的,其中有个功能就是操作液晶屏,在上面显示菜单、输出结果什么的。在我看来,这部分功能使用函数指针最好不过了。譬如,不管是什么菜单,总得要显示出来吧,定义一个show()接口就好。这样上层代码很简单,反正对每个菜单都调用其show()接口,它们自己完成显示。 嗯,可是想法是好的,结果是不妙的。首先这么做在C51的语法层面上没有任何问题,编译后没有任何错误。可是实际运行时就发现一些奇怪的现象,譬如调用某个函数,明明入口参数的值是100,跑到函数内部就
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved