程序的模块化


模块化

我们已经知道,对于明显具有特性功能的程序段我们可以封装进子函数中;而多个子函数我们进一步可以封装到单独的文件中。


实例:模块前的代码

比如7段数码管的程序如下(这里对具体内容进行了省略)

#include <STC15F2K60S2.h>
#define uchar unsigned char
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};//变量的定义和声明
void disp(long int x);  //函数的声明
void DelaySMG(unsigned int time);    //函数的声明
void main()
{
	/*此处省略具体代码*/
	while(1)
	{
		disp(20211225);
	}
}
void disp(long int  dat)    //函数的定义
{
/*此处省略具体代码*/
}

void DelaySMG(unsigned int time)   //函数的定义
{
    while(time--);
}

里面的disp函数和DelaySMG函数都是针对7段数码管这个硬件的,因此我们可以把他们单独放到别的文件里,到时需要的时候直接把这个文件加进去就可以了。

注意到上面代码注释中用了声明和定义两个词汇,声明告诉单片机存在该变量或者函数,而定义则会为其分配空间。

上述程序中函数的声明和定义是分开的,而变量的声明和定义是一起的。

我们也可以用extern(外部)关键字单独写变量的声明

extern code tab[];//变量的声明
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};//变量的定义

实例:模块后的代码

为了实现模块化,我们单独建立两个文件。

具体做法是把变量和函数的声明放到一个头文件disp.h中,而把它们的定义放到disp.c中

\*disp.h*\
#ifndef __DISP_H__   //这几句话的意思是为了保证这个h文件只被调用一次
#define __DISP_H__

#define uchar unsigned char
extern code tab[];//变量的声明
void disp(long int x);  //函数的声明
void DelaySMG(unsigned int time);    //函数的声明

#endif
\*disp.c*\
#include "disp.h" //注意到此处是用的"",用<>也可以,具体原因请自行探索。
#include 
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};//变量的定义

unsigned char code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
void disp(long int dat) //函数的定义
{
	int i;
	unsigned char str[8];
	str[0]=dat/10000000%10;
	str[1]=dat/1000000%10;
	str[2]=dat/100000%10;
	str[3]=dat/10000%10;
	str[4]=dat/1000%10;
	str[5]=dat/100%10;
	str[6]=dat/10%10;
	str[7]=dat/1%10;
	for( i = 0 ;i<8;i++)
	{
		
		P2 = P2&0x1f|0xc0;P0=0X01<<i;
		P2 = P2&0x1f|0xe0;P0=tab[str[i]];
		P2 = P2&0x1f;
		DelaySMG(600);
		P2=P2&0x1f|0xc0;P0=0;	
	}
}

void DelaySMG(unsigned int time) //函数的定义
{
    while(time--);
}

这样主函数就可以简化为

#include <STC15F2K60S2.h>
#include "disp.h"  //把头文件包含进来,disp里面声明的变量和函数就可以直接用了
void main()
{
	P2=0XA0;P0=0X00;
	P2=0X80;P0=0XFF;
	P2=0;
	while(1)
	{
		disp(333);
	}
}

需要注意的是,disp.c也需要加入到工程中,方法同主c文件

============================找指导老师布置任务吧==============================