keil c51多文件编程

多文件编程可以大大提高程序代码移植率,避免程序看起来臃肿复杂
以流水灯为例
我们需要创建三个文件 led.c led.h main.c

led.c文件编写

#include  "led.h"	// 这里包含 led.h 这个头文件
sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
sbit ENLED = P1^1;
unsigned char cnt = 0; //定义计数变量 cnt,用于移位控制

void delay690ms()		//@12.000MHz,延时约0.5s
{
	unsigned char i, j, k;
	_nop_();
	_nop_();
	i = 32;
	j = 119;
	k = 85;
	do
	{
		do
		{
			while (--k);
		} 
		while (--j);
	} 
	while (--i);
}


void led_move()
{ 	

  ENLED = 0;
  ADDR2 = 1;
  ADDR1 = 1;
  ADDR0 = 0;
	
	
  P0 = ~(0x01 << cnt); //P0 等于 1 左移 cnt 位,控制 8 个 LED
  delay690ms(); //软件延时,约0.5s
  cnt++; //移位计数变量自加 1
  if (cnt > 7) //移位计数超过 7 后,再重新从 0 开始
  {
  cnt = 0;
  }
	

}

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 delay690ms();
void led_move();		// 将led.c 里的函数在led.h 里面申明
 
#endif	// 定义结束

main.c文件编写

#include "led.h"		//在  main.c 里现在包含的也是 led.h 而不是 reg52.h了
void main()
{

 while (1) //主循环,程序无限循环执行该循环体语句
 {
   led_move();
 }
}

注意一点
1、此时void led_move(); 是可以调用void delay690ms();函数的
2、cnt变量必须定义在led_move外,不然程序每次进入led_move就会重新定义为0,无法实现以为循环功能
keil c51多文件编程_第1张图片

你可能感兴趣的:(单片机)