当单片机需要控制的模块越多,所有代码集中在main函数中的话就会非常冗余,且难以维护,所以,将不同模块的控制代码可以划分模块来进行控制,主函数的主要作用就是调用各个模块的接口就好,便于维护和阅读
•模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include “XXX.h”文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等
•.c文件:函数、变量的定义
•.h文件:可被外部调用的函数、变量的声明
以下为,转模块化的一个例子
原代码:
#include <REGX52.H>
unsigned char num[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void NiXie(unsigned char Location,Number)
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=num[Number];
Delay(1);
P0=0x00;
}
void main()
{
while(1){
NiXie(1,1);
NiXie(2,2);
NiXie(3,3);
}
}
声明文件.h的预编译,预处理需要如图头文件:
模块化编程后的代码和结构:
main.c
#include <REGX52.H>
#include "Delay.H"
#include "NiXie.H"
void main()
{
while(1){
NiXie(1,1);
NiXie(2,2);
NiXie(3,3);
}
}
Delay.c
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
Delay.h
#ifndef _DELAY_H_
#define _DELAY_H_
void Delay(unsigned int xms);
#endif
NiXie.c
#include "Delay.h"
#include <REGX52.H>
unsigned char num[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};
void NiXie(unsigned char Location,Number)
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=num[Number];
Delay(1);
P0=0x00;
}
NiXie.h
#ifndef _NIXIE_H_
#define _NIXIE_H_
void NiXie(unsigned char Location,Number);
#endif
文件结构: