程序模块化方法 模块化编程,必然会涉及到多文件编译,也就是工程编译。在这样的一个系统中,往往会有多个 C 文件,而且每个 C 文件的作用不尽相同。在我们的 C文件中,由于需要对外提供接口,因此必须有一些函数或者是变量提供给外部其它文件进行调用。 假设我们有一个 delay.c 文件,此为一个延迟函数 void delayms (unsigned char xms) { unsigned char i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } 而在我们的另外一个文件中需要调用此函数,那么我们该如何做呢? 头文件的作用正是在此。可以称其为一份接口描述文件。其文件内部不应该包含任何实质性的函数代码。我们可以把这个头文件理解成为一份说明书,说明的内容就是我们的模块对外提供的接口函数或者是接口变量。同时该文件也包含了一些很重要的宏定义以及一些结构体的信息,离开了这些信息,很可能就无法正常使用接口函数或者是接口变量。但是总的原则是:不该让外界知道的信息就不应该出现在头文件里,而外界调用模块内接口函数或者是接口变量所必须的信息就一定要出现在头文件里,否则,外界就无法正确的调用我们提供的接口功能。因而为了让外部函数或者文件调用我们提供的接口功能,就必须包含我们提供的这个接口描述文件----即头文件。同时,我们自身模块也需要包含这份模块头文件(因为其包含了模块源文件中所需要的宏定义或者是结构体),好比我们平常所用的文件都是一式三份一样,模块本身也需要包含这个头文件。 下面我们来定义这个头文件,一般来说,头文件的名字应该与源文件的名字保持一致,这样我们便可以清晰的知道哪个头文件是哪个源文件的描述。 于是便得到了 delay.c 的头文件delay.h 其内容如下。 #ifndef __DELAY_H__ #define __DELAY_H__ extern void delayms(unsigned char xms); #endif 这与我们在源文件中定义函数时有点类似。不同的是,在其前面添加了extern 修饰符表明其是一个外部函数,可以被外部其它模块进行调用。 #ifndef __DELAY_H__ #define __DELAY_H__ …… #endif 这是头文件的编写格式,__DELAY_H__这个是头文件的名字,必须大写,中间的横线不能少。一般来说,头文件的名字应该与源文件的名字保持一致,这样我们便可以清晰的知道哪个头文件是哪个源文件的描述。 我们以让 3 个 LED 灯闪亮,芯片型号 AT89C51 为例介绍: 1,打开 keil软件中建立多个工程。(如图) 2. 3 . 4 . 5 ....