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

📄 lcd.c

📁 适用于LCD12864
💻 C
字号:
/********************************************************/
/*         液晶显示模块控制函数定义(模拟端口方式)		*/
/* 液晶显示屏大小:128*64					*/
/* 控制器:HD61202/3					*/
/* 控制方式:单片机端口线模拟时序控制			*/
/* 作者:倪晓军     最后修改:2005-11-4 13:43		*/
/********************************************************/

#include <reg52all.h>
#include "LCD.H"

unsigned char CmdWord = 0xe0;

/********************************************************/
/* 背光显示控制						*/
/* 参数:0/1:熄灭/点亮  					*/
/********************************************************/
void LCD_BackLight(int bl)
{
	if(bl)
		CmdWord &= 0x7f;
	else
		CmdWord |= 0x80;
	
	CPort = CmdWord;
}

/********************************************************/
/* 等待液晶显示屏复位                                   */
/* 参数:n  表示等待哪个控制器复位,0为第1块,1为第2块  */
/********************************************************/
void LCD_WaitIdle(unsigned char n)
{
	if(n==0)
	{
		CmdWord &= (~DI);		// DI=0
		CmdWord |= (RW | DBusOE);	// RW=1,read
		CPort = CmdWord;
		CmdWord |= CS0;			// CS0=1
		CPort = CmdWord;
		CmdWord |= E;			// E=1;
		CPort = CmdWord;
		while(P13);
		CmdWord &= (~E);
		CPort = CmdWord;
		CmdWord &= (~CS0);
		CPort = CmdWord;
	}
	else
	{
		CmdWord &= (~DI);
		CmdWord |= (RW | DBusOE);
		CPort = CmdWord;
		CmdWord |= CS1;
		CPort = CmdWord;
		CmdWord |= E;
		CPort = CmdWord;
		while(P13);
		CmdWord &= (~E);
		CPort = CmdWord;
		CmdWord &= (~CS1);
		CPort = CmdWord;
	}
}  

/********************************************************/
/* 向液晶显示屏写入命令字                               */
/* 参数:n  表示向哪个控制器写入,0为第1块,1为第2块    */
/*       Cmd 命令字                                     */
/********************************************************/
void LCD_WriteCommand(unsigned char n,unsigned char Cmd)
{
	LCD_WaitIdle(n);

	DBus = Cmd;

	if(n==0)
	{
		CmdWord	&= (~(DI | RW | DBusOE));
		CPort = CmdWord;
		CmdWord	|= CS0;
		CPort	= CmdWord;
		CmdWord	|= E;
		CPort	= CmdWord;
		CmdWord	&= (~E);
		CPort	= CmdWord;
		CmdWord &= (~CS0);
		CPort = CmdWord;
		CmdWord	|= DBusOE;
		CPort	= CmdWord;
	}
	else
	{
		CmdWord	&= (~(DI | RW | DBusOE));
		CPort = CmdWord;
		CmdWord	|= CS1;
		CPort	= CmdWord;
		CmdWord	|= E;
		CPort	= CmdWord;
		CmdWord	&= (~E);
		CPort	= CmdWord;
		CmdWord &= (~CS1);
		CPort = CmdWord;
		CmdWord	|= DBusOE;
		CPort	= CmdWord;
	}	
}

/********************************************************/
/* 液晶显示屏复位                                       */
/********************************************************/
void LCD_Reset(void)
{
	int i,j;
	
	CmdWord &= (~LCDRST);
	CPort = CmdWord;
	
	for(i=0;i<20;i++) for(j=0;j<10000;j++);
	
	CmdWord |= LCDRST;
	CPort = CmdWord;

	for(i=0;i<20;i++) for(j=0;j<10000;j++);
	
	LCD_WriteCommand(0,0x3f);    /* 打开LCD显示 */
	LCD_WriteCommand(1,0x3f);
  
	LCD_WriteCommand(0,0xc0);    /* 设置起始显示行=0 */
	LCD_WriteCommand(1,0xc0);
}

/*********************************************************/
/* 设置X地址(页地址,对应显示屏的行,8行一组)函数        */
/* 参数:chip 控制器芯片号; x 页地址,取值范围0~7        */
/*********************************************************/
void LCD_SetXAddress(unsigned char chip, unsigned char x)
{
	if( chip == 0)
	{
		LCD_WaitIdle(0);
		LCD_WriteCommand(0,0xB8 | (x & 0x07));
	}
	else
	{
		LCD_WaitIdle(1);
		LCD_WriteCommand(1,0xB8 | (x & 0x07));
	}
}

/*********************************************************/
/* 设置Y地址函数(列地址,对应显示屏的列)                 */
/* 参数:chip 控制器芯片号; y 列地址,取值范围0~63       */
/*********************************************************/
void LCD_SetYAddress(unsigned char chip, unsigned char y)
{
	if(chip == 0)
	{
		LCD_WaitIdle(0);
		LCD_WriteCommand(0,0x40 | (y & 0x3F));
	}
	else
	{
		LCD_WaitIdle(1);
		LCD_WriteCommand(1,0x40 | (y & 0x3F));
	}
}

/********************************************************/
/* 向液晶显示屏写入数据                                 */
/* 参数:c  待写入数据                                  */
/*       X  x方向地址,范围(0~127)                      */
/*       Y  y方向地址,范围(0~7)[显示屏左上角为参考点]  */
/********************************************************/
void LCD_WriteData(unsigned char c,unsigned char X,unsigned char Y)
{
	if(X<64)                             /* 数据应写入第1块控制器 */
	{
		LCD_SetXAddress(0,Y);
		LCD_SetYAddress(0,X);
		LCD_WaitIdle(0);
		DBus = c;
		CmdWord |= DI;
		CmdWord &= ~(RW | DBusOE);
		CPort = CmdWord;
		CmdWord |= CS0;
		CPort = CmdWord;
		CmdWord |= E;
		CPort = CmdWord;
		CmdWord &= (~E);
		CPort = CmdWord;
		CmdWord &= (~CS0);
		CPort = CmdWord;
		CmdWord |= DBusOE;
		CPort = CmdWord;
	}
	else                                 /* 数据写入第2块控制器 */
	{
		LCD_SetXAddress(1,Y);
		LCD_SetYAddress(1,X-64);
		LCD_WaitIdle(1);
		DBus = c;
		CmdWord |= DI;
		CmdWord &= ~(RW | DBusOE);
		CPort = CmdWord;
		CmdWord |= CS1;
		CPort = CmdWord;
		CmdWord |= E;
		CPort = CmdWord;
		CmdWord &= (~E);
		CPort = CmdWord;
		CmdWord &= (~CS1);
		CPort = CmdWord;
		CmdWord |= DBusOE;
		CPort = CmdWord;
	}
}

/*********************************************************/
/* 显示屏清屏并填充字符                                  */
/* 参数:c 填充字符的ASCII码                             */
/*********************************************************/
void LCD_ClrScr(unsigned char c)
{
	unsigned char x,y;
	
	for(x=0;x<=7;x++)
	{
		for(y=0;y<=127;y++)
		{
			LCD_WriteData(c,y,x);
			LCD_WriteData(c,y,x);
		}
	}
}
    

⌨️ 快捷键说明

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