⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcdinti.c

📁 FDY12864_KEY...keil c51
💻 C
字号:
#include<reg52.h>
#define  uchar  unsigned  char
#define  uint   unsigned  int
//*************************************************************
sbit rst=P1^4;
sbit psb=P1^3;
sbit rs=P1^0;
sbit rw=P1^1;
sbit e=P1^2;
void delay_50us(uint t);
void delay_50ms(uint t);
void wri(uint t);
void wrd(uint t);
void  welcome();
void WriteLCD(unsigned char StartAddress,unsigned char Size,unsigned char Charactors[]);
void WriteLCD_Command(unsigned char Command);
void WriteLCD_Data(unsigned char Data);
unsigned char ChangeAddress(unsigned char StartAddress);
unsigned char LCDBusyWait();
//*************************************************************
void lcd_init()//LCD初始化程序
  {
    rst=0;
	rst=1;	//LCD复位
	psb=1;  //将PSB置1,通信方式为8位数据并口
    delay_50ms(1);//延时40ms
		        //功能设置---8BIT控制界面,基本指令集
	wri(0x30);		        //调用写指令子程序
	delay_50us(1);      //延迟50us
				//显示打开,光标关,反白显示关
	wri(0x0c);				//调用写指令子程序
	delay_50us(1);		//延迟50uS
				//清除屏幕显示,将DDRAM的地址计数器归零
	wri(0x01);				//调用写指令子程序
	delay_50us(1); 		//延迟39uS
				//DDRAM的地址计数器(AC)加1
	wri(0x06);				//调用写指令子程序
	delay_50us(1);		//延迟39uS
  }
void  welcome()
 { uchar i,j;
       wri(0x01);
	   delay_50ms(1);
 	   WriteLCD(0x82,0,"欢迎使用");
	   WriteLCD(0x92,0,"Welcome ");
	   //WriteLCD(0x89,0,"系统正忙");
	   WriteLCD(0x89,0,"Waiting.");
	   //WriteLCD(0x88,0,"正在加载初始化");
	   //WriteLCD(0x99,0,"Waiting ");
	  for(j=0;j<=1;j++)
	   {
	   wri(0x8d);
	   wrd(0x20);
	   wrd(0x20);
	   wrd(0x20);
	   wrd(0x20);
	   wrd(0x20);
	   wri(0x8d);
	   for(i=0;i<=4;i++)
	      {
		    wrd(0x2e);
			delay_50ms(10);
		  }
		}
 }
//*************************************下面是延时程序(包括50us和50ms)
void delay_50us(uint t)	 //50us延时程序
{
uchar j; 
for(;t>0;t--)
    for(j=19;j>0;j--)
	;
}
void delay_50ms(uint t)//50ms延时程序
{
uint j; 
for(;t>0;t--) 
for(j=6245;j>0;j--)
;
}
//***********************************************************
void wri(uint com)
{
  rs=0;
  rw=1;
loop1:  P0=0xff;
  e=1;
  ACC=P0;
  delay_50us(2);
  if(ACC^7!=1)
      {
	   rw=0;
	   P0=com;
	   e=1;
	   e=0;
	  }
	else
	goto  loop1;
}
//******************************************以上是写指令子程序 
void wrd(uint dat)
{
   rs=0;
   rw=1;
loop2:
   P0=0xff;
   e=1;
   ACC=P0;
   delay_50us(3);
   if(ACC^7!=1)
   {
     rs=1;
	 rw=0;
	 P0=dat;
	 e=1;
	 e=0;
   }
   else
   goto loop2;
}
//******************************************以上是写数据子程序
void WriteLCD(unsigned char StartAddress,unsigned char Size,unsigned char Charactors[])
{
	unsigned char *i=Charactors;	  //字符串的首地址
	WriteLCD_Command(StartAddress);
	if(Size) 		//Size不为0
	{
		bit Over=0;
		while(i<(Charactors+Size))		//判断字符串结尾
		{
			if(Over)
			{
				WriteLCD_Data(' ');i++;
				if(i>=(Charactors+Size)) break;
				WriteLCD_Data(' ');i++;
			}
			else
			{

				switch(((*i)*256)+(*(i+1)))
				{

				}
			}
			StartAddress=ChangeAddress(StartAddress); //改变地址,实现了逐行显示
		}
	}
	else			                                //Size为0
	{
		while(*i)						          //判断字符串结尾,*i为0代表结束
		{
			WriteLCD_Data(*i);
			i++;
			WriteLCD_Data(*i);
			i++;
			StartAddress=ChangeAddress(StartAddress);
		}
	}
}
void WriteLCD_Data(unsigned char Data)			//向LCD写入一个字节的数据
{
	LCDBusyWait();
	rs=1;
	P0 = Data;
	e=1;
	e=0;
}

void WriteLCD_Command(unsigned char Command)	//向LCD写入一个字节的命令
{
	LCDBusyWait();
	rs=0;
	P0=Command;
	e=1;
	e=0;
}
unsigned char ChangeAddress(unsigned char StartAddress)
{
	switch(StartAddress)
	{
		case 0x87:WriteLCD_Command(0x90);StartAddress=0x90;break;
		case 0x8F:WriteLCD_Command(0x98);StartAddress=0x98;break;
		case 0x97:WriteLCD_Command(0x88);StartAddress=0x88;break;
		default:StartAddress+=1;
	}
	return StartAddress;
}
unsigned char LCDBusyWait()							//等待LCD就绪
{
	unsigned char Status;
	rs=0;
	rw=1;
	P0=0xFF;
	e=1;
	Status=P0;
	e=0;
	while(Status & 0x80)
	{
   		e=1;
		Status=P0;
		e=0;
	}
	rw=0;
	return Status;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -