📄 lcddrive_io.c
字号:
/****************************************************************************************
* 文件名: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 + -