📄 ili9325_lcd_drv.c
字号:
#include "GUI.h"
/*============================================================================*/
#define LCD_Reg_Addr (0x04000000|(0<<1))
#define LCD_DATA_Addr (0x04000000|(1<<1))
////
#define LCD_Reg (*(volatile U16 *)LCD_Reg_Addr)
#define LCD_Data (*(volatile U16 *)LCD_DATA_Addr)
/*============================================================================*/
//static U16 LCD_Backlight_Time_Count,LCD_Backlight_Time_Buf;
static U16 LCD_Buffer[LCD_XSIZE*LCD_YSIZE];
/*============================================================================*/
/*============================================================================*/
#define LCD_WrReg(reg,data) LCD_Reg =reg;\
LCD_Data =data;
/*============================================================================*/
/*============================================================================*/
static void LCD_PutPixel(int x,int y,int color);
static int LCD_GetPixel(int x,int y);
/*============================================================================*/
static void LCD_Delay(U32 Delay_Time)
{
while(Delay_Time>0)
{
Delay_Time--;
}
}
/*============================================================================*/
static __inline void Wr_LCD_Reg(U8 Reg_Addr,U16 Data)
{
LCD_Reg =Reg_Addr;
LCD_Data =Data;
}
/*============================================================================*/
static __inline void Wr_LCD_Data(U16 Data)
{
LCD_Data =Data;
}
/*============================================================================*/
U16 Rd_LCD_Reg(U8 Reg_Addr)
{
LCD_Reg =Reg_Addr;
return LCD_Data;
}
/*============================================================================*/
static void LCD_DispOnOff(int onoff)
{
}
/*============================================================================*/
/*============================================================================*/
static int LCD_Init(void)
{
int i;
////
#define ILI9320 0
#define ILI9325 1
#define LCD_Device ILI9325
/*
LCD_nRST->GPC5 Output.
LCD_LED->GPE5(Timer2 PWM) Output.
*/
rPCONC &= ~(3<<10);
rPCONC |= (1<<10);
rPUPC &= ~(1<<5);
////
rPDATC|=(1<<5);
LCD_Delay(1000);
rPDATC&=~(1<<5);
LCD_Delay(40000);
rPDATC|=(1<<5);
LCD_Delay(1000); //LCD Reset.
/////
//LCD_Backlight_Init();
#if(LCD_Device==ILI9320)
//ILI9320Init
// Wr_LCD_Reg(0x00,0x0000);
Wr_LCD_Reg(0x01,0x0100); //Driver Output Contral.
Wr_LCD_Reg(0x02,0x0700); //LCD Driver Waveform Contral.
Wr_LCD_Reg(0x03,0x1030); //Entry Mode Set.
Wr_LCD_Reg(0x04,0x0000); //Scalling Contral.
Wr_LCD_Reg(0x08,0x0202); //Display Contral 2.(0x0207)
Wr_LCD_Reg(0x09,0x0000); //Display Contral 3.(0x0000)
Wr_LCD_Reg(0x0a,0x0000); //Frame Cycle Contal.(0x0000)
Wr_LCD_Reg(0x0c,(1<<0)); //Extern Display Interface Contral 1.(0x0000)
Wr_LCD_Reg(0x0d,0x0000); //Frame Maker Position.
Wr_LCD_Reg(0x0f,0x0000); //Extern Display Interface Contral 2.
LCD_Delay(200);
Wr_LCD_Reg(0x07,0x0101); //Display Contral.
LCD_Delay(200);
Wr_LCD_Reg(0x10,(1<<12)|(0<<8)|(1<<7)|(1<<6)|(0<<4)); //Power Control 1.(0x16b0)
Wr_LCD_Reg(0x11,0x0007); //Power Control 2.(0x0001)
Wr_LCD_Reg(0x12,(1<<8)|(1<<4)|(0<<0)); //Power Control 3.(0x0138)
Wr_LCD_Reg(0x13,0x0b00); //Power Control 4.
Wr_LCD_Reg(0x29,0x0000); //Power Control 7.
Wr_LCD_Reg(0x2b,(1<<14)|(1<<4));
Wr_LCD_Reg(0x50,0); //Set X Start.
Wr_LCD_Reg(0x51,239); //Set X End.
Wr_LCD_Reg(0x52,0); //Set Y Start.
Wr_LCD_Reg(0x53,319); //Set Y End.
Wr_LCD_Reg(0x60,0x2700); //Driver Output Control.
Wr_LCD_Reg(0x61,0x0001); //Driver Output Control.
Wr_LCD_Reg(0x6a,0x0000); //Vertical Srcoll Control.
Wr_LCD_Reg(0x80,0x0000); //Display Position? Partial Display 1.
Wr_LCD_Reg(0x81,0x0000); //RAM Address Start? Partial Display 1.
Wr_LCD_Reg(0x82,0x0000); //RAM Address End-Partial Display 1.
Wr_LCD_Reg(0x83,0x0000); //Displsy Position? Partial Display 2.
Wr_LCD_Reg(0x84,0x0000); //RAM Address Start? Partial Display 2.
Wr_LCD_Reg(0x85,0x0000); //RAM Address End? Partial Display 2.
Wr_LCD_Reg(0x90,(0<<7)|(16<<0)); //Frame Cycle Contral.(0x0013)
Wr_LCD_Reg(0x92,0x0000); //Panel Interface Contral 2.(0x0000)
Wr_LCD_Reg(0x93,0x0001); //Panel Interface Contral 3.
Wr_LCD_Reg(0x95,0x0110); //Frame Cycle Contral.(0x0110)
Wr_LCD_Reg(0x97,(0<<8)); //
Wr_LCD_Reg(0x98,0x0000); //Frame Cycle Contral.
Wr_LCD_Reg(0x07,0x0173); //(0x0173)
#endif
///////////////
#if(LCD_Device==ILI9325)
//ILI9325Init
Wr_LCD_Reg(0x00e7,0x0010);
Wr_LCD_Reg(0x0000,0x0001); //start internal osc
Wr_LCD_Reg(0x0001,0x0100);
Wr_LCD_Reg(0x0002,0x0700); //power on sequence
Wr_LCD_Reg(0x0003,(1<<12)|(1<<5)|(1<<4) ); //65K
Wr_LCD_Reg(0x0004,0x0000);
Wr_LCD_Reg(0x0008,0x0207);
Wr_LCD_Reg(0x0009,0x0000);
Wr_LCD_Reg(0x000a,0x0000); //display setting
Wr_LCD_Reg(0x000c,0x0001); //display setting
Wr_LCD_Reg(0x000d,0x0000); //0f3c
Wr_LCD_Reg(0x000f,0x0000);
Wr_LCD_Reg(0x0010,0x0000);
Wr_LCD_Reg(0x0011,0x0007);
Wr_LCD_Reg(0x0012,0x0000);
Wr_LCD_Reg(0x0013,0x0000);
for(i=50000;i>0;i--);
Wr_LCD_Reg(0x0010,0x1590);
Wr_LCD_Reg(0x0011,0x0227);
for(i=50000;i>0;i--);
Wr_LCD_Reg(0x0012,0x009c);
for(i=50000;i>0;i--);
Wr_LCD_Reg(0x0013,0x1900);
Wr_LCD_Reg(0x0029,0x0023);
Wr_LCD_Reg(0x002b,0x000e);
for(i=50000;i>0;i--);
Wr_LCD_Reg(0x0020,0x0000);
Wr_LCD_Reg(0x0021,0x0000);
for(i=50000;i>0;i--);
Wr_LCD_Reg(0x0030,0x0007);
Wr_LCD_Reg(0x0031,0x0707);
Wr_LCD_Reg(0x0032,0x0006);
Wr_LCD_Reg(0x0035,0x0704);
Wr_LCD_Reg(0x0036,0x1f04);
Wr_LCD_Reg(0x0037,0x0004);
Wr_LCD_Reg(0x0038,0x0000);
Wr_LCD_Reg(0x0039,0x0706);
Wr_LCD_Reg(0x003c,0x0701);
Wr_LCD_Reg(0x003d,0x000f);
for(i=50000;i>0;i--);
Wr_LCD_Reg(0x0050,0x0000);
Wr_LCD_Reg(0x0051,0x00ef);
Wr_LCD_Reg(0x0052,0x0000);
Wr_LCD_Reg(0x0053,0x013f);
Wr_LCD_Reg(0x0060,0xa700);
Wr_LCD_Reg(0x0061,0x0001);
Wr_LCD_Reg(0x006a,0x0000);
Wr_LCD_Reg(0x0080,0x0000);
Wr_LCD_Reg(0x0081,0x0000);
Wr_LCD_Reg(0x0082,0x0000);
Wr_LCD_Reg(0x0083,0x0000);
Wr_LCD_Reg(0x0084,0x0000);
Wr_LCD_Reg(0x0085,0x0000);
Wr_LCD_Reg(0x0090,0x0010);
Wr_LCD_Reg(0x0092,0x0000);
Wr_LCD_Reg(0x0093,0x0003);
Wr_LCD_Reg(0x0095,0x0110);
Wr_LCD_Reg(0x0097,0x0000);
Wr_LCD_Reg(0x0098,0x0000);
//display on sequence
Wr_LCD_Reg(0x0007,0x0133);
Wr_LCD_Reg(0x0020,0x0000);
Wr_LCD_Reg(0x0021,0x0000);
#endif
///////////////
LCD_Reg=0x00;
Uart_Printf(0,"LCD Driver=%X\n",LCD_Data);
////
i=0x1234;
LCD_PutPixel(0,0,i);
if(LCD_GetPixel(0,0)==i)
{
Uart_Puts(0,"LCD R/W OK!\n");
}
else
{
Uart_Puts(0,"LCD R/W Fail!\n");
}
////
return 1;
}
/*============================================================================*/
static void LCD_PutPixel(int x,int y,int color)
{
LCD_Reg =0x20;
LCD_Data =x;
LCD_Reg =0x21;
LCD_Data =y;
LCD_Reg =0x22;
LCD_Data =color;
}
static int LCD_GetPixel(int x,int y)
{
register data;
register r,g,b;
////
LCD_Reg =0x20;
LCD_Data =x;
LCD_Reg =0x21;
LCD_Data =y;
LCD_Reg =0x22;
data =LCD_Data;
data =LCD_Data;
r=data&0x1f;
g=(data>>5)&0x3f;
b=(data>>11)&0x1f;
return RGB565(r,g,b);
}
/*============================================================================*/
static void LCD_PutImage(int x,int y,int dx,int dy,U8 *Buf)
{
register xx,yy,yoffset;
int Xovf_words,x_end,y_end;
U16 *p=(U16 *)Buf;
////
if((x==0) && (y==0)){
if((dx==LCD_XSIZE) && (dy==LCD_YSIZE)){
//Full Screen
// memcpy(LCD_Buffer,Buf,LCD_XSIZE*LCD_YSIZE*2);
LCD_WrReg(0x20,0);
LCD_WrReg(0x21,0);
LCD_Reg=0x22;
////
for(xx=0;xx<LCD_XSIZE*LCD_YSIZE;xx++)
{
LCD_Data=*p++;
}
}
}
else{
Xovf_words=0;
x_end=x+dx;
if(x_end > LCD_XSIZE)
{
Xovf_words=(x_end-LCD_XSIZE)>>1; //X方向超出屏幕的字节数(每次读1WORD(4bytes)).
x_end=LCD_XSIZE;
}
////
y_end=y+dy;
if(y_end > LCD_YSIZE) y_end=LCD_YSIZE;
////////
for(yy=y;yy<y_end;yy++)
{
yoffset=yy*LCD_XSIZE;
LCD_WrReg(0x20,x);
LCD_WrReg(0x21,yy);
LCD_Reg=0x22;
for(xx=x;xx<x_end;xx++)
{
//*(LCD_Buffer+yoffset+xx)=*p++;
LCD_Data=*p++;
}
////
p+=Xovf_words; //换行前需加上X方向多余的字节数.
}
}
}
/*============================================================================*/
static void LCD_GetImage(int x,int y,int dx,int dy,U8 *Buf)
{
register xx,yy,yoffset;
int x_end,y_end;
U16 *p=(U16*)Buf;
U16 a;
////
if((x==0) && (y==0))
{ //Full Screen.
LCD_WrReg(0x20,x);
LCD_WrReg(0x21,y);
LCD_Reg=0x22;
////
a=LCD_Data;
if((dx==LCD_XSIZE) && (dy==LCD_YSIZE))
{
// memcpy(Buf,LCD_Buffer,LCD_XSIZE*LCD_YSIZE*2);
*p++=LCD_Data;
}
}
else{
x_end=x+dx;
if(x_end > LCD_XSIZE) x_end=LCD_XSIZE;
////
y_end=y+dy;
if(y_end > LCD_YSIZE) y_end=LCD_YSIZE;
////////
LCD_WrReg(0x20,x);
LCD_WrReg(0x21,yy);
LCD_Reg=0x22;
a=LCD_Data;
for(yy=y;yy<y_end;yy++)
{
yoffset=yy*LCD_XSIZE;
////
LCD_WrReg(0x20,x);
LCD_WrReg(0x21,yy);
LCD_Reg=0x22;
a=LCD_Data;
////
for(xx=x;xx<x_end;xx++)
{
//*p++=*(LCD_Buffer+yoffset+xx);
*p++=LCD_Data;
}
}
}
}
/*============================================================================*/
static void Set_LCD_Buf(int RGB)
{
register i;
////
LCD_WrReg(0x20,0);
LCD_WrReg(0x21,0);
LCD_Reg=0x22;
for(i=0;i<((LCD_XSIZE*LCD_YSIZE));i++)
{
//(*(LCD_Buffer+i))=RGB;
LCD_Data=RGB;
}
}
/*============================================================================*/
struct _GUI_GAL Fit239A_LCD_Drv_GAL={
LCD_Init,
0,
0,
0,
Set_LCD_Buf,
LCD_PutPixel,
LCD_GetPixel,
LCD_PutImage,
LCD_GetImage,
240,320
};
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -