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

📄 lcd.h

📁 此程序是我用AT89S52单片机来控制显示屏FYD12864,采用C语言编写的可以显示图形,我调试了一周,在此和大家一起分享
💻 H
字号:
#include "main.h"

#define LCD_Data P0
sbit	LCD_RS		=P1^3;
sbit	LCD_WR		=P1^4;
sbit	LCD_E		=P1^5;
sbit    PSB         =P1^6;
/*
返回值Status:	当前地址计数器的值.
*/

unsigned char LCDBusyWait()							//等待LCD就绪
{
	unsigned char Status;
	LCD_RS=0;
	LCD_WR=1;
	LCD_Data=0xFF;
	LCD_E=1;
	Status=LCD_Data;
	LCD_E=0;
	while(Status & 0x80)
	{
   		LCD_E=1;
		Status=LCD_Data;
		LCD_E=0;
	}
	LCD_WR=0;
	return Status;
}

void WriteLCD_Data(unsigned char Data)			//向LCD写入一个字节的数据
{
	LCDBusyWait();
	LCD_RS=1;
	LCD_Data = Data;
	LCD_E=1;
	LCD_E=0;
}

void WriteLCD_Command(unsigned char Command)	//向LCD写入一个字节的命令
{
	LCDBusyWait();
	LCD_RS=0;
	LCD_Data=Command;
	LCD_E=1;
	LCD_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;
}

/*
WriteLCD 从LCD输出一个字符串:
	StartAddress为起始地址;
	Size为字符串大小;
	Size==0 时由程序自己判断字符串结束标志,否则输出 Size 个字符,不够则填充空格;
	Charactors为要求输出的字符串;
*/
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
			{
//				unsigned char k;
				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 WriteLCDPICTURE 从LCD输出一副图象
  StartAddressY是列的地址
  StartAddressX是行的地址
  tab是要显示的内容
*/
 void WriteLCD_Picture(unsigned char StartAddressY,unsigned char StartAddressX,
                      unsigned char *tab,unsigned char biaozhi)

{  
   unsigned char a;
   unsigned char b;
   //WriteLCD_Command(0x0C);	  //显示打开,光标关,反白显示关
   //WriteLCD_Command(0x01);	  //清除屏幕显示,将DDRAM的地址计数器归零
    for(a=0;a<32;a++)
	   {   if ( biaozhi==0)
	            { 	    
				    WriteLCD_Command(StartAddressY);
				    StartAddressY+=1;	
			        WriteLCD_Command(StartAddressX);
				   for(b=0;b<16;b++)
				         {
					         WriteLCD_Data(tab[b+a*16]);
					      }
			     }
	       else
	          {
		     	
		            WriteLCD_Command(StartAddressY);
				    StartAddressY+=1;	
			        WriteLCD_Command(StartAddressX);
				     for(b=0;b<16;b++)
				       {
					     WriteLCD_Data(tab[b+32*16+a*16]);
					    }
 			     
		
		       }
	  }
  }
 /************************显示自定义的突片***********************/
void WriteLCD_CustomPicture(unsigned char Line_StartAddress,unsigned char Row_StartAddress,
                      unsigned char *tab,unsigned char biaozhi)

{  
   unsigned char a;
   unsigned char b;
   //WriteLCD_Command(0x0C);	  //显示打开,光标关,反白显示关
   //WriteLCD_Command(0x01);	  //清除屏幕显示,将DDRAM的地址计数器归零
    for(a=0;a<16;a++)
	   {   if ( biaozhi==0)
	            { 	    
				    WriteLCD_Command(Line_StartAddress);
				    Line_StartAddress+=1;	
			        WriteLCD_Command(Row_StartAddress);
				   for(b=0;b<2;b++)
				         {
					         WriteLCD_Data(tab[b+a*2]);
					      }
			     }

	      /* else
	          {
		     	
		            WriteLCD_Command(StartAddressY);
				    StartAddressY+=1;	
			        WriteLCD_Command(StartAddressX);
				     for(b=0;b<16;b++)
				       {
					     WriteLCD_Data(tab[b+32*16+a*16]);
					    }
 			     
		
		       } */
	  }
  }


















void WriteLcd_Number_4bit(unsigned char Address_4bit,unsigned int Number4bit)
{
	unsigned char Number4_H;			//存放高2位
	unsigned char Number4_L;			 //存放低2位
	Number4_H = Number4bit / 100;
	Number4_L = Number4bit % 100;
	WriteLCD_Number(Address_4bit,Number4_H);
	WriteLCD_Number(Address_4bit + 1,Number4_L);
}




/*
//写入数字Number, Number为0-9999的四位数字
void WriteLCD_Number(unsigned char Address,unsigned char Number)
{
	if(Address) WriteLCD_Command(Address); 			//如果地址为0则自动接着原来的位置写.	否则按指定地址写
//	WriteLCD_Data((Number /1000) + 0x30);	   		//取出千位数字
	WriteLCD_Data((Number/100) + 0x30);	   	//取出百位数字
	WriteLCD_Data(Number % 100 / 10 + 0x30);	   		//取出十位数字
	WriteLCD_Data(Number % 10 + 0x30);	   	//取出个位数字
}
*/


//写入数字Number, Number为0-99的两位数字
void WriteLCD_Number(unsigned char Address,unsigned char Number)
{
	if(Address) WriteLCD_Command(Address); //如果地址为0则自动接着原来的位置写.	否则按指定地址写
	WriteLCD_Data((Number/10)+0x30);	   //取商,取出十位数字
	WriteLCD_Data((Number%10)+0x30);	   //取余,取出个位数字
}

/*写入半角的字符*/
void WriteLCD_CharNumber(unsigned char Address,unsigned char CharNumber)
{
	WriteLCD_Command(Address);
	WriteLCD_Data(CharNumber);
}



⌨️ 快捷键说明

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