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

📄 lcddrive_io.c

📁 TFTLCD驱动器在LPC2200上的使用
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************************
* 文件名:LCDDRIVE.C
* 功能:图形液晶240*320驱动(型号为ILI9320)。
* 说明:图形液晶采用ILI9320为LCD控制芯片,内带负压产生器,单3.3伏供电,并行接口(使用LPC2210驱动)。
* 硬件连接: 
*			     LCD				   	MCU
*		YU/XR/YD/XL(P1-4)		<===>  Not connected
*            D0-D15(P13-28) 	<===>  P0.4-19 (P0.0/1 used by UART0, P0.2/3 no up resistor)
*           /CS    (P9)			<===>  P0.21
*           RS     (P10)	 	<===>  P0.22
*           /WR    (P11)	 	<===>  P0.23
*           /RD    (P12)	 	<===>  P0.24
*           /RESET (P29)	 	<===>  P0.25
*           BackLight(P36/37) 	<===>  P0.29-30
*           (P7/8)				<===>  VCC3.3
*		 (P5/6/31-35/38)		<===>  GND
* Color Definition:
*	 White:    0x00000000
*        Black:    0x00FFFFFF
****************************************************************************************/
#include "config.h" 

TCOLOR  	gui_disp_buf[GUI_LCM_YMAX][GUI_LCM_XMAX];				// 声明GUI显示缓冲区

/* 定义LCM地址 */
#define  DRIVER_COM    	(*((volatile unsigned short *) 0x82000000))
#define  DRIVER_DAT    	(*((volatile unsigned short *) 0x82000002))
#undef	 LCD_Debug
#define  ColorMode 1    /*0 for 64k color, and 1 for 262k color*/ 
/***********************************************************************
*		LCD configuration
*
***********************************************************************/
#define		LCD_CS_L()		IO0CLR=(1<<21)
#define		LCD_CS_H()		IO0SET=(1<<21)
#define		LCD_RS_L()		IO0CLR=(1<<22)
#define		LCD_RS_H()		IO0SET=(1<<22)
#define		LCD_WR_L()		IO0CLR=(1<<23)
#define		LCD_WR_H()		IO0SET=(1<<23)
#define		LCD_RD_L()		IO0CLR=(1<<24)
#define		LCD_RD_H()		IO0SET=(1<<24)
#define		LCD_RST_L()		IO0CLR=(1<<25)
#define		LCD_RST_H()		IO0SET=(1<<25)
#define		LCD_LightOn()	IO0SET=(3<<29)
#define		LCD_LightOff()	IO0CLR=(3<<29)
#define		LCD_AllPinH()	IO0SET=0x03EFFFF0
#define		LCD_WRDATA(dat)	IO0CLR=(0x0000FFFF<<4); \
												IO0SET=(uint32)(dat<<4)
#define		LCD_RDDATA()	(uint16)(IO0PIN>>4)
	
/* 以下为LCM的驱动层,主要负责发送ILI9320的各种命令*/


/***********************************************************************
* 名称:LCD_Write2REG()
* 功能:写单参数命令子程序。会先判断LCM状态字。
* 入口参数:command  	要写入LCM的命令字
*          dat1		参数1
* 出口参数:操作出错返回0,否则返回1
* 说明:先发送参数据数据,再发送命令字
***********************************************************************/
uint8  LCD_Write2REG(uint8 COM_Index, uint16 COM_Dat)
{  
	LCD_CS_L();
	LCD_RS_L();
	LCD_RD_H();
	LCD_WRDATA(COM_Index);
	LCD_WR_L();
	//DelayNS(50);
	LCD_WR_H();
	//DelayNS(50);
	
	LCD_RS_H();
	LCD_WRDATA(COM_Dat);
	LCD_WR_L();
	//DelayNS(50);
	LCD_WR_H();
	//DelayNS(50);
	LCD_CS_H();
  return(1);
}
uint8  LCD_Write2REG2(uint8 COM_Index, uint16 COM_Dat1,uint16 COM_Dat2)
{  
	LCD_CS_L();
	LCD_RS_L();
	LCD_RD_H();
	LCD_WRDATA(COM_Index);
	LCD_WR_L();
	//DelayNS(50);
	LCD_WR_H();
	//DelayNS(50);
	
	LCD_RS_H();
	LCD_WRDATA(COM_Dat1);
	LCD_WR_L();
	//DelayNS(50);
	LCD_WR_H();
	//DelayNS(50);
	LCD_WRDATA(COM_Dat2);
	LCD_WR_L();
	//DelayNS(50);
	LCD_WR_H();
	//DelayNS(50);
	LCD_CS_H();
  return(1);
}

uint16  LCD_Read4REG(uint8 COM_Index)
{
	uint16 aTmp;
	LCD_CS_L();
	LCD_RS_L();
	LCD_RD_H();
	LCD_WRDATA(COM_Index);
	LCD_WR_L();
	DelayNS(50);
	LCD_WR_H();
	DelayNS(50);
	
	LCD_RS_H();
	LCD_RD_L();
	DelayNS(50);
	aTmp=LCD_RDDATA();
	LCD_RD_H();
	DelayNS(50);
	LCD_CS_H();
  return(aTmp);	
}
/***********************************************************************
* 名称:LCD_Write2RAM1()
* 功能:Write one pixel to LCD, with AC input
* 入口参数:dat  		要写入LCM的数据
* 出口参数:操作出错返回0,否则返回1
***********************************************************************/
uint8  LCD_SetXY(uint16 X_POS, uint16 Y_POS)
{  
	LCD_Write2REG(0x20, (uint16)X_POS);
	LCD_Write2REG(0x21, (uint16)Y_POS);
   return(1);
}
/***********************************************************************
* 名称:LCD_Write2RAM2()
* 功能:Write one pixel to LCD, without AC input(AC increase automatically)
* 入口参数:Pixel(0x00RRGGBB)  		要写入LCM的数据
* 出口参数:操作出错返回0,否则返回1
***********************************************************************/
uint8  LCD_Write2RAM(TCOLOR aPixel)
{  
	uint16 aPixelH,aPixelL; uint8 *aByte; void *pPix;
#if ColorMode==0	
  	aPixel &= 0x00FFFFFF;
  	aPixelL = 0x0000;
  	pPix=&aPixel;
  	aByte=(uint8 *)pPix;
	aPixelH=(*(aByte+2) & 0x3E);
	aPixelL=(aPixelH<<11);
	aPixelH=(*(aByte+1) & 0x3F);
	aPixelL += (aPixelH<<5);
	aPixelH =  (*aByte & 0x3E);
	aPixelL += aPixelH;
	LCD_Write2REG(0x22, aPixelL);
#else
  	aPixel &= 0x00FFFFFF;
  	aPixelL = 0x0000;
  	pPix=&aPixel;
  	aByte=(uint8 *)pPix;
	aPixelH=(*(aByte+2) & 0x0F);
	aPixelL=(aPixelH<<12);
	aPixelH=(*(aByte+1) & 0x3F);
	aPixelL += (aPixelH<<6);
	aPixelH =  (*aByte & 0x3F);
	aPixelL += aPixelH;
	aPixelH=(*(aByte+2) & 0x30);
	aPixelH=(aPixelH>>4);
	LCD_Write2REG2(0x22, aPixelH,aPixelL);
#endif
   return(1);
}

/***********************************************************************
* added driving functions
*
*
***********************************************************************/
void LCD_Reset(void) {
  // VCI=2.8V	
  //************* Reset LCD Driver ****************//
    LCD_RST_H();			
    DelayMS(1);		// Delay 1ms
    LCD_RST_L();	
    DelayMS(1);	// Delay 10ms
    LCD_RST_H();	
    DelayMS(1);	// Delay 50ms  	
}

void LCD_InitFunc1(void) {
	uint16 Test;
	Test=LCD_Read4REG(0x00);
	LCD_Write2REG(0xE5, 0x8000);						//RE5,??????
	LCD_Write2REG(0x00, 0x0001);						//R00,Start oscillator
	DelayMS(1);									//Wait to stablize
	LCD_Write2REG(0x2B,0x0010);						//R2B,264k color, 80Hz output
	LCD_Write2REG(0x01,0x0100);						//R01,Scan direction
	LCD_Write2REG(0x02,0x0700);						//R02,Line inversion
#if ColorMode==0	
	LCD_Write2REG(0x03,0x1230);						//R03,1 transfers, scan left-right/up-down
#else
	LCD_Write2REG(0x03,0xD230);						//R03,2 transfers, scan left-right/up-down
#endif
	LCD_Write2REG(0x04,0x0000);						//R04,no resizing
	LCD_Write2REG(0x08,0x0202);						//R08,
	LCD_Write2REG(0x09,0x0000);						//R09,
	LCD_Write2REG(0x0A,0x0000);						//R0A,
	LCD_Write2REG(0x0C,0x0000);						//R0C,not RGB mode
	LCD_Write2REG(0x0D,0x0000);						//R0D,
	LCD_Write2REG(0x0F,0x0000);						//R0F,
	LCD_Write2REG(0x50,0x0000);						//R50,x start is 0
	LCD_Write2REG(0x51,0x00EF);						//R51,x end is 0xEF(240)
	LCD_Write2REG(0x52,0x0000);						//R52,y start is 0
	LCD_Write2REG(0x53,0x013F);						//R53,y end is 0x013F(320)
	LCD_Write2REG(0x60,0x2700);						//R60,Gate scan control(3 registers)
	LCD_Write2REG(0x61,0x0001);						//R61,
	LCD_Write2REG(0x6A,0x0000);						//R6A,
	LCD_Write2REG(0x80,0x0000);						//R80,Partial image disabled(6 registers)
	LCD_Write2REG(0x81,0x0000);						//R81,
	LCD_Write2REG(0x82,0x0000);						//R82,
	LCD_Write2REG(0x83,0x0000);						//R83,
	LCD_Write2REG(0x84,0x0000);						//R84,
	LCD_Write2REG(0x85,0x0000);						//R85,
	LCD_Write2REG(0x90,0x0010);						//R90,Panel control setup
	LCD_Write2REG(0x92,0x0000);						//R92,
	LCD_Write2REG(0x93,0x0003);						//R93,
	LCD_Write2REG(0x95,0x0110);						//R95,
	LCD_Write2REG(0x97,0x0000);						//R97,
	LCD_Write2REG(0x98,0x0000);						//R98,	
}

void LCD_InitFunc2(void) {
	LCD_Write2REG(0x30,0x0007);						//R30,	Gamma polarity adjustment
	LCD_Write2REG(0x31,0x0403);						//R31,	
	LCD_Write2REG(0x32,0x0404);						//R32,	
	LCD_Write2REG(0x35,0x0002);						//R35,	
	LCD_Write2REG(0x36,0x0707);						//R36,	
	LCD_Write2REG(0x37,0x0600);						//R37,	
	LCD_Write2REG(0x38,0x0106);						//R38,	
	LCD_Write2REG(0x39,0x0007);						//R39,	
	LCD_Write2REG(0x3C,0x0700);						//R3C,	
	LCD_Write2REG(0x3D,0x0707);					//R3D,	
}

void LCD_PwrSetFunc(void) {
	LCD_Write2REG(0x10,0x0000);						//R10,	Output disabled
	LCD_Write2REG(0x11,0x0000);						//R11,	
	LCD_Write2REG(0x12,0x0000);						//R12,	
	LCD_Write2REG(0x13,0x0000);						//R13,	
	DelayMS(20);											//Delay 200ms
	LCD_Write2REG(0x10,0x17B0);						//R10,	Source/Drived enabled
	LCD_Write2REG(0x11,0x0001);						//R11,	Reference voltage set
	DelayMS(5);											//Delay 50ms
	LCD_Write2REG(0x12,0x013E);						//R12,	Gray control
	DelayMS(5);											//Delay 50ms
	LCD_Write2REG(0x13,0x1D00);						//R13,	Amplitude select
	LCD_Write2REG(0x29,0x0013);						//R29,	Voltage control
	DelayMS(5);											//Delay 50ms
	LCD_Write2REG(0x20,0x0000);						//R20,	GRAM x position set
	LCD_Write2REG(0x21,0x0000);						//R21,	GRAM y position set
}
void LCD_PwrOnFunc(void) {
	LCD_LightOn();
	LCD_AllPinH();
	LCD_Reset();
	DelayMS(1);											//Delay 10ms
	LCD_InitFunc1();
	LCD_PwrSetFunc();
	LCD_InitFunc2();

⌨️ 快捷键说明

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