LCD滚动显示多文件例程

main.c

#include "system.h"
#include "lcd.h"


extern	uchar flag_1ms;	   //在其他模块中寻找其定义。另外,extern也可用来进行链接指定。

 void main(void)			//程序的主函数
{
  	 Timer0_Init(); //定时器0函数
	 LcdInit();	   //LCD初始化子程序
		   		
	while(1)  			//大括号里面的东西,被不停的循环执行
	{
	   
		//1ms进入一次
		if(flag_1ms==1)	//加了我之后,我的大括号里面的东西,被定期的1ms执行一次,反复执行	 	
		{
		  	flag_1ms=0;
		  
			LCD_Display();	//显示屏显示函数
		}
	}
}
			 


lcd.c

#include "lcd.h"	 //把led.h文件包含进来
#include "system.h"	   //把timer0.h文件包含进来
 
uchar a[16]="perchin designed";
uchar b[27]="welcome to the world of mcu";
void Lcd1602_Delay1ms(uint c)   //误差 0us
{
    uchar a,b;
	for (; c>0; c--)
	{
		 for (b=199;b>0;b--)
		 {
		  	for(a=1;a>0;a--);
		 }      
	}
    	
}

/*******************************************************************************
*            : LcdWriteCom
* 函数功能		   : 向LCD写入一个字节的命令
*              : com
*              : 
*******************************************************************************/
void LcdWriteCom(uchar com)	  //写入命令
{
	LCD1602_E = 0;     //使能
	LCD1602_RS = 0;	   //选择发送命令
	LCD1602_RW = 0;	   //选择写入
	
	LCD1602_DATAPINS = com;     //放入命令
	Lcd1602_Delay1ms(1);		//等待数据稳定

	LCD1602_E = 1;	          //写入时序
	Lcd1602_Delay1ms(5);	  //保持时间
	LCD1602_E = 0;
}

/*******************************************************************************
*            : LcdWriteData
* 函数功能		   : 向LCD写入一个字节的数据
*              : dat
*              : 
*******************************************************************************/		   
void LcdWriteData(uchar dat)			//写入数据
{
	LCD1602_E = 0;	//使能清零
	LCD1602_RS = 1;	//选择输入数据
	LCD1602_RW = 0;	//选择写入

	LCD1602_DATAPINS = dat; //写入数据
	Lcd1602_Delay1ms(1);

	LCD1602_E = 1;   //写入时序
	Lcd1602_Delay1ms(5);   //保持时间
	LCD1602_E = 0;
}

/*******************************************************************************
*          : LcdInit()
* 函数功能		 : 初始化LCD屏
*            : 
*            : 
*******************************************************************************/		   
void LcdInit()						  //LCD初始化子程序
{
 	LcdWriteCom(0x38);  //开显示
	LcdWriteCom(0x0c);  //开显示不显示光标
	LcdWriteCom(0x06);  //写一个指针加1
	LcdWriteCom(0x01);  //清屏
	LcdWriteCom(0x80);  //设置数据指针起点
}

void LCD_Display(void)	   //显示屏显示函数
{
	uchar i;   //显示变量
	static	unsigned int timer=0;  //定时变量
	static	unsigned int j=0;  //移位变量
	timer++;
	if(timer==300)	//300ms进来一次
	{
		timer=0;	

		LcdWriteCom(0x00+0x80);	 //显示第一行
		for(i=0;i<16;i++)
		{

			if((i+j)<16){LcdWriteData(a[i+j]);}	//每次进来j+1等于是移一位
			else{LcdWriteData(' ');} //防止乱码出现,后面的显示空白	
		}
		LcdWriteCom(0x40+0x80);	  	//显示第2
		for(i=0;i<27;i++)
		{
		
			if((i+j)<27){LcdWriteData(b[i+j]);}	 //每次进来j+1等于是移一位
			else{LcdWriteData(' ');}	//防止乱码出现,后面的显示空白	
		} 
		j++;
		if(j>27){j=0;} //移位变量大于270
		 
	}
}

lcd.h

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

#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;	 //管脚定义
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;

/**********************************
函数声明
**********************************/
/*51单片机12MHZ时钟下的延时函数*/
void Lcd1602_Delay1ms(uint c);   //误差 0us
/*LCD1602写入8位命令子函数*/
void LcdWriteCom(uchar com);
/*LCD1602写入8位数据子函数*/	
void LcdWriteData(uchar dat)	;
/*LCD1602初始化子程序*/		
void LcdInit();	
/*//显示屏显示函数*/
void LCD_Display(void);					  


system.c

#include "system.h"
 
uchar flag_1ms=0;

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;
}

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

void	Delay_ms(uint xms)
{
	for(;xms>0;xms--)
	{
		Delay_us(1000);
	}
}
 */

system.h

#include "reg51.h"


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

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

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

你可能感兴趣的:(LCD滚动显示多文件例程)