📄 ili9320.c
字号:
LCD_WriteReg(0x51,239); //Set X End.
LCD_WriteReg(0x52,0); //Set Y Start.
LCD_WriteReg(0x53,319); //Set Y End.
LCD_WriteReg(0x60,0x2700); //Driver Output Control.
LCD_WriteReg(0x61,0x0001); //Driver Output Control.
LCD_WriteReg(0x6a,0x0000); //Vertical Srcoll Control.
LCD_WriteReg(0x80,0x0000); //Display Position? Partial Display 1.
LCD_WriteReg(0x81,0x0000); //RAM Address Start? Partial Display 1.
LCD_WriteReg(0x82,0x0000); //RAM Address End-Partial Display 1.
LCD_WriteReg(0x83,0x0000); //Displsy Position? Partial Display 2.
LCD_WriteReg(0x84,0x0000); //RAM Address Start? Partial Display 2.
LCD_WriteReg(0x85,0x0000); //RAM Address End? Partial Display 2.
LCD_WriteReg(0x90,(0<<7)|(16<<0)); //Frame Cycle Contral.(0x0013)
LCD_WriteReg(0x92,0x0000); //Panel Interface Contral 2.(0x0000)
LCD_WriteReg(0x93,0x0001); //Panel Interface Contral 3.
LCD_WriteReg(0x95,0x0110); //Frame Cycle Contral.(0x0110)
LCD_WriteReg(0x97,(0<<8)); //
LCD_WriteReg(0x98,0x0000); //Frame Cycle Contral.
LCD_WriteReg(0x07,0x0173); //(0x0173)
}
else if(DeviceCode==0x1505)
{
// second release on 3/5 ,luminance is acceptable,water wave appear during camera preview
LCD_WriteReg(0x0007,0x0000);
ili9320_Delay(5);
LCD_WriteReg(0x0012,0x011C);//0x011A why need to set several times?
LCD_WriteReg(0x00A4,0x0001);//NVM
//
LCD_WriteReg(0x0008,0x000F);
LCD_WriteReg(0x000A,0x0008);
LCD_WriteReg(0x000D,0x0008);
//GAMMA CONTROL/
LCD_WriteReg(0x0030,0x0707);
LCD_WriteReg(0x0031,0x0007); //0x0707
LCD_WriteReg(0x0032,0x0603);
LCD_WriteReg(0x0033,0x0700);
LCD_WriteReg(0x0034,0x0202);
LCD_WriteReg(0x0035,0x0002); //?0x0606
LCD_WriteReg(0x0036,0x1F0F);
LCD_WriteReg(0x0037,0x0707); //0x0f0f 0x0105
LCD_WriteReg(0x0038,0x0000);
LCD_WriteReg(0x0039,0x0000);
LCD_WriteReg(0x003A,0x0707);
LCD_WriteReg(0x003B,0x0000); //0x0303
LCD_WriteReg(0x003C,0x0007); //?0x0707
LCD_WriteReg(0x003D,0x0000); //0x1313//0x1f08
ili9320_Delay(5);
LCD_WriteReg(0x0007,0x0001);
LCD_WriteReg(0x0017,0x0001); //Power supply startup enable
ili9320_Delay(5);
//power control//
LCD_WriteReg(0x0010,0x17A0);
LCD_WriteReg(0x0011,0x0217); //reference voltage VC[2:0] Vciout = 1.00*Vcivl
LCD_WriteReg(0x0012,0x011E);//0x011c //Vreg1out = Vcilvl*1.80 is it the same as Vgama1out ?
LCD_WriteReg(0x0013,0x0F00); //VDV[4:0]-->VCOM Amplitude VcomL = VcomH - Vcom Ampl
LCD_WriteReg(0x002A,0x0000);
LCD_WriteReg(0x0029,0x000A); //0x0001F Vcomh = VCM1[4:0]*Vreg1out gate source voltage??
LCD_WriteReg(0x0012,0x013E); // 0x013C power supply on
//Coordinates Control//
LCD_WriteReg(0x0050,0x0000);//0x0e00
LCD_WriteReg(0x0051,0x00EF);
LCD_WriteReg(0x0052,0x0000);
LCD_WriteReg(0x0053,0x013F);
//Pannel Image Control//
LCD_WriteReg(0x0060,0x2700);
LCD_WriteReg(0x0061,0x0001);
LCD_WriteReg(0x006A,0x0000);
LCD_WriteReg(0x0080,0x0000);
//Partial Image Control//
LCD_WriteReg(0x0081,0x0000);
LCD_WriteReg(0x0082,0x0000);
LCD_WriteReg(0x0083,0x0000);
LCD_WriteReg(0x0084,0x0000);
LCD_WriteReg(0x0085,0x0000);
//Panel Interface Control//
LCD_WriteReg(0x0090,0x0013); //0x0010 frenqucy
LCD_WriteReg(0x0092,0x0300);
LCD_WriteReg(0x0093,0x0005);
LCD_WriteReg(0x0095,0x0000);
LCD_WriteReg(0x0097,0x0000);
LCD_WriteReg(0x0098,0x0000);
LCD_WriteReg(0x0001,0x0100);
LCD_WriteReg(0x0002,0x0700);
LCD_WriteReg(0x0003,0x1030);
LCD_WriteReg(0x0004,0x0000);
LCD_WriteReg(0x000C,0x0000);
LCD_WriteReg(0x000F,0x0000);
LCD_WriteReg(0x0020,0x0000);
LCD_WriteReg(0x0021,0x0000);
LCD_WriteReg(0x0007,0x0021);
ili9320_Delay(20);
LCD_WriteReg(0x0007,0x0061);
ili9320_Delay(20);
LCD_WriteReg(0x0007,0x0173);
ili9320_Delay(20);
}
else if(DeviceCode==0x8989)
{
LCD_WriteReg(0x0000,0x0001); ili9320_Delay(50000); //打开晶振
LCD_WriteReg(0x0003,0xA8A4); ili9320_Delay(50000); //0xA8A4
LCD_WriteReg(0x000C,0x0000); ili9320_Delay(50000);
LCD_WriteReg(0x000D,0x080C); ili9320_Delay(50000);
LCD_WriteReg(0x000E,0x2B00); ili9320_Delay(50000);
LCD_WriteReg(0x001E,0x00B0); ili9320_Delay(50000);
LCD_WriteReg(0x0001,0x2B3F); ili9320_Delay(50000); //驱动输出控制320*240 0x6B3F
LCD_WriteReg(0x0002,0x0600); ili9320_Delay(50000);
LCD_WriteReg(0x0010,0x0000); ili9320_Delay(50000);
LCD_WriteReg(0x0011,0x6070); ili9320_Delay(50000); //0x4030 //定义数据格式 16位色 横屏 0x6058
LCD_WriteReg(0x0005,0x0000); ili9320_Delay(50000);
LCD_WriteReg(0x0006,0x0000); ili9320_Delay(50000);
LCD_WriteReg(0x0016,0xEF1C); ili9320_Delay(50000);
LCD_WriteReg(0x0017,0x0003); ili9320_Delay(50000);
LCD_WriteReg(0x0007,0x0233); ili9320_Delay(50000); //0x0233
LCD_WriteReg(0x000B,0x0000); ili9320_Delay(50000);
LCD_WriteReg(0x000F,0x0000); ili9320_Delay(50000); //扫描开始地址
LCD_WriteReg(0x0041,0x0000); ili9320_Delay(50000);
LCD_WriteReg(0x0042,0x0000); ili9320_Delay(50000);
LCD_WriteReg(0x0048,0x0000); ili9320_Delay(50000);
LCD_WriteReg(0x0049,0x013F); ili9320_Delay(50000);
LCD_WriteReg(0x004A,0x0000); ili9320_Delay(50000);
LCD_WriteReg(0x004B,0x0000); ili9320_Delay(50000);
LCD_WriteReg(0x0044,0xEF00); ili9320_Delay(50000);
LCD_WriteReg(0x0045,0x0000); ili9320_Delay(50000);
LCD_WriteReg(0x0046,0x013F); ili9320_Delay(50000);
LCD_WriteReg(0x0030,0x0707); ili9320_Delay(50000);
LCD_WriteReg(0x0031,0x0204); ili9320_Delay(50000);
LCD_WriteReg(0x0032,0x0204); ili9320_Delay(50000);
LCD_WriteReg(0x0033,0x0502); ili9320_Delay(50000);
LCD_WriteReg(0x0034,0x0507); ili9320_Delay(50000);
LCD_WriteReg(0x0035,0x0204); ili9320_Delay(50000);
LCD_WriteReg(0x0036,0x0204); ili9320_Delay(50000);
LCD_WriteReg(0x0037,0x0502); ili9320_Delay(50000);
LCD_WriteReg(0x003A,0x0302); ili9320_Delay(50000);
LCD_WriteReg(0x003B,0x0302); ili9320_Delay(50000);
LCD_WriteReg(0x0023,0x0000); ili9320_Delay(50000);
LCD_WriteReg(0x0024,0x0000); ili9320_Delay(50000);
LCD_WriteReg(0x0025,0x8000); ili9320_Delay(50000);
LCD_WriteReg(0x004f,0); //行首址0
LCD_WriteReg(0x004e,0); //列首址0
}
for(i=50000;i>0;i--);
}
/****************************************************************************
* 名 称:void ili9320_SetCursor(u16 x,u16 y)
* 功 能:设置屏幕座标
* 入口参数:x 行座标
* y 列座标
* 出口参数:无
* 说 明:
* 调用方法:ili9320_SetCursor(10,10);
****************************************************************************/
__inline void ili9320_SetCursor(u16 x,u16 y)
{
if(DeviceCode==0x8989)
{
LCD_WriteReg(0x004e,y); //行
LCD_WriteReg(0x004f,0x13f-x); //列
}
else
{
LCD_WriteReg(0x0020,y); // 行
LCD_WriteReg(0x0021,0x13f-x); // 列
}
}
/****************************************************************************
* 名 称:void ili9320_SetWindows(u16 StartX,u16 StartY,u16 EndX,u16 EndY)
* 功 能:设置窗口区域
* 入口参数:StartX 行起始座标
* StartY 列起始座标
* EndX 行结束座标
* EndY 列结束座标
* 出口参数:无
* 说 明:
* 调用方法:ili9320_SetWindows(0,0,100,100);
****************************************************************************/
__inline void ili9320_SetWindows(u16 StartX,u16 StartY,u16 EndX,u16 EndY)
{
ili9320_SetCursor(StartX,StartY);
LCD_WriteReg(0x0050, StartX);
LCD_WriteReg(0x0052, StartY);
LCD_WriteReg(0x0051, EndX);
LCD_WriteReg(0x0053, EndY);
}
/****************************************************************************
* 名 称:void ili9320_Clear(u16 dat)
* 功 能:将屏幕填充成指定的颜色,如清屏,则填充 0xffff
* 入口参数:dat 填充值
* 出口参数:无
* 说 明:
* 调用方法:ili9320_Clear(0xffff);
****************************************************************************/
void ili9320_Clear(u16 Color)
{
u32 index=0;
ili9320_SetCursor(0,0);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
for(index=0;index<76800;index++)
{
LCD->LCD_RAM=Color;
}
}
/****************************************************************************
* 名 称:u16 ili9320_GetPoint(u16 x,u16 y)
* 功 能:获取指定座标的颜色值
* 入口参数:x 行座标
* y 列座标
* 出口参数:当前座标颜色值
* 说 明:
* 调用方法:i=ili9320_GetPoint(10,10);
****************************************************************************/
u16 ili9320_GetPoint(u16 x,u16 y)
{
ili9320_SetCursor(x,y);
return (ili9320_BGR2RGB(LCD_ReadRAM()));
}
/****************************************************************************
* 名 称:void ili9320_SetPoint(u16 x,u16 y,u16 point)
* 功 能:在指定座标画点
* 入口参数:x 行座标
* y 列座标
* point 点的颜色
* 出口参数:无
* 说 明:
* 调用方法:ili9320_SetPoint(10,10,0x0fe0);
****************************************************************************/
void ili9320_SetPoint(u16 x,u16 y,u16 point)
{
if ( (x>320)||(y>240) ) return;
ili9320_SetCursor(x,y);
LCD_WriteRAM_Prepare();
LCD_WriteRAM(point);
}
/****************************************************************************
* 名 称:void ili9320_DrawPicture(u16 StartX,u16 StartY,u16 EndX,u16 EndY,u16 *pic)
* 功 能:在指定座标范围显示一副图片
* 入口参数:StartX 行起始座标
* StartY 列起始座标
* EndX 行结束座标
* EndY 列结束座标
pic 图片头指针
* 出口参数:无
* 说 明:图片取模格式为水平扫描,16位颜色模式
* 调用方法:ili9320_DrawPicture(0,0,100,100,(u16*)demo);
****************************************************************************/
void ili9320_DrawPicture(u16 StartX,u16 StartY,u16 EndX,u16 EndY,u16 *pic)
{
u16 i;
ili9320_SetWindows(StartX,StartY,EndX,EndY);
ili9320_SetCursor(StartX,StartY);
LCD_WriteRAM_Prepare();
for (i=0;i<(EndX*EndY);i++)
{
LCD_WriteRAM(*pic++);
}
}
/****************************************************************************
* 名 称:void ili9320_PutChar(u16 x,u16 y,u8 c,u16 charColor,u16 bkColor)
* 功 能:在指定座标显示一个8x16点阵的ascii字符
* 入口参数:x 行座标
* y 列座标
* charColor 字符的颜色
* bkColor 字符背景颜色
* 出口参数:无
* 说 明:显示范围限定为可显示的ascii码
* 调用方法:ili9320_PutChar(10,10,'a',0x0000,0xffff);
****************************************************************************/
void ili9320_PutChar(u16 x,u16 y,u8 c,u16 charColor,u16 bkColor)
{
u16 i=0;
u16 j=0;
u8 tmp_char=0;
for (i=0;i<16;i++)
{
tmp_char=ascii_8x16[((c-0x20)*16)+i];
for (j=0;j<8;j++)
{
if ( (tmp_char >> 7-j) & 0x01 == 0x01)
{
ili9320_SetPoint(x+j,y+i,charColor); // 字符颜色
}
else
{
ili9320_SetPoint(x+j,y+i,bkColor); // 背景颜色
}
}
}
}
/****************************************************************************
* 名 称:u16 ili9320_BGR2RGB(u16 c)
* 功 能:RRRRRGGGGGGBBBBB 改为 BBBBBGGGGGGRRRRR 格式
* 入口参数:c BRG 颜色值
* 出口参数:RGB 颜色值
* 说 明:内部函数调用
* 调用方法:
****************************************************************************/
u16 ili9320_BGR2RGB(u16 c)
{
u16 r, g, b, rgb;
b = (c>>0) & 0x1f;
g = (c>>5) & 0x3f;
r = (c>>11) & 0x1f;
rgb = (b<<11) + (g<<5) + (r<<0);
return( rgb );
}
/****************************************************************************
* 名 称:void ili9320_BackLight(u8 status)
* 功 能:开、关液晶背光
* 入口参数:status 1:背光开 0:背光关
* 出口参数:无
* 说 明:
* 调用方法:ili9320_BackLight(1);
****************************************************************************/
void ili9320_BackLight(u8 status)
{
if ( status >= 1 )
{
Lcd_Light_ON;
}
else
{
Lcd_Light_OFF;
}
}
/****************************************************************************
* 名 称:void ili9320_Delay(vu32 nCount)
* 功 能:延时
* 入口参数:nCount 延时值
* 出口参数:无
* 说 明:
* 调用方法:ili9320_Delay(10000);
****************************************************************************/
void ili9320_Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -