Google Chat: zj734465502@gmail.com
+86-0755-88291180
sales01@spotpear.com
dragon_manager@163.com
services01@spotpear.com
manager01@spotpear.com
WhatsApp:13246739196
1) i80-system MPU port (8-/9-/16-/18-bit bus width).
2) serial data transfer port (SPI).
3) RGB 6-/16-/18-bit port (DOTCLK, VSYNC, HSYNC, ENABLE, DB[17:0]).
The corresponding relationship between the 18-bit RGB assignment of ILI9341 and LCD GRAM in this screen is shown in the figure:
According to the above figure, ILI9341 is in the 16-bit mode and the available GRAM data are D17~D13 and D11~D1. D12 and D0 are not used. Actually, D12 and D0 of ILI9341 are not adapted in our LCD module. D17~D13 and D11~D1 of ILI9341 correspond to D15~D0 of MCU. In the 16-bit data of the MCU, the lowest 5 bits represent blue, the middle 6 bits are green, and the highest 5 bits are red. The larger the value, the darker the color.
The 8080 interface is designed by Intel. It is a parallel, asynchronous, half-duplex communication protocol. It is used for external expansion of RAM and ROM and is also used for LCD interface later.
RD: Write enable (write information to register) WR: read enable (read information from the register) DC(RS): data/command (1 for reading and writing data, 0 for reading and writing commands) CS: chip select
Pin No. | Symbol | Description | Function |
1 | 5V | 5V power supply | When powered from 5V supply, pin 1 & Pin 2 as power input, pin 33 & Pin 34 provide 3.3V output. |
2 | GND | Ground | GND |
3 | D0 | Data cable | D0-D15 |
4 | D1 | ||
5 | D2 | ||
6 | D3 | ||
7 | D4 | ||
8 | D5 | ||
9 | D6 | ||
10 | D7 | ||
11 | D8 | ||
12 | D9 | ||
13 | D10 | ||
14 | D11 | ||
15 | D12 | ||
16 | D13 | ||
17 | D14 | ||
18 | D15 | ||
19 | CS | LCD chip selection signal | Low active |
20 | RS | Command/Data Register Selection | RS = 0: Command Register RS = 1: Data Register |
21 | WR | Write | WR = 0, RD = 1 |
22 | RD | Read | WR = 1, RD = 0 |
23 | RESET | Reset the controller chip | Low active |
24 | NC | Not connect | Not connect |
25 | BLVCC | 5V or 3.3V | Backlight VCC |
26 | BLGND | Ground | Backlight GND |
27 | BLCNT | Backlight brightness adjustment | Control the backlight brightness via PWM |
28 | TP_IRQ | Touch panel interrupt | Low level while the touch panel detects pressing |
29 | TP_CS | Touch panel chip select | Low active |
30 | TP_SCK | Touch panel SPI clock | Connects to SPI SCK |
31 | TP_SI | Touch panel data input | Connects to SPI MOSI |
32 | TP_SO | Touch panel SPI data output | Connects to SPI MISO |
33 | 3.3V | 3.3V power supply | When powered from 3.3V supply, pin 33 & pin 34 as power input, pin 1 & pin 2 keep NC. |
34 | GND | Ground |
This manual uses the development board of the main control chip STM32F103RCT6 to illustrate the basic usage of this LCD. Users can also use other similar development boards for development.
3.2inch 320x240 Touch LCD (D) and STM32F103RCT6 connection interface diagram:
Procedure flow chart:
Source code analysis:
/*The following macro definition is for the rotation angle of the image and the setting of the control cable*/<br /> //#define DISP_ORIENTATION 0 //#define DISP_ORIENTATION 90 //#define DISP_ORIENTATION 180 #define DISP_ORIENTATION 270 #define Set_Cs GPIOC->BSRR = GPIO_Pin_6 //CS=1 #define Clr_Cs GPIOC->BRR = GPIO_Pin_6 //CS=0 #define Set_Rs GPIOC->BSRR = GPIO_Pin_7 //RS=1 #define Clr_Rs GPIOC->BRR = GPIO_Pin_7 //RS=0 #define Set_nWr GPIOC->BSRR = GPIO_Pin_1 //WR=1 #define Clr_nWr GPIOC->BRR = GPIO_Pin_1 //WR=0 #define Set_nRd GPIOC->BSRR = GPIO_Pin_2 //RD=1 #define Clr_nRd GPIOC->BRR = GPIO_Pin_2 //RD=0 /* Write command function */ __inline void LCD_WriteIndex(uint16_t index) { Clr_Rs; //RS=0 Set_nRd; //RD=0 LCD_Delay(0); //Delay GPIOB->ODR = index; /*Write command */ LCD_Delay(0); //Delay Clr_nWr; //WR=0 Set_nWr; //WR=1 } /* */ __inline void ILI9341_LCD_WriteData(uint16_t data) { Clr_Cs; //CS=1 Set_Rs; //RS=1 LCD_Delay(0); //delay GPIOB->ODR = data; /* GPIO_Write(GPIOB,data); */ LCD_Delay(0); //delay Clr_nWr; //WR=0 Set_nWr; //WR=1 Set_Cs; //CS=1 } /* Read data function */ __inline uint16_t LCD_ReadData(void) { uint16_t value; Set_Rs; Set_nWr; Clr_nRd; GPIOB->CRH = 0x44444444; //Set PB0-PB15 as input GPIOB->CRL = 0x44444444; value = GPIOB->IDR; //Read data GPIOB->CRH = 0x33333333; //Set PB0-PB15 as output GPIOB->CRL = 0x33333333; Set_nRd; return value; } /****************************************************************************** Write data at the specified address, LCD_Reg is the address, and LCD_RegValue is the written value. ******************************************************************************/ __inline void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue) { Clr_Cs; LCD_WriteIndex(LCD_Reg); //Write command; that is, the address to write data into; LCD_WriteData(LCD_RegValue); //data writing; Set_Cs; } /****************************************************************************** Read data from the specified address, LCD_Reg is the address, and the function returns the read value. <pre> ******************************************************************************/ __inline uint16_t LCD_ReadReg(uint16_t LCD_Reg) { uint16_t LCD_RAM; Clr_Cs; LCD_WriteIndex(LCD_Reg); //Write command; that is, the address of the data to be read; LCD_RAM = LCD_ReadData(); //data readout; Set_Cs; return LCD_RAM; } //The above are the basic functions for reading and writing; if you want to operate IO analog with the FSMC of the STM32, you can refer to LCD + TouchPanel (8080 FSMC) demo. /****************************************************************************** Initialization of LCD registers, the following initialization values of the registers are provided by the original LCD manufacturer and can be displayed normally according to the following configuration, please refer to the chip manual for registers. ******************************************************************************/ void LCD_Initializtion(void) { uint16_t DeviceCode; LCD_Configuration(); //Pin initialization GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);//Change the mapping of the specified pin GPIO_ResetBits(GPIOC, GPIO_Pin_0); /* LCD reset*/ delay_ms(100); GPIO_SetBits(GPIOC, GPIO_Pin_0); GPIO_SetBits(GPIOA, GPIO_Pin_3); /*Enable backlight */ DeviceCode = LCD_ReadReg(0x0000); /* Read ID */ if(DeviceCode == 0 || DeviceCode == 0xffff) { ILI9341_LCD_WriteReg(0XD3); Clr_Cs; DeviceCode = LCD_ReadData(); DeviceCode = LCD_ReadData(); DeviceCode = LCD_ReadData(); DeviceCode <<= 8; DeviceCode |= LCD_ReadData(); Set_Cs; } if(DeviceCode == 0x9341) { LCD_Code = ILI9341; ILI9341_LCD_WriteReg(0x3A); ILI9341_LCD_WriteData(0x55); ILI9341_LCD_WriteReg(0xB5); ILI9341_LCD_WriteData(0X04); ILI9341_LCD_WriteData(0X04); ILI9341_LCD_WriteData(0X0A); ILI9341_LCD_WriteData(0x14); ILI9341_LCD_WriteReg(0x35); ILI9341_LCD_WriteData(0x00); ILI9341_LCD_WriteReg(0xCF); ILI9341_LCD_WriteData(0x00); ILI9341_LCD_WriteData(0xEA); ILI9341_LCD_WriteData(0XF0); ILI9341_LCD_WriteReg(0xED); ILI9341_LCD_WriteData(0x64); ILI9341_LCD_WriteData(0x03); ILI9341_LCD_WriteData(0X12); ILI9341_LCD_WriteData(0X81); ILI9341_LCD_WriteReg(0xE8); ILI9341_LCD_WriteData(0x85); ILI9341_LCD_WriteData(0x10); ILI9341_LCD_WriteData(0x78); ILI9341_LCD_WriteReg(0xCB); ILI9341_LCD_WriteData(0x39); ILI9341_LCD_WriteData(0x2C); ILI9341_LCD_WriteData(0x00); ILI9341_LCD_WriteData(0x33); ILI9341_LCD_WriteData(0x06); ILI9341_LCD_WriteReg(0xF7); ILI9341_LCD_WriteData(0x20); ILI9341_LCD_WriteReg(0xEA); ILI9341_LCD_WriteData(0x00); ILI9341_LCD_WriteData(0x00); ILI9341_LCD_WriteReg(0xC0); //Power control ILI9341_LCD_WriteData(0x21); //VRH[5:0] ILI9341_LCD_WriteReg(0xC1); //Power control ILI9341_LCD_WriteData(0x10); //SAP[2:0];BT[3:0] ILI9341_LCD_WriteReg(0xC5); //VCM control ILI9341_LCD_WriteData(0x4F); //3F ILI9341_LCD_WriteData(0x38); //3C ILI9341_LCD_WriteReg(0xC7); //VCM control2 ILI9341_LCD_WriteData(0XB7); ILI9341_LCD_WriteReg(0x36); // Memory Access Control if (DISP_ORIENTATION == 0) ILI9341_LCD_WriteData(0x08 | 0x00); else if (DISP_ORIENTATION == 90) ILI9341_LCD_WriteData(0x08 | 0xa0); else if(DISP_ORIENTATION == 180) ILI9341_LCD_WriteData(0x08 | 0xc0); else ILI9341_LCD_WriteData(0x08 | 0x60); ILI9341_LCD_WriteReg(0xB1); ILI9341_LCD_WriteData(0x00); ILI9341_LCD_WriteData(0x13); ILI9341_LCD_WriteReg(0xB6); // Display Function Control ILI9341_LCD_WriteData(0x0A); ILI9341_LCD_WriteData(0xA2); ILI9341_LCD_WriteReg(0xF2); // 3Gamma Function Disable ILI9341_LCD_WriteData(0x02); ILI9341_LCD_WriteReg(0x26); //Gamma curve selected ILI9341_LCD_WriteData(0x01); ILI9341_LCD_WriteReg(0xE0); //Set Gamma ILI9341_LCD_WriteData(0x0F); ILI9341_LCD_WriteData(0x27); ILI9341_LCD_WriteData(0x24); ILI9341_LCD_WriteData(0x0C); ILI9341_LCD_WriteData(0x10); ILI9341_LCD_WriteData(0x08); ILI9341_LCD_WriteData(0x55); ILI9341_LCD_WriteData(0X87); ILI9341_LCD_WriteData(0x45); ILI9341_LCD_WriteData(0x08); ILI9341_LCD_WriteData(0x14); ILI9341_LCD_WriteData(0x07); ILI9341_LCD_WriteData(0x13); ILI9341_LCD_WriteData(0x08); ILI9341_LCD_WriteData(0x00); ILI9341_LCD_WriteReg(0XE1); //Set Gamma ILI9341_LCD_WriteData(0x00); ILI9341_LCD_WriteData(0x0F); ILI9341_LCD_WriteData(0x12); ILI9341_LCD_WriteData(0x05); ILI9341_LCD_WriteData(0x11); ILI9341_LCD_WriteData(0x06); ILI9341_LCD_WriteData(0x25); ILI9341_LCD_WriteData(0x34); ILI9341_LCD_WriteData(0x37); ILI9341_LCD_WriteData(0x01); ILI9341_LCD_WriteData(0x08); ILI9341_LCD_WriteData(0x07); ILI9341_LCD_WriteData(0x2B); ILI9341_LCD_WriteData(0x34); ILI9341_LCD_WriteData(0x0F); ILI9341_LCD_WriteReg(0x11); //Exit Sleep delay_ms(120); ILI9341_LCD_WriteReg(0x29); //Display on } delay_ms(50); } /****************************************************************************** Set the positions X, and Y of the display window; *****************************************************************************/ void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2) { ILI9341_LCD_WriteReg(0x2a);//Column address setting ILI9341_LCD_WriteData(x1>>8); ILI9341_LCD_WriteData(x1&0xff); ILI9341_LCD_WriteData(x2>>8); ILI9341_LCD_WriteData(x2&0xff); ILI9341_LCD_WriteReg(0x2b);//Line address setting ILI9341_LCD_WriteData(y1>>8); ILI9341_LCD_WriteData(y1&0xff); ILI9341_LCD_WriteData(y2>>8); ILI9341_LCD_WriteData(y2&0xff); ILI9341_LCD_WriteReg(0x2c);//Write in memory } static void LCD_SetCursor( uint16_t Xpos, uint16_t Ypos ) { uint16_t temp; #if (DISP_ORIENTATION == 0) #elif (DISP_ORIENTATION == 90) temp = Xpos; Xpos =Ypos; Ypos = MAX_X - 1 - temp; #elif (DISP_ORIENTATION == 180) Xpos = MAX_X - 1 - Xpos; Ypos = MAX_Y - 1 - Ypos; #elif (DISP_ORIENTATION == 270) temp = Ypos; Ypos = Xpos; Xpos = MAX_Y - 1 - temp; #endif ILI9341_LCD_WriteReg(0x2a); //Column address setting ILI9341_LCD_WriteData(Xpos>>8); ILI9341_LCD_WriteData(Xpos&0xff); ILI9341_LCD_WriteReg(0x2b); //Line address setting ILI9341_LCD_WriteData(Ypos>>8); ILI9341_LCD_WriteData(Ypos&0xff); } /****************************************************************************** Clearing screen function to make the whole screen display a certain color, *****************************************************************************/ void LCD_Clear(uint16_t Color) { uint32_t index=0; LCD_Address_Set(0,0,MAX_X-1,MAX_Y-1);//Set the display range for( index = 0; index < MAX_X * MAX_Y; index++ ) { ILI9341_LCD_WriteData(Color); } } int main(void) { //Delay and initialization system LCD_Initializtion(); //LCD initialization //LCD initialization LCD_Clear(Red); //Clear the screen to red //You can write a function to calibrate the screen. /* Infinite loop */ while (1) { //You can write a function to display the coordinates of the touch point on the LCD. } }