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

📄 lcd_driver_user.c

📁 MzT24-2模块驱动例程(Keil LPC22XX)320*240TFT液晶屏驱动程序
💻 C
字号:
//========================================================================
// 文件名: LCD_Driver_User.c
// 作  者: Xinqiang Zhang(email: Xinqiang@Mzdesign.com.cn)
//			www.Mzdesign.com.cn
// 日  期: 2008/06/11
// 描  述: 底层接口驱动扩展程序集
//
// 参  考: 请参考具体显示器的硬件描述说明书或者是DataSheet,并以此来编写底
//			层接口驱动程序,以及LCD的初始化代码
// 版  本:
//      2007/02/25      First version    Mz Design
//		2008/06/11		V2.0			 Mzdesign
// 注  意: 
//			该驱动程序当中有很多已经被屏蔽掉的子程序,用户可根据自己的应用
//			取消屏障并作一定的修改(如果可能的话)
//			该文件与LCD的特性有关,为MzDesign通用版LCD驱动的V2.0版本,内含的
//			函数是标准的函数,每款LCD对应的通用版LCD驱动程序包都是一样的,只
//			是会针对不同的LCD模块会有一些区别,用户可以参考我们介绍V1.0版本
//			驱动的书<LCD驱动显控原理>.
// 相  关: 本例为针对MzDesign的MzT24 320X240点TFT屏作的移植改去,适用于NXP
//			的LPC21XX以及LPC22XX系列ARM7
//========================================================================
#include "LCD_Config.h"
#include "LCD_PortConfig.h"

//========================================================================
// 函数: void LCD_DataWrite(unsigned int Data)
// 描述: 写一个字节的显示数据至LCD中的显示缓冲RAM当中
// 参数: Data 写入的数据 
// 返回: 无
// 备注: Mz 通用版LCD驱动程序 标准子函数
// 版本:
//      2007/01/09      First version
//========================================================================
//__inline void LCD_Data_Write(LCDBYTE Dat);
/*
void LCD_DataWrite(LCDBYTE Dat)
{
//	LCD_A0_SET();
	LCD_Ctrl_Set(LCD_A0+LCD_RD);
	LCD_CS_CLR();
	LCD_Data_BUS_Clr();
	LCD_Data_BUS_Set((unsigned char)(Dat>>8));
	LCD_RW_CLR();
	LCD_RW_SET();  				//
	LCD_Data_BUS_Clr();
	LCD_Data_BUS_Set((unsigned char)Dat);
	LCD_RW_CLR();
	LCD_RW_SET();  				//
	LCD_CS_SET();
}	*/	   
//========================================================================
// 函数: LCDBYTE LCD_DataRead(void)
// 描述: 从LCD中的显示缓冲RAM当中读一个字节的显示数据
// 参数: 无  
// 返回: 读出的数据,
// 备注: Mz 通用版LCD驱动程序 标准子函数 
// 版本:
//      2007/01/09      First version
// 注意: 
//========================================================================

LCDBYTE LCD_DataRead(void)
{
    LCDBYTE Read_Data;
	LCD_Data_In();
	LCD_Ctrl_Set(LCD_A0);
	LCD_CS_CLR();
	LCD_RD_CLR();
	LCD_RD_SET();
	LCD_RD_CLR();
	LCD_RD_SET();
	LCD_RD_CLR();
	Read_Data = LCD_Data_Read();
	Read_Data = Read_Data<<8;
	LCD_RD_SET();
	LCD_RD_CLR();
	Read_Data |= LCD_Data_Read();
	LCD_Ctrl_Set(LCD_CS+LCD_RD);
  //  Read_Data = LCD_DAT_R;
//	Read_Data = LCD_DAT_R;
//	Read_Data = ((LCDBYTE)LCD_DAT_R)<<8;
//	Read_Data |= LCD_DAT_R;
	LCD_Data_Out();
	return Read_Data;
}	
//========================================================================
// 函数: void LCD_RegWrite(LCDBYTE Command)
// 描述: 写一个字节的数据至LCD中的控制寄存器当中
// 参数: Command		写入的数据,低八位有效(byte) 
// 返回: 无
// 备注: Mz 通用版LCD驱动程序 标准子函数
// 版本:
//      2007/01/09      First version
//========================================================================
 /*
void LCD_RegWrite(LCDBYTE Command)
{
//	LCD_RD_SET();
	LCD_Ctrl_Clr(LCD_A0|LCD_CS);
	LCD_RW_CLR();
	LCD_RW_SET(); 

	LCD_Data_BUS_Clr();
	LCD_Data_BUS_Set(Command);

	LCD_RW_CLR();
	LCD_RW_SET();  				//
	LCD_CS_SET();
} */ 
//========================================================================
// 函数: LCDBYTE LCD_ReadStatus(void)
// 描述: 读取LCD模块的指定状态位
// 参数: 无
// 返回: 读取到的状态位
// 备注: Mz 通用版LCD驱动程序 标准子函数
// 版本:
//      2007/01/09      First version
//========================================================================
LCDBYTE LCD_ReadStatus(void)
{
	return 1;
}
//========================================================================
// 函数: void LCD_TestStatus(LCDBYTE bitMatch)
// 描述: 测试LCD模块的指定状态位
// 参数: bitMatch
// 返回: 如测试有效则返回1  如超时则返回0
// 备注: Mz 通用版LCD驱动程序 标准子函数
// 版本:
//      2007/01/09      First version
//========================================================================
LCDBYTE LCD_TestStatus(LCDBYTE bitMatch)
{
	return 1;					//return 1  as test status bit ok
}
//========================================================================
// 函数: void Write_Dot_LCD(int x,int y,unsigned int i)
// 描述: 在LCD的真实坐标系上的X、Y点绘制填充色为i的点
// 参数: x 		X轴坐标
//		 y 		Y轴坐标
//		 i 		要填充的点的颜色 
// 返回: 无
// 备注: Mz 通用版LCD驱动程序 标准子函数
// 版本:
//      2006/10/15      First version
//		2007/01/09		V1.2 
//========================================================================
void Write_Dot_LCD(DOTBYTE x,DOTBYTE y,LCDBYTE i)
{
	LCD_RegWrite(0x20);
	LCD_DataWrite(x);
	LCD_RegWrite(0x21);
	LCD_DataWrite(y);
	LCD_RegWrite(0x22);
	LCD_DataWrite(i);
}
/*
//========================================================================
// 函数: void Clear_Dot_LCD(WORD x,WORD y)
// 描述: 清除在LCD的真实坐标系上的X、Y点
// 参数: x 		X轴坐标
//		 y 		Y轴坐标
// 返回: 无
// 备注: 暂不使用该函数
// 版本:
//      2006/10/15      First version
//========================================================================
void Clear_Dot_LCD(WORD x,WORD y)
{
	//可根据自己的需要填写代码
	x = y;						//无意义,仅为了让系统不提示警告
}  */
//========================================================================
// 函数: unsigned int Get_Dot_LCD(int x,int y)
// 描述: 获取在LCD的真实坐标系上的X、Y点上的当前填充色数据
// 参数: x 		X轴坐标
//		 y 		Y轴坐标
// 返回: 该点的颜色
// 备注: 暂不使用该函数
// 版本:
//      2006/10/15      First version
//========================================================================
LCDBYTE Get_Dot_LCD(DOTBYTE x,DOTBYTE y)
{
	LCDBYTE Read_Data;
	//可根据自己的需要填写代码
	LCD_RegWrite(0x20);
	LCD_DataWrite(x);
	LCD_RegWrite(0x21);
	LCD_DataWrite(y);
	LCD_RegWrite(0x22);
	Read_Data = LCD_DataRead();							//
	return Read_Data;
}

//========================================================================
// 函数: void Set_Dot_Addr_LCD(int x,int y)
// 描述: 设置在LCD的真实坐标系上的X、Y点对应的RAM地址
// 参数: x 		X轴坐标
//		 y 		Y轴坐标
// 返回: 无
// 备注: 仅设置当前操作地址,为后面的连续操作作好准备
//		 Mz 通用版LCD驱动程序 标准子函数
// 版本:
//      2006/10/15      First version
//		2007/01/09		V1.2 
//========================================================================
void Set_Dot_Addr_LCD(DOTBYTE x,DOTBYTE y)
{
	LCD_RegWrite(0x20);
	LCD_DataWrite(x);
	LCD_RegWrite(0x21);
	LCD_DataWrite(y);
	LCD_RegWrite(0x22);
}

//========================================================================
// 函数: void LCD_Fill_s(WORD Number,LCDBYTE Color)
// 描述: 连续填充以Color色调的Number个点
// 参数: Number 填充的数量    Color  像素点的颜色  
// 返回:
// 备注: 该函数可能会使用到
// 版本:
//      2006/10/15      First version
//		2007/01/09		V1.2 
//========================================================================
void LCD_Fill_s(WORD Number,LCDBYTE Color)
{
	while(Number!=0)
	{
		LCD_DataWrite(Color);
		Number--;
	}
} 
//========================================================================
// 函数: void LCD_Fill(unsigned int Data)
// 描述: 会屏填充以Data的数据至各点中
// 参数: Data   要填充的颜色数据
// 返回: 无
// 备注: Mz 通用版LCD驱动程序 标准子函数
// 版本:
//      2006/10/15      First version
//		2007/01/09		V1.2 
//========================================================================
void LCD_Fill(LCDBYTE Data)
{
	DOTBYTE i,j=0;
	DOTBYTE uiTemp;  
	uiTemp = (unsigned int)Dis_Y_MAX;
	Set_Dot_Addr_LCD(0,0);
	for(i=0;i<=uiTemp;i++)								//往LCD中填充初始化的显示数据
	{
		for(j=0;j<=Dis_X_MAX;j++)
		{
			LCD_DataWrite(Data);
		//	LCD_DataWrite((unsigned char)Data);
		}
	}
}
//========================================================================
// 函数: void LCD_PortInit(void)
// 描述: 与LCD连接的端口初始化代码
// 参数: 无  
// 返回: 无
// 备注: Mz 通用版LCD驱动程序 标准子函数
// 版本:
//      2007/01/09      First version
// 注意: 
//========================================================================
void LCD_PortInit(void)
{
	LCD_Ctrl_GPIO();
	LCD_Ctrl_Out();
	LCD_Ctrl_Set(LCD_CS+LCD_RE+LCD_A0+LCD_RW+LCD_RD);

	LCD_Data_GPIO();
	LCD_Data_Out();
}
//========================================================================
// 函数: void LCD_Init(void)
// 描述: LCD初始化程序,在里面会完成LCD初始所需要设置的许多寄存器,具体如果
//		 用户想了解,建议查看DataSheet当中各个寄存器的意义
// 参数: 无 
// 返回: 无
// 备注: Mz 通用版LCD驱动程序 标准子函数
// 版本:
//      2006/10/15      First version
//		2007/01/09		V1.2 
//========================================================================
//延时程序

void TimeDelay(WORD Time)
{
	WORD i;
	while(Time > 0)
	{
		for(i = 0;i < 800;i++)
		{
			;//__asm("nop");
		}
		Time --;
	}
}
unsigned short LCD_IndexAuto=0;
void LCD_Init(void)
{
	//LCD驱动所使用到的端口的初始化
	LCD_PortInit();
	//根据LCD显示的配置,设置LCD的数据地址指针自动增加特性
	if(LCD_XY_Switch==1)
	{
		LCD_IndexAuto |= 0x0008;
		if(LCD_X_Rev==0)
			LCD_IndexAuto |= 0x0020;
		else
			LCD_IndexAuto &= ~0x0020;
		if(LCD_Y_Rev==0)
			LCD_IndexAuto |= 0x0010;
		else
			LCD_IndexAuto &= ~0x0010;
	}
	else
	{
		LCD_IndexAuto &= ~0x0008;
		if(LCD_X_Rev==0)
			LCD_IndexAuto |= 0x0010;
		else
			LCD_IndexAuto &= ~0x0010;
		if(LCD_Y_Rev==0)
			LCD_IndexAuto |= 0x0020;
		else
			LCD_IndexAuto &= ~0x0020;
	}
	LCD_IndexAuto |= 0x1100;
	//end
	LCD_RE_CLR();
	TimeDelay(200);
	LCD_RE_SET();
	TimeDelay(20);	

	LCD_RegWrite(0x01);
	LCD_DataWrite(0x0100);				//Driver Output Contral Register 
   	LCD_RegWrite(0x02);
	LCD_DataWrite(0x0700);    //0x0701	//LCD Driving Waveform Contral
  	LCD_RegWrite(0x03);
	LCD_DataWrite(LCD_IndexAuto);//0x1030);				//Entry Mode设置
  												//指针从左至右自上而下的自动增模式
  												//Normal Mode(Window Mode disable)
  												//RGB格式
  												//16位数据2次传输的8总线设置
   	LCD_RegWrite(0x04);
	LCD_DataWrite(0x0000);				//Scalling Control register
   	LCD_RegWrite(0x08);
	LCD_DataWrite(0x0207);				//Display Control 2
   	LCD_RegWrite(0x09);
	LCD_DataWrite(0x0000);				//Display Control 3
   	LCD_RegWrite(0x0A);
	LCD_DataWrite(0x0000);				//Frame Cycle Control
   	LCD_RegWrite(0x0C);
	LCD_DataWrite(0x0000);				//External Display Interface Control 1
   	LCD_RegWrite(0x0D);
	LCD_DataWrite(0x0000);				//Frame Maker Position
   	LCD_RegWrite(0x0F);
	LCD_DataWrite(0x0000);				//External Display Interface Control 2
   	TimeDelay(20);
   	LCD_RegWrite(0x07);
	LCD_DataWrite(0x0101);				//Display Control
   	TimeDelay(20);
   	LCD_RegWrite(0x10);
	LCD_DataWrite(0x16B0);    //0x14B0	//Power Control 1
   	LCD_RegWrite(0x11);
	LCD_DataWrite(0x0001);    //0x0007	//Power Control 2
   	LCD_RegWrite(0x17);
	LCD_DataWrite(0x0001);    //0x0000	//Power Control 3
   	LCD_RegWrite(0x12);
	LCD_DataWrite(0x0138);    //0x013B	//Power Control 4
   	LCD_RegWrite(0x13);
	LCD_DataWrite(0x0800);    //0x0800	//Power Control 5
   	LCD_RegWrite(0x29);
	LCD_DataWrite(0x0009);				//NVM read data 2
   	LCD_RegWrite(0x2a);
	LCD_DataWrite(0x0009);				//NVM read data 3
   	LCD_RegWrite(0xa4);
	LCD_DataWrite(0x0000);

   	LCD_RegWrite(0x50);
	LCD_DataWrite(0x0000);				//设置操作窗口的X轴开始列
   	LCD_RegWrite(0x51);
	LCD_DataWrite(0x00EF);				//设置操作窗口的X轴结束列
   	LCD_RegWrite(0x52);
	LCD_DataWrite(0x0000);				//设置操作窗口的Y轴开始行
   	LCD_RegWrite(0x53);
	LCD_DataWrite(0x013F);				//设置操作窗口的Y轴结束行
   	LCD_RegWrite(0x60);
	LCD_DataWrite(0xA700);				//Driver Output Control
   												//设置屏幕的点数以及扫描的起始行
   	LCD_RegWrite(0x61);
	LCD_DataWrite(0x0001);				//Driver Output Control
   	LCD_RegWrite(0x6A);
	LCD_DataWrite(0x0000);				//Vertical Scroll Control
   	
   	LCD_RegWrite(0x80);
	LCD_DataWrite(0x0000);				//Display Position – Partial Display 1
   	LCD_RegWrite(0x81);
	LCD_DataWrite(0x0000);				//RAM Address Start – Partial Display 1
   	LCD_RegWrite(0x82);
	LCD_DataWrite(0x0000);				//RAM address End - Partial Display 1
   	LCD_RegWrite(0x83);
	LCD_DataWrite(0x0000);				//Display Position – Partial Display 2
   	LCD_RegWrite(0x84);
	LCD_DataWrite(0x0000);				//RAM Address Start – Partial Display 2
   	LCD_RegWrite(0x85);
	LCD_DataWrite(0x0000);				//RAM address End – Partail Display2
   	LCD_RegWrite(0x90);
	LCD_DataWrite(0x0013);				//Frame Cycle Control
   	LCD_RegWrite(0x92);
	LCD_DataWrite(0x0000);				//Panel Interface Control 2
   	LCD_RegWrite(0x93);
	LCD_DataWrite(0x0003);				//Panel Interface control 3
   	LCD_RegWrite(0x95);
	LCD_DataWrite(0x0110);				//Frame Cycle Control
//   LCD_RegWrite(0x0097,0x0000);
//   LCD_RegWrite(0x0098,0x0000);
 //  	LCD_RegWrite(0x00F0,0x5408);
 //  	LCD_RegWrite(0x00F4,0x0077);
 //  	LCD_RegWrite(0x00F3,0x000c);
   	LCD_RegWrite(0x07);
	LCD_DataWrite(0x0173);
		
	LCD_Fill(LCD_INITIAL_COLOR);
}

⌨️ 快捷键说明

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