点阵循环+led移位多文件例程

main.c

#include "system.h"
#include "led.h"
#include "dz.h"
extern	uchar flag_1ms;	   //在其他模块中寻找其定义。另外,extern也可用来进行链接指定。

void main(void)			//程序的主函数
{
	
	Timer0_Init(); ////定时器0函数调用
		
	while(1)  			//大括号里面的东西,被不停的循环执行
	{
	
		//1ms进入一次
		if(flag_1ms==1)	//加了我之后,我的大括号里面的东西,被定期的1ms执行一次,反复执行	 	
		{
		
			flag_1ms=0;

		
			Led_Move();	   //led移位函数 定时
		 	dis_yigezi();  //显示1个字的函数
			dis_poll();	   //播放字体函数
		}
	}
}



DZ.C

#include "dz.h"	 //把led.h文件包含进来
#include "system.h"	   //把timer0.h文件包含进来
#include <intrins.h>
 
uchar code duan0[3][8]={
	{0x00,0x3C,0x42,0x42,0x42,0x3C,0x00,0x00},//数字0的段选
 	{0x00,0x49,0x49,0x7f,0x49,0x49,0x00,0x00},//
 	{0x08,0x10,0x3f,0x49,0x2d,0x7f,0x2d,0x09} //
 };
 
uchar code wei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//?位选

void sandbyte(uchar dat)//74hc595发送段选的数据
{
	uchar i;
	SCLK=0;
	RCK=0;
	for(i=0;i<8;i++)
	{
		SER=dat>>7;
		dat<<=1;
		
		SCLK=1;
		_nop_();
		_nop_();
		SCLK=0;
	}
	RCK=1;
	_nop_();
	_nop_();
	RCK=0;
}

uchar index =0;
//最低层,点阵屏的驱动,让它不停显示一个字
//这个函数,用在让点阵屏,不停的显示一个字
//这个字是什么,由index来决定,index初始化为0,就是显示第0个字,就是0
void	dis_yigezi(void)  //显示1个字的函数
{
	//index表示要显示哪个字,在duan0二维数组里面有解释
	//i表示要显示第几行
	static	unsigned char i=0;	//定时变量
	sandbyte(0x00);	  //消影
	P0=wei[i];		  //打开第1  1毫秒打开1
	sandbyte(duan0[index][i]);	 //显示字index的第i行

	i++;
	if(i>7){i=0;}	//定时大于7清零
}

//次低层,播放
//这个函数,用来改变要显示的内容
//它每1秒钟修改一下index,所以修改了要显示的内容
void	dis_poll(void)	//播放字体函数
{
	static	unsigned int timer=0;  //播放字体变量
	timer++;
	if(timer>=1000)	 //定时1秒钟
	{
		timer=0;
		index++;
		if(index>2){index=0;}  //轮流播放3个字,最后清0从第一个开始显示
	}
}

DZ.H

#include "system.h"	   //把timer0.h文件包含进来

sbit SCLK=P3^6;		//管脚定义
sbit RCK=P3^5;
sbit SER=P3^4;

void sandbyte(uchar dat);
void dis_yigezi(void);
void dis_poll(void);

LED.C

#include "led.h"	 //把led.h文件包含进来
#include "system.h"	   //把timer0.h文件包含进来
uchar data1=0xfe;	//先点亮第一个LED灯
  
void	Led_Move(void)	  //led移位函数 定时
{	 
	static	unsigned int timer=0;
	LED = data1;
	timer++;
	if(timer==500)
	{
		data1 = data1<<1|0x01;
		timer=0;	
		if(data1==0xff)
		{
			data1=0xfe;
		}
	}
}
 

LED.H

#include "system.h"	   //把timer0.h文件包含进来
#define LED P2		//led管脚
 void	Led_Init(void);
 void	Led_Move(void);

system.c

#include "system.h"

uchar flag_1ms=0;
/*
void	Delay_us(uint xus)
{
	for(;xus>0;xus--);
}

void	Delay_ms(uint xms)
{
	for(;xms>0;xms--)
	{
		Delay_us(1000);
	}
}
 */
void	Timer0_Init(void)
{
	TH0 = T1MS>>8; //赋初值
	TL0 = T1MS;	   //赋初值
	TMOD = 0x01;  //设置定时器0用十六位定时器方式
    EA = 1;			 //打开总中断
  	ET0 = 1;		 //打开定时器0中断
  	TR0 = 1;		 //启动定时器0		
}

void Timer0() interrupt 1		 //中断号1
{	
	TH0 = T1MS>>8; //赋初值
	TL0 = T1MS;	   //赋初值
	flag_1ms=1;
}



system.h

#include "reg51.h"


#define	uchar unsigned char	//定义无符号字符
#define	uint  unsigned int	//定义无符号整形

#define	FOSC	12000000L	//定义晶振频率		   
#define	T1MS	(65536-FOSC/12/1000)  //定时1毫秒的时候,计数器要写入的值

//void	Delay_us(uint xus);	//us级延时
//void	Delay_ms(uint xms);	//ms级延时
void	Timer0_Init(void);  	//定时器初始化

你可能感兴趣的:(点阵循环+led移位多文件例程)