首先函数指针数组是数组,其次数组里面存放的是函数指针,函数指针又是什么呢,函数指针是指向函数首地址的指针,
我个人认为函数指针数组可以批量像调用数组元素一样方便调用一些功能相似的一些函数(小弟愚见),我写这个博客之前就是遇到这个问题。
首先介绍一下我遇到问题背景,想做个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]();
诺又不当之处敬请指正!