您的位置:首页 > 其它

关于函数指针在单片机上的应用

2017-06-06 20:27 501 查看
通过函数指针使程序的可读性更强。在开发外设较少而程序比较复杂的单片机时函数指针能给无论是开发者还是维护者一个比较清晰的思路。

以51单片机为例

/***************************************
main.h
***************************************/
#ifndef _MAIN_H_
#define _MAIN_H_
#define MAXTASK (10)
typedef unsigned int uint;
typedef unsigned int u32;
typedef unsigned char uchar;
typedef unsigned char u8;
typedef struct
{
uint period;
uchar runMe;
void (*pTask)();
}Task;

void sysStop();
void sysRun();
void sysAddTask(uint *p,uint tPeriod);

#endif
/***************************************
main.c
***************************************/
#include<reg52.h>
#include"main.h"

void sysAddTask(uint *p,uint tPeriod);
void sysInit();
void sysStart();
void sysSleep();
void sysStop();
void sysRun();
void sysDsp();

Task task[MAXTASK];

void sysAddTask(uint *p,uint tPeriod)
{
uchar i=0;
while(task[i].pTask != 0) i++;
task[i].pTask = p;
task[i].period = tPeriod;
}

void sysInit()//12mhz@1ms@定时器2自动重装
{
uchar i;
for(i=0;i<MAXTASK;i++)
{
task[i].pTask = 0;
task[i].period = 0;
task[i].runMe = 0;
}
T2CON=0X04;
TMOD = 0x00;
TH2=0XFC;
TL2=0X18;
RCAP2H=0XFC;
RCAP2L=0X18;
ET2=1;
TR2=1;
}

void sysStart()
{
EA = 1;
}

void sysSleep()
{
PCON |= 0x01;
}

void sysStop()
{
TR2 = 0;
}

void sysRun()
{
TR2 = 1;
}

void sysDsp()
{
uchar i;
for(i=0;i<MAXTASK;i++)
{
if(task[i].runMe==1)
{
task[i].runMe = 0;
(*task[i].pTask)();
}
}
sysSleep();
}

void main()
{
sysInit();
//    sysAddTask(led,1000);
sysStart();
while(1)
{
sysDsp();
}
}

void sysUpdate() interrupt 5{
uchar i;
TF2=0;
for(i=0;i<MAXTASK;i++)
{
if(task[i].pTask)
if(task[i].period==0) task[i].runMe = 1;

else
task[i].period -= 1;
}
}


是不是程序变得非常清晰呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: