?? ili93xx.c
字號(hào):
#include "lcd.h"
#include "stdlib.h"
#include "font.h"
#include "usart.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途
//Mini STM32開發(fā)板
//2.4/2.8寸TFT液晶驅(qū)動(dòng)
//支持驅(qū)動(dòng)IC型號(hào)包括:ILI9325/RM68021/ILI9320/ILI9328/LGDP4531/SPFD5408/SSD1289等
//正點(diǎn)原子@ALIENTEK
//技術(shù)論壇:www.openedv.com
//修改日期:2011/1/13
//版本:V1.4
//版權(quán)所有,盜版必究。
//Copyright(C) 正點(diǎn)原子 2009-2019
//All rights reserved
//********************************************************************************
//V1.2修改說(shuō)明
//支持了SPFD5408的驅(qū)動(dòng),另外把液晶ID直接打印成HEX格式.方便查看LCD驅(qū)動(dòng)IC.
//V1.3
//加入了快速IO的支持
//修改了背光控制的極性(適用于V1.8及以后的開發(fā)板版本)
//V1.4
//修改了LCD_ShowChar函數(shù),使用畫點(diǎn)功能畫字符。
//加入了橫豎屏顯示的支持
//////////////////////////////////////////////////////////////////////////////////
//畫筆顏色,背景顏色
u16 POINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF;
u16 DeviceCode;
#ifdef LCD_FAST_IO //快速IO
//寫寄存器函數(shù)
void LCD_WR_REG(u8 data)
{
LCD_RS_CLR;//寫地址
LCD_CS_CLR;
DATAOUT(data);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
}
#else//正常IO
//寫寄存器函數(shù)
void LCD_WR_REG(u8 data)
{
LCD_RS=0;//寫地址
LCD_CS=0;
DATAOUT(data);
LCD_WR=0;
LCD_WR=1;
LCD_CS=1;
}
#endif
//寫寄存器
void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
{
LCD_WR_REG(LCD_Reg);
LCD_WR_DATA(LCD_RegValue);
}
//讀寄存器
u16 LCD_ReadReg(u8 LCD_Reg)
{
u16 t;
LCD_WR_REG(LCD_Reg); //寫入要讀的寄存器號(hào)
GPIOB->CRL=0X88888888; //PB0-7 上拉輸入
GPIOB->CRH=0X88888888; //PB8-15 上拉輸入
GPIOB->ODR=0XFFFF; //全部輸出高
#ifdef LCD_FAST_IO //快速IO
LCD_RS_SET;
LCD_CS_CLR;
//讀取數(shù)據(jù)(讀寄存器時(shí),并不需要讀2次)
LCD_RD_CLR;
delay_us(5);//FOR 8989,延時(shí)5us
LCD_RD_SET;
t=DATAIN;
LCD_CS_SET;
#else
LCD_RS=1;
LCD_CS=0;
//讀取數(shù)據(jù)(讀寄存器時(shí),并不需要讀2次)
LCD_RD=0;
LCD_RD=1;
t=DATAIN;
LCD_CS=1;
#endif
GPIOB->CRL=0X33333333; //PB0-7 上拉輸出
GPIOB->CRH=0X33333333; //PB8-15 上拉輸出
GPIOB->ODR=0XFFFF; //全部輸出高
return t;
}
//開始寫GRAM
void LCD_WriteRAM_Prepare(void)
{
LCD_WR_REG(R34);
}
//LCD寫GRAM
void LCD_WriteRAM(u16 RGB_Code)
{
LCD_WR_DATA(RGB_Code);//寫十六位GRAM
}
//從ILI93xx讀出的數(shù)據(jù)為GBR格式,而我們寫入的時(shí)候?yàn)镽GB格式。
//通過(guò)該函數(shù)轉(zhuǎn)換
//c:GBR格式的顏色值
//返回值:RGB格式的顏色值
u16 LCD_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);
}
//讀取個(gè)某點(diǎn)的顏色值
//x:0~239
//y:0~319
//返回值:此點(diǎn)的顏色
u16 LCD_ReadPoint(u16 x,u16 y)
{
u16 t;
if(x>=LCD_W||y>=LCD_H)return 0;//超過(guò)了范圍,直接返回
LCD_SetCursor(x,y);
LCD_WR_REG(R34); //選擇GRAM地址
GPIOB->CRL=0X88888888; //PB0-7 上拉輸入
GPIOB->CRH=0X88888888; //PB8-15 上拉輸入
GPIOB->ODR=0XFFFF; //全部輸出高
#ifdef LCD_FAST_IO //快速IO
LCD_RS_SET;
LCD_CS_CLR;
//讀取數(shù)據(jù)(讀GRAM時(shí),需要讀2次)
LCD_RD_CLR;
LCD_RD_SET;
delay_us(2);//FOR 9320,延時(shí)2us
//dummy READ
LCD_RD_CLR;
delay_us(2);//FOR 8989,延時(shí)2us
LCD_RD_SET;
t=DATAIN;
LCD_CS_SET;
#else
LCD_RS=1;
LCD_CS=0;
//讀取數(shù)據(jù)(讀GRAM時(shí),需要讀2次)
LCD_RD=0;
LCD_RD=1;
//dummy READ
LCD_RD=0;
LCD_RD=1;
t=DATAIN;
LCD_CS=1;
#endif
GPIOB->CRL=0X33333333; //PB0-7 上拉輸出
GPIOB->CRH=0X33333333; //PB8-15 上拉輸出
GPIOB->ODR=0XFFFF; //全部輸出高
if(DeviceCode==0X4531||DeviceCode==0X8989)return t;//4531/8989驅(qū)動(dòng)IC
else return LCD_BGR2RGB(t);
}
//LCD開啟顯示
void LCD_DisplayOn(void)
{
LCD_WriteReg(R7, 0x0173); //26萬(wàn)色顯示開啟
}
//LCD關(guān)閉顯示
void LCD_DisplayOff(void)
{
LCD_WriteReg(R7, 0x0);//關(guān)閉顯示
}
//設(shè)置光標(biāo)位置
//Xpos:橫坐標(biāo)
//Ypos:縱坐標(biāo)
__inline void LCD_SetCursor(u16 Xpos, u16 Ypos)
{
#ifdef USE_HORIZONTAL
if(DeviceCode==0X8989)
{
LCD_WriteReg(0X4E, Ypos);
LCD_WriteReg(0X4F, 319-Xpos);
}else
{
LCD_WriteReg(R32, Ypos);
LCD_WriteReg(R33, 319-Xpos);
}
#else
if(DeviceCode==0X8989)
{
LCD_WriteReg(0X4E, Xpos);
LCD_WriteReg(0X4F, Ypos);
}else
{
LCD_WriteReg(R32, Xpos);
LCD_WriteReg(R33, Ypos);
}
#endif
}
//畫點(diǎn)
//x:0~239
//y:0~319
//POINT_COLOR:此點(diǎn)的顏色
void LCD_DrawPoint(u16 x,u16 y)
{
LCD_SetCursor(x,y);//設(shè)置光標(biāo)位置
LCD_WR_REG(R34);//開始寫入GRAM
LCD_WR_DATA(POINT_COLOR);
}
//初始化lcd
//該初始化函數(shù)可以初始化各種ILI93XX液晶,但是其他函數(shù)是基于ILI9320的!!!
//在其他型號(hào)的驅(qū)動(dòng)芯片上沒(méi)有測(cè)試!
void LCD_Init(void)
{
RCC->APB2ENR|=1<<3;//先使能外設(shè)PORTB時(shí)鐘
RCC->APB2ENR|=1<<4;//先使能外設(shè)PORTC時(shí)鐘
RCC->APB2ENR|=1<<0; //開啟輔助時(shí)鐘
JTAG_Set(SWD_ENABLE); //開啟SWD
//PORTC6~10復(fù)用推挽輸出
GPIOC->CRH&=0XFFFFF000;
GPIOC->CRH|=0X00000333;
GPIOC->CRL&=0X00FFFFFF;
GPIOC->CRL|=0X33000000;
GPIOC->ODR|=0X07C0;
//PORTB 推挽輸出
GPIOB->CRH=0X33333333;
GPIOB->CRL=0X33333333;
GPIOB->ODR=0XFFFF;
delay_ms(50); // delay 50 ms
LCD_WriteReg(0x0000,0x0001);
delay_ms(50); // delay 50 ms
DeviceCode = LCD_ReadReg(0x0000);
printf(" LCD ID:%x\n",DeviceCode); //打印LCD ID
if(DeviceCode==0x9325||DeviceCode==0x9328)//ILI9325
{
LCD_WriteReg(0x00e7,0x0010);
LCD_WriteReg(0x0000,0x0001);//開啟內(nèi)部時(shí)鐘
LCD_WriteReg(0x0001,0x0100);
LCD_WriteReg(0x0002,0x0700);//電源開啟
//LCD_WriteReg(0x0003,(1<<3)|(1<<4) ); //65K RGB
//DRIVE TABLE(寄存器 03H)
//BIT3=AM BIT4:5=ID0:1
//AM ID0 ID1 FUNCATION
// 0 0 0 R->L D->U
// 1 0 0 D->U R->L
// 0 1 0 L->R D->U
// 1 1 0 D->U L->R
// 0 0 1 R->L U->D
// 1 0 1 U->D R->L
// 0 1 1 L->R U->D 正常就用這個(gè).
// 1 1 1 U->D L->R
LCD_WriteReg(0x0003,(1<<12)|(3<<4)|(0<<3) );//65K
LCD_WriteReg(0x0004,0x0000);
LCD_WriteReg(0x0008,0x0207);
LCD_WriteReg(0x0009,0x0000);
LCD_WriteReg(0x000a,0x0000);//display setting
LCD_WriteReg(0x000c,0x0001);//display setting
LCD_WriteReg(0x000d,0x0000);//0f3c
LCD_WriteReg(0x000f,0x0000);
//電源配置
LCD_WriteReg(0x0010,0x0000);
LCD_WriteReg(0x0011,0x0007);
LCD_WriteReg(0x0012,0x0000);
LCD_WriteReg(0x0013,0x0000);
delay_ms(50);
LCD_WriteReg(0x0010,0x1590);
LCD_WriteReg(0x0011,0x0227);
delay_ms(50);
LCD_WriteReg(0x0012,0x009c);
delay_ms(50);
LCD_WriteReg(0x0013,0x1900);
LCD_WriteReg(0x0029,0x0023);
LCD_WriteReg(0x002b,0x000e);
delay_ms(50);
LCD_WriteReg(0x0020,0x0000);
LCD_WriteReg(0x0021,0x013f);
delay_ms(50);
//伽馬校正
LCD_WriteReg(0x0030,0x0007);
LCD_WriteReg(0x0031,0x0707);
LCD_WriteReg(0x0032,0x0006);
LCD_WriteReg(0x0035,0x0704);
LCD_WriteReg(0x0036,0x1f04);
LCD_WriteReg(0x0037,0x0004);
LCD_WriteReg(0x0038,0x0000);
LCD_WriteReg(0x0039,0x0706);
LCD_WriteReg(0x003c,0x0701);
LCD_WriteReg(0x003d,0x000f);
delay_ms(50);
LCD_WriteReg(0x0050,0x0000); //水平GRAM起始位置
LCD_WriteReg(0x0051,0x00ef); //水平GRAM終止位置
LCD_WriteReg(0x0052,0x0000); //垂直GRAM起始位置
LCD_WriteReg(0x0053,0x013f); //垂直GRAM終止位置
LCD_WriteReg(0x0060,0xa700);
LCD_WriteReg(0x0061,0x0001);
LCD_WriteReg(0x006a,0x0000);
LCD_WriteReg(0x0080,0x0000);
LCD_WriteReg(0x0081,0x0000);
LCD_WriteReg(0x0082,0x0000);
LCD_WriteReg(0x0083,0x0000);
LCD_WriteReg(0x0084,0x0000);
LCD_WriteReg(0x0085,0x0000);
LCD_WriteReg(0x0090,0x0010);
LCD_WriteReg(0x0092,0x0000);
LCD_WriteReg(0x0093,0x0003);
LCD_WriteReg(0x0095,0x0110);
LCD_WriteReg(0x0097,0x0000);
LCD_WriteReg(0x0098,0x0000);
//開啟顯示設(shè)置
LCD_WriteReg(0x0007,0x0133);
LCD_WriteReg(0x0020,0x0000);
LCD_WriteReg(0x0021,0x013f);
}else if(DeviceCode==0x9320||DeviceCode==0x9300)
{
LCD_WriteReg(0x00,0x0000);
LCD_WriteReg(0x01,0x0100); //Driver Output Contral.
LCD_WriteReg(0x02,0x0700); //LCD Driver Waveform Contral.
LCD_WriteReg(0x03,0x1030);//Entry Mode Set.
//LCD_WriteReg(0x03,0x1018); //Entry Mode Set.
LCD_WriteReg(0x04,0x0000); //Scalling Contral.
LCD_WriteReg(0x08,0x0202); //Display Contral 2.(0x0207)
LCD_WriteReg(0x09,0x0000); //Display Contral 3.(0x0000)
LCD_WriteReg(0x0a,0x0000); //Frame Cycle Contal.(0x0000)
LCD_WriteReg(0x0c,(1<<0)); //Extern Display Interface Contral 1.(0x0000)
LCD_WriteReg(0x0d,0x0000); //Frame Maker Position.
LCD_WriteReg(0x0f,0x0000); //Extern Display Interface Contral 2.
delay_ms(50);
LCD_WriteReg(0x07,0x0101); //Display Contral.
delay_ms(50);
LCD_WriteReg(0x10,(1<<12)|(0<<8)|(1<<7)|(1<<6)|(0<<4)); //Power Control 1.(0x16b0)
LCD_WriteReg(0x11,0x0007); //Power Control 2.(0x0001)
LCD_WriteReg(0x12,(1<<8)|(1<<4)|(0<<0)); //Power Control 3.(0x0138)
LCD_WriteReg(0x13,0x0b00); //Power Control 4.
LCD_WriteReg(0x2b,(1<<14)|(1<<4));
LCD_WriteReg(0x50,0); //Set X Star
//水平GRAM終止位置Set X End.
LCD_WriteReg(0x51,239); //Set Y Star
LCD_WriteReg(0x52,0); //Set Y End.t.
LCD_WriteReg(0x53,319); //
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==0x5408)
{
LCD_WriteReg(0x01,0x0100);
LCD_WriteReg(0x02,0x0700);//LCD Driving Waveform Contral
LCD_WriteReg(0x03,0x1030);//Entry Mode設(shè)置
//指針從左至右自上而下的自動(dòng)增模式
//Normal Mode(Window Mode disable)
//RGB格式
//16位數(shù)據(jù)2次傳輸?shù)?總線設(shè)置
LCD_WriteReg(0x04,0x0000); //Scalling Control register
LCD_WriteReg(0x08,0x0207); //Display Control 2
LCD_WriteReg(0x09,0x0000); //Display Control 3
LCD_WriteReg(0x0A,0x0000); //Frame Cycle Control
LCD_WriteReg(0x0C,0x0000); //External Display Interface Control 1
LCD_WriteReg(0x0D,0x0000); //Frame Maker Position
LCD_WriteReg(0x0F,0x0000); //External Display Interface Control 2
delay_ms(20);
//TFT 液晶彩色圖像顯示方法14
LCD_WriteReg(0x10,0x16B0); //0x14B0 //Power Control 1
LCD_WriteReg(0x11,0x0001); //0x0007 //Power Control 2
LCD_WriteReg(0x17,0x0001); //0x0000 //Power Control 3
LCD_WriteReg(0x12,0x0138); //0x013B //Power Control 4
LCD_WriteReg(0x13,0x0800); //0x0800 //Power Control 5
LCD_WriteReg(0x29,0x0009); //NVM read data 2
LCD_WriteReg(0x2a,0x0009); //NVM read data 3
LCD_WriteReg(0xa4,0x0000);
LCD_WriteReg(0x50,0x0000); //設(shè)置操作窗口的X軸開始列
LCD_WriteReg(0x51,0x00EF); //設(shè)置操作窗口的X軸結(jié)束列
LCD_WriteReg(0x52,0x0000); //設(shè)置操作窗口的Y軸開始行
LCD_WriteReg(0x53,0x013F); //設(shè)置操作窗口的Y軸結(jié)束行
LCD_WriteReg(0x60,0x2700); //Driver Output Control
//設(shè)置屏幕的點(diǎn)數(shù)以及掃描的起始行
LCD_WriteReg(0x61,0x0001); //Driver Output Control
LCD_WriteReg(0x6A,0x0000); //Vertical Scroll 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); //Display Position – Partial Display 2
LCD_WriteReg(0x84,0x0000); //RAM Address Start – Partial Display 2
LCD_WriteReg(0x85,0x0000); //RAM address End – Partail Display2
LCD_WriteReg(0x90,0x0013); //Frame Cycle Control
LCD_WriteReg(0x92,0x0000); //Panel Interface Control 2
LCD_WriteReg(0x93,0x0003); //Panel Interface control 3
LCD_WriteReg(0x95,0x0110); //Frame Cycle Control
LCD_WriteReg(0x07,0x0173);
delay_ms(50);
}
else if(DeviceCode==0x1505)
{
// second release on 3/5 ,luminance is acceptable,water wave appear during camera preview
LCD_WriteReg(0x0007,0x0000);
delay_ms(50);
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);
//伽馬校正
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
delay_ms(50);
LCD_WriteReg(0x0007,0x0001);
LCD_WriteReg(0x0017,0x0001);//開啟電源
delay_ms(50);
//電源配置
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//
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -