程序的模块化
模块化
我们已经知道,对于明显具有特性功能的程序段我们可以封装进子函数中;而多个子函数我们进一步可以封装到单独的文件中。
实例:模块前的代码
比如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" //注意到此处是用的"",用<>也可以,具体原因请自行探索。 #includeuchar 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文件
============================找指导老师布置任务吧==============================