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

📄 lcd_driver_user.c

📁 MzT24_Driver_C8051彩屏液晶驱动
💻 C
字号:
//========================================================================
//========================================================================
// 文件名: LCD_Driver_User.c
// 作  者: Xinqiang Zhang(email: xinqiang@Mzdesign.com.cn)
// 日  期: 2007/04/10
// 描  述: MzT24-1 TFT LCD模块底层接口程序集(C语言版本)  for C8051F020
//			
//
// 参  考: 请参考具体显示器的硬件描述说明书或者是DataSheet,并以此来编写底
//			层接口驱动程序,以及LCD的初始化代码
// 版  本:
//      2007/04/10      First version    Mz Design
//========================================================================
#include "LCD_PortConfig.h"
#include "LCD_Config.h"

//========================================================================
// 函数: void LCD_DataWrite(unsigned char Data)
// 描述: 写一个字的显示数据至LCD中的显示缓冲RAM当中
// 参数: Data 写入的数据 
// 返回: 无
// 备注: 无
// 版本:
//      2007/04/10      First version
//========================================================================
void LCD_DataWrite(unsigned int Data)
{
//	*COM_W_ADDR = 0x00;
//	*COM_W_ADDR = 0x22;
//	*DAT_W_ADDR = (unsigned char)(Data>>8);
//	*DAT_W_ADDR = (unsigned char)(Data&0x00ff);
	LCD_RS = 0;
	LCD_CS = 0;
	LCD_WR = 0;
	P1 = 0;
	LCD_WR = 1;
	LCD_WR = 0;
	P1 = 0x22;
	LCD_WR = 1;
	LCD_RS = 1;
	LCD_WR = 0;
	P1 = Data>>8;
	LCD_WR = 1;
	LCD_WR = 0;
	P1 = (unsigned char)(Data&0x00ff);
	LCD_WR = 1;
	LCD_CS = 1;
}
//========================================================================
// 函数: unsigned char LCD_DataRead(void)
// 描述: 从LCD中的显示缓冲RAM当中读一个字节的显示数据
// 参数: 无  
// 返回: 读出的数据
// 备注: 无
// 版本:
//      2007/04/10      First version
//========================================================================
unsigned int LCD_DataRead(void)
{
	unsigned int Read_Data;
//	*COM_W_ADDR = 0x00;
//	*COM_W_ADDR = 0x00;
//	Read_Data = *COM_W_ADDR;//*DAT_R_ADDR;
//	Read_Data = Read_Data<<8;
//	Read_Data |= *COM_W_ADDR;//*DAT_R_ADDR;
	LCD_CS = 0;
	LCD_RS = 0;
	LCD_RD = 0;
	LCD_RD = 1;
	LCD_RD = 0;
	LCD_RD = 1;
	P1 = 0xff;
	LCD_RD = 0;
	_nop_();
	Read_Data = P1;
	Read_Data = Read_Data<<8;
	LCD_RD = 1;
	P1 = 0xff;
	LCD_RD = 0;
	_nop_();
	Read_Data |= P1;
	LCD_RD = 1;
	LCD_CS = 1;
	return Read_Data;
}
//========================================================================
// 函数: void LCD_RegWrite(unsigned char Reg_Addr,unsigned int Data)
// 描述: 写一个字节的数据至LCD中的控制寄存器当中
// 参数: Reg_Addr 	寄存器地址
//		 Data 		写入的数据 
// 返回: 无
// 备注: 
// 版本:
//      2007/04/10      First version
//========================================================================
void LCD_RegWrite(unsigned char Reg_Addr,unsigned int Data)
{
//	*COM_W_ADDR = 0x00;
//	*COM_W_ADDR = Reg_Addr;
//	*DAT_W_ADDR = Data>>8;
//	*DAT_W_ADDR = (unsigned char)(Data&0x00ff);
	LCD_RS = 0;
	LCD_CS = 0;
	LCD_WR = 0;
	P1 = 0;
	LCD_WR = 1;
	LCD_WR = 0;
	P1 = Reg_Addr;
	LCD_WR = 1;
	LCD_RS = 1;
	LCD_WR = 0;
	P1 = Data>>8;
	LCD_WR = 1;
	LCD_WR = 0;
	P1 = (unsigned char)(Data&0x00ff);
	LCD_WR = 1;
	LCD_CS = 1;
}
//========================================================================
// 函数: void LCD_Reg22(void)
// 描述: MzT24-1 LCD模块当中,依据控制器SPFD5408的特性,将操作寄存器指向数
//		据寄存器R22h当中,以便于后面的数据连续写操作
// 参数:
// 返回: 无
// 备注: 
// 版本:
//      2007/03/15      First version
//========================================================================
void LCD_Reg22(void)
{
	LCD_RS = 0;
	LCD_CS = 0;
	LCD_WR = 0;
	P1 = 0;
	LCD_WR = 1;
	LCD_WR = 0;
	P1 = 0x22;
	LCD_WR = 1;
	LCD_CS = 1;
}
//========================================================================
// 函数: void Fill_Dot_LCD(unsigned int Color)
// 描述: 填充一个点到LCD显示缓冲RAM当中,而不管当前要填充的地址如何
// 参数: Color 		要填充的点的颜色 
// 返回: 无
// 备注: 
// 版本:
//      2007/04/10      First version
//========================================================================
void Fill_Dot_LCD(unsigned int Color)
{
	LCD_RS = 1;
	LCD_CS = 0;
	LCD_WR = 0;
	P1 = Color>>8;
	LCD_WR = 1;
	LCD_WR = 0;
	P1 = (unsigned char)(Color&0x00ff);
	LCD_WR = 1;
	LCD_CS = 1;
}
//========================================================================
// 函数: void Write_Dot_LCD(int x,int y,unsigned int i)
// 描述: 在LCD的真实坐标系上的X、Y点绘制填充色为i的点
// 参数: x 		X轴坐标
//		 y 		Y轴坐标
//		 i 		要填充的点的颜色 
// 返回: 无
// 备注: 
// 版本:
//      2007/04/10      First version
//========================================================================
void Write_Dot_LCD(unsigned char x,unsigned int y,unsigned int i)
{

	LCD_RegWrite(0x20,x);
	LCD_RegWrite(0x21,y);
	LCD_DataWrite(i);
}

//========================================================================
// 函数: void Clear_Dot_LCD(int x,int y)
// 描述: 清除在LCD的真实坐标系上的X、Y点(清除后该点为黑色)
// 参数: x 		X轴坐标
//		 y 		Y轴坐标
// 返回: 无
// 备注: 
// 版本:
//      2006/10/15      First version
//========================================================================
void Clear_Dot_LCD(int x,int y)
{
	x = y;//无意义,仅为了不提警告
}
//========================================================================
// 函数: unsigned int Get_Dot_LCD(int x,int y)
// 描述: 获取在LCD的真实坐标系上的X、Y点上的当前填充色数据
// 参数: x 		X轴坐标
//		 y 		Y轴坐标
// 返回: 该点的颜色
// 备注: 
// 版本:
//      2007/04/10      First version
//========================================================================
unsigned int Get_Dot_LCD(int x,int y)
{
	unsigned int Read_Data;
	LCD_RegWrite(0x20,x);
	LCD_RegWrite(0x21,y);
	LCD_Reg22();
	Read_Data = LCD_DataRead();
	return Read_Data;
}
//========================================================================
// 函数: void Set_Dot_Addr_LCD(int x,int y)
// 描述: 设置在LCD的真实坐标系上的X、Y点对应的RAM地址
// 参数: x 		X轴坐标
//		 y 		Y轴坐标
// 返回: 无
// 备注: 仅设置当前操作地址,为后面的连续操作作好准备
// 版本:
//      2007/04/10      First version
//========================================================================
void Set_Dot_Addr_LCD(int x,int y)
{
	LCD_RegWrite(0x20,x);
	LCD_RegWrite(0x21,y);
	LCD_Reg22();
}
//========================================================================
// 函数: void LCD_Fill(unsigned int Data)
// 描述: 会屏填充以Data的数据至各点中
// 参数: Data   要填充的颜色数据
// 返回: 无
// 备注: 仅在LCD初始化程序当中调用
// 版本:
//      2006/10/15      First version
//========================================================================
void LCD_Fill(unsigned int Data)
{
	unsigned int data i;
	unsigned char data j;
	Set_Dot_Addr_LCD(0,0);
	for(i=0;i<320;i++)
	{
		for(j=0;j<240;j++)
		{
			Fill_Dot_LCD(Data);
		}
	}
}
//========================================================================
// 函数: void LCD_Fill_s(unsigned int Number,unsigned int Color)
// 描述: 连续填充以Color色调的Number个点
// 参数: Number 填充的数量    Color  像素点的颜色  
// 返回:
// 备注:
// 版本:
//      2006/10/15      First version
//========================================================================
void LCD_Fill_s(unsigned int Number,unsigned int Color)
{
	LCD_Reg22();
	while(Number!=0)
	{
		Fill_Dot_LCD(Color);
		Number--;
	}
}
//========================================================================
// 函数: void LCD_Init(void)
// 描述: LCD初始化程序,在里面会完成LCD初始所需要设置的许多寄存器,具体如果
//		 用户想了解,建议查看DataSheet当中各个寄存器的意义
// 参数: 无 
// 返回: 无
// 备注:
// 版本:
//      2007/04/10      First version
//      2007/06/27      V1.01
//========================================================================
//延时程序
void TimeDelay(int Time)
{
	int i;
	while(Time > 0)
	{
		for(i = 0;i < 1800;i++)
		{
			_nop_();
		}
		Time --;
	}
}
void LCD_Init(void)
{
	//LCD驱动所使用到的端口的初始化
    LCD_Reset = 0;					//复位操作
	TimeDelay(400);
	LCD_Reset = 1;
	//LCD 寄存器初始化
    TimeDelay(20);

	LCD_RegWrite(0x0001,0x0100);				//Driver Output Contral Register 
   	LCD_RegWrite(0x0002,0x0700);    //0x0701	//LCD Driving Waveform Contral
  	LCD_RegWrite(0x0003,0x1030);				//Entry Mode设置
  												//指针从左至右自上而下的自动增模式
  												//Normal Mode(Window Mode disable)
  												//RGB格式
  												//16位数据2次传输的8总线设置
   	LCD_RegWrite(0x0004,0x0000);				//Scalling Control register
   	LCD_RegWrite(0x0008,0x0207);				//Display Control 2
   	LCD_RegWrite(0x0009,0x0000);				//Display Control 3
   	LCD_RegWrite(0x000A,0x0000);				//Frame Cycle Control
   	LCD_RegWrite(0x000C,0x0000);				//External Display Interface Control 1
    LCD_RegWrite(0x000D,0x0000);				//Frame Maker Position
   	LCD_RegWrite(0x000F,0x0000);				//External Display Interface Control 2
   	TimeDelay(100);
   	LCD_RegWrite(0x0007,0x0101);				//Display Control
   	TimeDelay(100);
   	LCD_RegWrite(0x0010,0x16B0);    //0x14B0	//Power Control 1
   	LCD_RegWrite(0x0011,0x0001);    //0x0007	//Power Control 2
   	LCD_RegWrite(0x0017,0x0001);    //0x0000	//Power Control 3
   	LCD_RegWrite(0x0012,0x0138);    //0x013B	//Power Control 4
   	LCD_RegWrite(0x0013,0x0800);    //0x0800	//Power Control 5
   	LCD_RegWrite(0x0029,0x0009);				//NVM read data 2
   	LCD_RegWrite(0x002a,0x0009);				//NVM read data 3
   	LCD_RegWrite(0x00a4,0x0000);

   	LCD_RegWrite(0x0050,0x0000);				//设置操作窗口的X轴开始列
   	LCD_RegWrite(0x0051,0x00EF);				//设置操作窗口的X轴结束列
   	LCD_RegWrite(0x0052,0x0000);				//设置操作窗口的Y轴开始行
   	LCD_RegWrite(0x0053,0x013F);				//设置操作窗口的Y轴结束行
   	LCD_RegWrite(0x0060,0x2700);				//Driver Output Control
   												//设置屏幕的点数以及扫描的起始行
   	LCD_RegWrite(0x0061,0x0001);				//Driver Output Control
   	LCD_RegWrite(0x006A,0x0000);				//Vertical Scroll Control
   	
   	LCD_RegWrite(0x0080,0x0000);				//Display Position – Partial Display 1
   	LCD_RegWrite(0x0081,0x0000);				//RAM Address Start – Partial Display 1
   	LCD_RegWrite(0x0082,0x0000);				//RAM address End - Partial Display 1
   	LCD_RegWrite(0x0083,0x0000);				//Display Position – Partial Display 2
   	LCD_RegWrite(0x0084,0x0000);				//RAM Address Start – Partial Display 2
   	LCD_RegWrite(0x0085,0x0000);				//RAM address End – Partail Display2
   	LCD_RegWrite(0x0090,0x0013);				//Frame Cycle Control
   	LCD_RegWrite(0x0092,0x0000);				//Panel Interface Control 2
   	LCD_RegWrite(0x0093,0x0003);				//Panel Interface control 3
   	LCD_RegWrite(0x0095,0x0110);				//Frame Cycle Control
   	LCD_RegWrite(0x0007,0x0173);

	LCD_Fill(LCD_INITIAL_COLOR);  

}

⌨️ 快捷键说明

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