函数指针数组的一些用法

  首先函数指针数组是数组,其次数组里面存放的是函数指针,函数指针又是什么呢,函数指针是指向函数首地址的指针,

我个人认为函数指针数组可以批量像调用数组元素一样方便调用一些功能相似的一些函数(小弟愚见),我写这个博客之前就是遇到这个问题。

首先介绍一下我遇到问题背景,想做个mini3216时钟,显示时间是用8快8*8点阵,主控芯片用的STM32F103RCT6,(驱动方式比较特别,

分时复用)我先用宏定义的形式写了每个点的驱动。

#define A1B1      {{GPIOA->CRL=0X00000030;GPIOA->CRH=0X00000000;}\
                {GPIOB->CRL=0X00000000;GPIOB->CRH=0X00000030;}\
              {GPIOC->CRL=0X00000000;GPIOC->CRH=0X00000000;}\
              {GPIOD->CRL=0X00000000;GPIOD->CRH=0X00000000;}\
              {GPIOA->BRR=0XFFFF; GPIOB->BRR=0XFFFF;}\
              {GPIOC->BRR=0XFFFF; GPIOD->BRR=0XFFFF;}\
              {delay(a);}\
                   {GPIOB->BSRR=0X0200;}}

#define A1B2    {{GPIOA->CRL=0X00000300;GPIOA->CRH=0X00000000;}\
              {GPIOB->CRL=0X00000000;GPIOB->CRH=0X00000030;}\
              {GPIOC->CRL=0X00000000;GPIOC->CRH=0X00000000;}\
              {GPIOD->CRL=0X00000000;GPIOD->CRH=0X00000000;}\
              {GPIOA->BRR=0XFFFF; GPIOB->BRR=0XFFFF;}\
              {GPIOC->BRR=0XFFFF; GPIOD->BRR=0XFFFF;}\
              {delay(a);}\
                   {GPIOB->BSRR=0X0200;}}

#define A1B3    {{GPIOA->CRL=0X00003000;GPIOA->CRH=0X00000000;}\
                     {GPIOB->CRL=0X00000000;GPIOB->CRH=0X00000030;}\
              {GPIOC->CRL=0X00000000;GPIOC->CRH=0X00000000;}\
              {GPIOD->CRL=0X00000000;GPIOD->CRH=0X00000000;}\
              {GPIOA->BRR=0XFFFF; GPIOB->BRR=0XFFFF;}\
              {GPIOC->BRR=0XFFFF; GPIOD->BRR=0XFFFF;}\
              {delay(a);}\
                   {GPIOB->BSRR=0X0200;}}

但是我不仅仅是让每个灯亮,还要显示数字,汉字,需要写汉字数字驱动程序。但是如果用宏定义的方式去写显示函数,会非常复杂(小弟愚见,可能会非常简单,我还不知道罢了)。

  A1B1;
  A1B2;
  A1B3;
  A1B4;
  A1B5;
  A1B6;
  A1B7;
  A1B8;//如果让每个点亮得写512个这样的调用宏定义

 

所以把宏定义封装成函数,

void  FA1B1(void){A1B1;};
void  FA1B2(void){A1B2;};
void  FA1B3(void){A1B3;};
void  FA1B4(void){A1B4;};
void  FA1B5(void){A1B5;};
void  FA1B6(void){A1B6;};
void  FA1B7(void){A1B7;};
void  FA1B8(void){A1B8;};    //将宏定义封装成为函数

再将这些函数放入16*32的一个函数指针数组中,这样再写显示函数时就显得非常简洁。

extern void (*p[16][32])(void)={
FA1B1,FA1B2,FA1B3,FA1B4,FA1B5,FA1B6,FA1B7,FA1B8,
FA1C1,FA1C2,FA1C3,FA1C4,FA1C5,FA1C6,FA1C7,FA1C8,
FC1A1,FC1A2,FC1A3,FC1A4,FC1A5,FC1A6,FC1A7,FC1A8, 
FB1C1,FB1C2,FB1C3,FB1C4,FB1C5,FB1C6,FB1C7,FB1C8,,,};//这就是函数指针数组

 

 

for(int i=0;i<=15;i++)    //让全部点亮只需要这个循环即可,关键是之后显示函数编写上更加方便了
  for(int j=0;j<=31;j++)
      p[i][j]();    

 

诺又不当之处敬请指正!

转载于:https://www.cnblogs.com/shazm/p/6354617.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值