2.4" TFT - ILI9341 controller sample code.
//---------------------------------------------------------
/*
2.4in_TFT.c
Program snippets for writing to Newhaven Display 2.4" TFT with ILI9341 controller
(c)2013 Newhaven Display International, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
*/
//-------------------------------------------------------
/*******************************************************************************
* Function Name : TFT_24S_Write_Command
* Description : writes a 1 byte command to 2.4" TFT.
* Input : command = one byte command (register address)
* Output : None
* Return : None
*******************************************************************************/
void TFT_24S_Write_Command(unsigned int command)
{
GPIO_ResetBits(GPIOC, CS1);
GPIO_ResetBits(GPIOC, RS);
GPIO_SetBits(GPIOC, nRD);
GPIO_ResetBits(GPIOC, nWR);
GPIO_Write(GPIOB, command);
GPIO_SetBits(GPIOC, nWR);
TFT_delay(10);
}
/*******************************************************************************
* Function Name : TFT_24S_Write_Data
* Description : writes 1 byte of data to 2.4" TFT.
* Input : data1 = one byte of display data or command parameter
* Output : None
* Return : None
*******************************************************************************/
void TFT_24S_Write_Data(unsigned int data1)
{
GPIO_Write(GPIOB, data1);
GPIO_SetBits(GPIOC, RS);
GPIO_ResetBits(GPIOC, nWR);
GPIO_SetBits(GPIOC, nWR);
}
/*******************************************************************************
* Function Name : TFT_24_9341_demo
* Description : Loads bmp from SD card and writes to NHD-2.4-240320SF-CTXI#.
* Input : None
* Output : None
* Return : 1-end of function reached
*******************************************************************************/
int TFT_24_9341_demo(void)
{
char filename[18] = "2_4_240320SF_";
char filetype[4] = ".bmp";
char filenumber[1] = "0";
int i,n,result;
char image = 0x30;
unsigned short RGB16[25600];
unsigned char red,green,blue;
UINT blen;
GPIO_ResetBits(GPIOC, IM0); //16-bit mode
memset(RGB16,0x0000,sizeof(RGB16));
TFT_delay(100);
TFT_24_9341_Init();
TFT_delay(100);
filename[13]='\0';
filenumber[0] = image;
strncat(filename,filenumber,1);
strncat(filename,filetype,4);
while(1){
UILCD_SetCursor(0,0);UILCD_DisplayString("Reading SD Card ");UILCD_SetCursor(1,0);UILCD_DisplayString(" ");
UILCD_SetCursor(1,0);UILCD_DisplayString(filename);
if(openSD(filename)==0x30)
{while(1);}
seekSD(54);
TFT_24S_Write_Command(0x002C); //Memory write
for (n=0;n<3;n++){
memset(RGB16,0x0000,sizeof(RGB16));
for (i=0;i<25600;i++) //for each 24-bit pixel...
{
f_read(&File1, &blue, 1, &blen); //read the blue 8-bits
f_read(&File1, &green, 1, &blen); //read the green 8-bits
f_read(&File1, &red, 1, &blen); //read the red 8-bits
red=red>>3; //shift down to 5-bits
green=green>>2; //shift down to 6-bits
blue=blue>>3; //shift down to 5-bits
RGB16[i]= (RGB16[i] | red); //put red 5-bits into int
RGB16[i]= (RGB16[i] << 6); //move red bits over, make room for green
RGB16[i]= (RGB16[i] | green); //put green 6-bits into int
RGB16[i]= (RGB16[i] << 5); //move red and green bits over, make room for blue
RGB16[i]= (RGB16[i] | blue); //put blue 5-bits into int
GPIO_SetBits(GPIOC, RS);
GPIO_Write(GPIOB, (RGB16[i]));
GPIO_ResetBits(GPIOC, nWR);
GPIO_SetBits(GPIOC, nWR);
}
}
TFT_24S_Write_Command(0x0029); //display ON
result = f_close(&File1); // close file
if (result != FR_OK) {
UILCD_SetCursor(0,0);UILCD_DisplayString("File not Closed ");while(1);
return result;}
UILCD_SetCursor(0,0);UILCD_DisplayString("Press SEL button");UILCD_SetCursor(1,0);UILCD_DisplayString("for next file. ");
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)!=0){;}
image++;
if(image==0x3A){image=0x41;}
filename[13]='\0';
filenumber[0] = image;
strncat(filename,filenumber,1);
strncat(filename,filetype,4);
if(openSD(filename)==0x30)
{image=0x30;}
filename[13]='\0';
filenumber[0] = image;
strncat(filename,filenumber,1);
strncat(filename,filetype,4);
}
return 1;
}
/*******************************************************************************
* Function Name : TFT_24_9341_Init
* Description : Initializes LCD with built-in ILI9341 controller.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void TFT_24_9341_Init(void)
{
GPIO_ResetBits(GPIOC, CS1);
GPIO_SetBits(GPIOC, nRD);
GPIO_ResetBits(GPIOC, nWR);
GPIO_WriteBit(GPIOC, RES, Bit_RESET);
TFT_delay(100);
GPIO_WriteBit(GPIOC, RES, Bit_SET);
TFT_delay(100);
TFT_24S_Write_Command(0x0028);//display OFF
TFT_24S_Write_Command(0x0011);
TFT_24S_Write_Data(0x0000);//exit SLEEP mode
TFT_24S_Write_Command(0x00CB);//Power Control A
TFT_24S_Write_Data(0x0039);//always 0x39
TFT_24S_Write_Data(0x002C);//always 0x2C
TFT_24S_Write_Data(0x0000);//always 0x00
TFT_24S_Write_Data(0x0034);//Vcore = 1.6V
TFT_24S_Write_Data(0x0002);//DDVDH = 5.6V
TFT_24S_Write_Command(0x00CF);//Power Control B
TFT_24S_Write_Data(0x0000);//always 0x00
TFT_24S_Write_Data(0x0081);//PCEQ off
TFT_24S_Write_Data(0x0030);//ESD protection
TFT_24S_Write_Command(0x00E8);//Driver timing control A
TFT_24S_Write_Data(0x0085);//non-overlap
TFT_24S_Write_Data(0x0001);//EQ timing
TFT_24S_Write_Data(0x0079);//Pre-charge timing
TFT_24S_Write_Command(0x00EA);//Driver timing control B
TFT_24S_Write_Data(0x0000);//Gate driver timing
TFT_24S_Write_Data(0x0000);//always 0x00
TFT_24S_Write_Command(0x00ED);//Power-On sequence control
TFT_24S_Write_Data(0x0064);//soft start
TFT_24S_Write_Data(0x0003);//power on sequence
TFT_24S_Write_Data(0x0012);//power on sequence
TFT_24S_Write_Data(0x0081);//DDVDH enhance on
TFT_24S_Write_Command(0x00F7);//Pump ratio control
TFT_24S_Write_Data(0x0020);//DDVDH=2xVCI
TFT_24S_Write_Command(0x00C0);//power control 1
TFT_24S_Write_Data(0x0026);
TFT_24S_Write_Command(0x00C1);//power control 2
TFT_24S_Write_Data(0x0011);
TFT_24S_Write_Command(0x00C5);//VCOM control 1
TFT_24S_Write_Data(0x0035);
TFT_24S_Write_Data(0x003E);
TFT_24S_Write_Command(0x00C7);//VCOM control 2
TFT_24S_Write_Data(0x00BE);
TFT_24S_Write_Command(0x0036);//memory access control = BGR
TFT_24S_Write_Data(0x0088);
TFT_24S_Write_Command(0x00B1);//frame rate control
TFT_24S_Write_Data(0x0000);
TFT_24S_Write_Data(0x0010);
TFT_24S_Write_Command(0x00B6);//display function control
TFT_24S_Write_Data(0x000A);
TFT_24S_Write_Data(0x00A2);
TFT_24S_Write_Command(0x003A);//pixel format = 16 bit per pixel
TFT_24S_Write_Data(0x0055);
TFT_24S_Write_Command(0x00F2);//3G Gamma control
TFT_24S_Write_Data(0x0002);//off
TFT_24S_Write_Command(0x0026);//Gamma curve 3
TFT_24S_Write_Data(0x0001);
/*
TFT_24S_Write_Command(0x00E0);TFT_24S_Write_Data(0x001F);//positive gamma correction
TFT_24S_Write_Data(0x001B);
TFT_24S_Write_Data(0x0018);
TFT_24S_Write_Data(0x000B);
TFT_24S_Write_Data(0x000F);
TFT_24S_Write_Data(0x0009);
TFT_24S_Write_Data(0x0046);
TFT_24S_Write_Data(0x00B5);
TFT_24S_Write_Data(0x0037);
TFT_24S_Write_Data(0x000A);
TFT_24S_Write_Data(0x000C);
TFT_24S_Write_Data(0x0007);
TFT_24S_Write_Data(0x0007);
TFT_24S_Write_Data(0x0005);
TFT_24S_Write_Data(0x0000);
TFT_24S_Write_Command(0x00E1);TFT_24S_Write_Data(0x0000);//negative gamma correction
TFT_24S_Write_Data(0x0024);
TFT_24S_Write_Data(0x0027);
TFT_24S_Write_Data(0x0004);
TFT_24S_Write_Data(0x0010);
TFT_24S_Write_Data(0x0006);
TFT_24S_Write_Data(0x0039);
TFT_24S_Write_Data(0x0074);
TFT_24S_Write_Data(0x0048);
TFT_24S_Write_Data(0x0005);
TFT_24S_Write_Data(0x0013);
TFT_24S_Write_Data(0x0038);
TFT_24S_Write_Data(0x0038);
TFT_24S_Write_Data(0x003A);
TFT_24S_Write_Data(0x001F);
*/
TFT_24S_Write_Command(0x002A);
TFT_24S_Write_Data(0x0000);//column address set
TFT_24S_Write_Data(0x0000);//start 0x0000
TFT_24S_Write_Data(0x0000);
TFT_24S_Write_Data(0x00EF);//end 0x00EF
TFT_24S_Write_Command(0x002B);
TFT_24S_Write_Data(0x0000);//page address set
TFT_24S_Write_Data(0x0000);//start 0x0000
TFT_24S_Write_Data(0x0001);
TFT_24S_Write_Data(0x003F);//end 0x013F
}
/*-------------------------------------------------------*/