所谓模块化编程,就是我们在创建一个工程之前,先对我们的需求进行分析,根据所需功能挑选相应模块,对这些模块进行相应的编程,封装成对应的.C和.H文件,最后在我的main.c中对.h文件进行预编译,进而调用各个模块C文件内的函数,实现工程完整功能。
模块化编程可以使主函数所在.c文件看起来更精简,所谓模块化就是进行分装。
h文件中可以对变量定义,函数声明,数组进行一个模块化封装,但不能有具体的函数。
例如:
led.h
#ifndef __LED_H_//
#define __LED_H_//
#include
sbit LED=P2^5;
typedef unsigned char u8;
typedef unsigned int u16;
extern void delay(u16 a); //延时函数
extern void pao(); //跑马灯函数,即使P2^5闪烁
#endif
即:
#ifndef __LED_H__
注:
LED前有一个空格和两个下划线,大写文件名称,一个下划线,大写H,两个空格。
ifndef的全称是“if not define”,即如果没有定义LED,则执行下一步宏定义。
#define __LED_H__
注:
同上
#endif
作用:
即使.c文件中同时包含两个LED.h,也不会出现重定义的错误。
sfr P0 = 0x90;
sbit LED=P2^5;
extern void delay(u16 a);
1.sfr :
"special function register ",特殊功能寄存器,用来存放各种功能部件的数据,状态,数据命令。
在书写.h文件时用法:
变量名=地址名,其中等号右边必须为数字常量,不能包含+ -等操作符,数值也不能随意;
作用:
用在.h文件中,相当于将地址命名;
2.sbit :
在书写.h文件时:
(1)sbit 位变量名=地址值 ;
(2)sbit 位变量名=SFR名称^变量位地址值 ;
(3)sbit 位变量名=SFR地址值^变量位地址值 ;
extern 即用于在.h文件中声明函数。
作用:
定义端口;
extern:
用于在.h文件中的函数或变量声明,而且声明是不分配地址空间的,只有定义才分配地址空间。
作用:
声明函数或变量,在.h文件中不得定义全局变量,以防被多个源文件引用时报错,但是可以在某个源文件中定义全局变量,然后在.h文件中进行声明,加入.h文件便可以在源文件中使用。
在一个工程中只可以有一个主函数,但并不是只可以有一个.c文件,在.c文件中可以放置具体函数等,来配合.h文件,以达到精简含有主函数的.c文件的要求。
例如:
LED.h
#ifndef __LED_H_
#define __LED_H_
#include
sbit LED=P2;
typedef unsigned char u8;
typedef unsigned int u16;
extern void delay(u16 a); //延时函数
extern void marquee(); //跑马灯函数,使led灯闪烁
#endif
LED.c
#include"led.h"
void delay(u16 a)
{
u16 i;
while(i--);
} //延时函数
void marquee()
{
LED=0;
delay(50000);
LED=1;
delay(50000);//延时
} //跑马灯函数
main.c
#include"led.h"
void main()
{
while(1)
{
marquee();//跑马灯函数,使led灯闪烁
}
}
使led灯闪烁。
首先区分好哪一部分是主函数,哪一部分是定义具体函数,哪一部分是声明和定义;然后分别将三部分分别放在三个文件中,一一对应.c文件.c文件.h文件。
首先点击新建文件,然后重命名(知晓功能,方便下次使用),接下来必须保存在main.c文件所在文件夹中,然后可以做好批注,方便了解另一个相匹配的.c文件内容。
同.h文件,但不能含有主函数。