前言:
模块化编程就是一种分类管理的思想,把不同的模块所实现的功能放在不同的文件里面,然后在集中的把它组织起来,这样可以提高我们代码的可阅读性,可维护性,可移植性。
传统方式的编程:
所有的函数均放在main.c里面,若使用的模块比较多,则一个文件内就会用很多的代码,不利于代码的组织和管理,而且影响编程者的思路。
模块化的编程:
把各种模块的代码放在不同的.c文件里面,在.h文件里面提供外部可调用函数的声明,其他的.c文件想使用其中的代码时,只需要写 “#include "xxx.h”文件即可,使用模块化的编程可以极大的提高代码的可阅读性,可维护性,可移植性等
二、LCD1602调试工具
使用LCD1602液晶屏作为调试工具,提供类似printf函数的功能,可以实现观察单片机内部数据的变换情况,便于调试和演示。
LCD1602代码属于模块化代码,使用者只需要知道所提供的函数的作用和使用方法就可以很容易得使用LCD1602
函数 LCD_Init(); ————初始化;
函数 LCD_ShowChar(1,1,'A');————显示一个字符
函数 LCD_ShowString(1,3,"Hello");————显示字符
函数 LCD_ShowNum(1,9,123,3); ————显示十进制的数字
函数 LCD_ShowSignedNum(1,13,-66,2);—————显示有符号的十进制数字
函数 LCD_ShowHeNum(2,1,0xA8,2);————显示十六进制的数字
函数 LCD_ShowBinNum(2,4,0x88,8);————显示二进制的数字
比如说我们的延时函数和数码管的断码结构体就是一个个的实现某种固定功能的代码,我们需要这些代码的时候,那么就会重新的打开先前的.c文件,对特定片段的功能代码进行复制粘贴,那么其代码的可移植性就比较弱。
下面的我们来以51单片机为例子:
第一个文件是 Delay.c ,其文件的代码如下:
void Delay(unsigned int xms)
{
unsigned char i, j;
while (xms != 0)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
第二个文件是 Delay.h文件
#pragma once
#ifndef _DELAY_H_
#define _DELAY_H_
void Delay(unsigned int xms);
#endif
第三个文件:main.c文件
#include "Delay.h"
void main()
{
Delay(10);
}
以上就是模块化编程的例子
这样我们就可以看到我们把Delay延时函数的函数主题,从main函数当中移出去了。
关于模块化编程需要注意的事项
.c文件:函数,变量的定义
.h文件:可被外部调用的函数,变量的声明
一、任何自定义的变量,函数在调用前必须有定义或者声明(同一个.c文件)
二、使用到的自定义函数的.c文件必须使用添加到工程当中参与编译
三、使用到的.h文件必须要放在编译器可以寻找到的地方(工程文件夹根目录,安装目录,自定义)
预编译
关于C语的预编译是以#为开头的,作用就是在编译开始之前,对代码进行预先的一些处理(预编译)
#include <REGX52.H> 就是把文件REGX52.H的内容移动到这里来
#define PI 3.14 定义PI,并将PI 替换为3.14
#define ABC 定义ABC
#ifndef ___XX_H_ 如果没有定义__XX_H__
#endif 与#ifdef,#if匹配,组成“括号”
注意:#ifndef和#endif 就是防止重复定义的,例如:
#ifdef AAA
bfoahdaiu
#enif
如果前面定义了AAA,那么#ifdef和#enif之间的代码,才参与编译。如果没有定义AAA,那么下面的代码就不会参与编译。所以我们可以说,#define 和 #ifdef 和#enif 三者可以进行配套使用的
那么“#ifndef”和“enif” 他们的情况也是一样的,例如
#ifndef AAA
baobeishuijiao
#endif
代表的意思就是如果他们没有定义AAA的话,那么#ifndef和#enif 之间的代码就会参与编译