本帖最后由 fish001 于 2019-9-7 21:44 编辑
在刚接触单片机,刚编写代码的时候都只是有一个.h 和一个.c文件。把所有的函数都写在.c里面。这样遇到复杂的系统时,代码量就很大,一下子就是几百行。而且把所有函数写在一个.c里不利于移植,对于以后的开发有了很大的限制。为了解决这个缺点就必须学会模块化编程。将程序分解成一个一个模块。这样就有了多个.c 和多个.h。下面开始讲解什么是模块化编程,怎么去模块化。
借用网上的流水灯例子来说明,侵删。
在不模块化情况下:
#include <reg52.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
void Delay_Ms(uint xms)
{
uint i,j; for(i=0;i<xms;i++)
{
for(j=0;j<110;j++);
}
}
void Display_Led()
{
uchar aa,j;
aa = 0x7f;
for(j=0;j<8;j++)
{
P1 = aa;
aa = _cror_(aa,1); Delay_Ms(500);
}
}
void main()
{
while(1)
{
Display_Led();
}
}
上面这个程序是全部写在了main.c这一个C文件里。完成了一个流水灯功能,程序非常简单,那么下面我们将程序模块化。模块化我们就建立一个 main.c led.c led.h 这三个文件,那么这三个文件里分别写什么东西呢,下面一个一个的写。led.h 里内容如下:
#ifndef LED_H //理解为 if not define led.h
#define LED_H //如果没有定义 led.h ,这里就定义一个 led.h
#include "reg52.h" //由于 led,c 里面要用到 51单片机寄存器 P1,
// 所以这里包含 51 单片机的头文件
#include "intrins.h" // 循环移位用到
#define uchar unsigned char
#define uint unsigned int // 这些宏定义都可以在头文件 .h 里定义
void Delay_Ms(uint xms);
void Display_Led(); // 将led.c 里的函数在led.h 里面申明
#endif // 定义结束
led.c 里内容如下,将流水灯的主要程序放在这个.c 里面。作为单独的流水灯模块,在以后的程序中如果要用到这个流水灯程序
就直接把 led.c 和 led.h 移植过去。
#include "led.h" // 这里包含 led.h 这个头文件
void Delay_Ms(uint xms)
{
uint i,j; for(i=0;i<xms;i++)
{
for(j=0;j<110;j++);
}
}
void Display_Led()
{
uchar aa,j; aa = 0x7f; for(j=0;j<8;j++)
{
P1 = aa;
aa = _cror_(aa,1);Delay_Ms(500);
}
}
用来完成流水灯功能的模块程序已经写好了,现在就开始主函数的编写。主函数就只需要调用一个Display_Led()函数就行了,看现在是怎么写的:
#include "led.h" //在 main.c 里现在包含的也是 led.h 而不是 reg52.h了
void main()
{
while(1)
{
Display_Led(); // 这样直接调用就行。
}
}
模块化编程的时候要想到你把一个 .c 和.h 文件给另一个人,那个人能够很轻松的运用你给的这个模块来实现效果,且不需要去改动很多东西,那就算成功了。
extern是什么:extern文件间的全局变量。因此,.c里面用到的变量名字,一般在对应的.h文件中用extern声明(只声明不定义)
|