ILI9488

General discussion on mikroC PRO for PIC32.
Post Reply
Author
Message
cfarizano
Posts: 3
Joined: 10 Nov 2016 19:19

ILI9488

#1 Post by cfarizano » 25 Apr 2019 05:16

Hello, I need help because I can not make the display tft work with ILI9488, I got arduino information about how the startup sequence would be but I can not make it work.

Code: Select all

/***************************** ILI9488 *****************************/
/**
  * @brief  Move cursor to designated coordinates, in preparation for drawing on display.
  * @param  x : X coordinate. Range shoud be [0 - TFT_DISP_WIDTH-1]
  * @param  y : Y coordinate. Range shoud be [0 - TFT_DISP_HEIGHT-1]
  */
void TFT_Set_Address_ILI9488(unsigned int x, unsigned int y) {
    TFT_CS = 0;
    TFT_Set_Index_Ptr(0x2A);
    TFT_Write_Command_Ptr(x>>8);
    TFT_Write_Command_Ptr(x);
    TFT_Write_Command_Ptr(0x1);
    TFT_Write_Command_Ptr(0xDF);

    TFT_Set_Index_Ptr(0x2B);
    TFT_Write_Command_Ptr(y>>8);
    TFT_Write_Command_Ptr(y);
    TFT_Write_Command_Ptr(0x1);
    TFT_Write_Command_Ptr(0x3F);

    TFT_Set_Index_Ptr(0x2C);
    TFT_CS = 1;
}

/**
  * @brief  Configures sets of TFT controllers register to work with parameters
  *         assigneg in TFT_Init. Also it resets the TFT controller.
  */
static void TFT_Reset_ILI9488(){
    // Hold in reset
    TFT_RST = 0;
    // Set reset pin as output
    TFT_RST_Direction = 0;

    // Enable data access
    TFT_RS = 1;
    // Set RS pin as output
    TFT_RS_Direction = 0;

    // Disable LCD
    TFT_CS = 1;
    // Set LCD CS pin as output
    TFT_CS_Direction = 0;

    TFT_RD_Direction = 0;
    TFT_WR_Direction = 0;
    TFT_RD = 1;
    TFT_WR = 1;

    TFT_RST = 1;
    Delay_100ms();
    TFT_RST = 0;
    Delay_100ms();
    TFT_RST = 1;
    Delay_100ms();

    TFT_CS = 0;

	//0xE0, 15, 0x00, 0x07, 0x10, 0x09, 0x17, 0x0B, 0x40, 0x8A, 0x4B, 0x0A, 0x0D, 0x0F, 0x15, 0x16, 0x0F,
    TFT_Set_Index_Ptr(0xE0);
    TFT_Write_Command_Ptr(0x00);
    TFT_Write_Command_Ptr(0x07);
    TFT_Write_Command_Ptr(0x10);
    TFT_Write_Command_Ptr(0x09);
    TFT_Write_Command_Ptr(0x17);
    TFT_Write_Command_Ptr(0x0B);
    TFT_Write_Command_Ptr(0x40);
    TFT_Write_Command_Ptr(0x8A);
    TFT_Write_Command_Ptr(0x4B);
    TFT_Write_Command_Ptr(0x0A);
    TFT_Write_Command_Ptr(0x0D);
    TFT_Write_Command_Ptr(0x0F);
    TFT_Write_Command_Ptr(0x15);
    TFT_Write_Command_Ptr(0x16);
    TFT_Write_Command_Ptr(0x0F);

    //0xE1, 15, 0x00, 0x1A, 0x1B, 0x02, 0x0D, 0x05, 0x30, 0x35, 0x43, 0x02, 0x0A, 0x09, 0x32, 0x36, 0x0F,
    TFT_Set_Index_Ptr(0XE1);
    TFT_Write_Command_Ptr(0x00);
    TFT_Write_Command_Ptr(0x1A);
    TFT_Write_Command_Ptr(0x1B);
    TFT_Write_Command_Ptr(0x02);
    TFT_Write_Command_Ptr(0x0D);
    TFT_Write_Command_Ptr(0x05);
    TFT_Write_Command_Ptr(0x30);
    TFT_Write_Command_Ptr(0x35);
    TFT_Write_Command_Ptr(0x43);
    TFT_Write_Command_Ptr(0x02);
    TFT_Write_Command_Ptr(0x0A);
    TFT_Write_Command_Ptr(0x09);
    TFT_Write_Command_Ptr(0x32);
    TFT_Write_Command_Ptr(0x36);
    TFT_Write_Command_Ptr(0x0F);

    //0xB1,  1, 0xA0,
    TFT_Set_Index_Ptr(0xB1);      //Frame rate
    TFT_Write_Command_Ptr(0xA0);    //60Hz

	//0xB4,  1, 0x02,
    TFT_Set_Index_Ptr(0xB4);      //Display Inversion Control
    TFT_Write_Command_Ptr(0x02);    //2-dot
    
    //0xC0,  2, 0x17, 0x15,
    TFT_Set_Index_Ptr(0XC0);      //Power Control 1
    TFT_Write_Command_Ptr(0x17);    //Vreg1out
    TFT_Write_Command_Ptr(0x15);    //Verg2out

    //0xC1,  1, 0x41,
    TFT_Set_Index_Ptr(0xC1);      //Power Control 2
    TFT_Write_Command_Ptr(0x41);    //VGH,VGL

    //0xC5,  3, 0x00, 0x0A, 0x80,
    TFT_Set_Index_Ptr(0xC5);      //Power Control 3
    TFT_Write_Command_Ptr(0x00);
    TFT_Write_Command_Ptr(0x0A);    //Vcom
    TFT_Write_Command_Ptr(0x80);

    //0xB6,  1, 0x02,
    TFT_Set_Index_Ptr(0XB6);      //Display Function Control  RGB/MCU Interface Control
    TFT_Write_Command_Ptr(0x02);    //MCU

    //0x36,  1, 0x48,
    TFT_Set_Index_Ptr(0x36);      //Memory Access
    TFT_Write_Command_Ptr(0x48);

    //0x3A,  1, 0x55,
    TFT_Set_Index_Ptr(0x3A);      // Interface Pixel Format
    TFT_Write_Command_Ptr(0x55);           //18 bit

    //0xE9,  1, 0x00,
    TFT_Set_Index_Ptr(0XE9);      // Set Image Functio
    TFT_Write_Command_Ptr(0x00);    // Disable 24 bit data
        
    //0xF7,  4, 0xA9 ,0x51, 0x2C, 0x82,
    TFT_Set_Index_Ptr(0xF7);      // Adjust Control
    TFT_Write_Command_Ptr(0xA9);
    TFT_Write_Command_Ptr(0x51);
    TFT_Write_Command_Ptr(0x2C);
    TFT_Write_Command_Ptr(0x82);    // D7 stream, loose

    TFT_Set_Index_Ptr(0x11);    //Exit Sleep
    Delay_ms(120);

    TFT_Set_Index_Ptr(0x29);    //Display on
    Delay_ms(500);
    TFT_CS = 1;
}
/**
  * @brief  Complete initializing procedure for TFT controller (ILI9486)
  * @param  display_width  : Width of display (in pixels).
  * @param  display_height : Height of display (in pixels).
  */
void TFT_Init_ILI9488(unsigned int display_width, unsigned int display_height) {
  __controller = _16BIT_CONTROLLER;
  if (Is_TFT_Set() != 1) {
    TFT_Set_Index_Ptr = TFT_Set_Index;
    TFT_Write_Command_Ptr = TFT_Write_Command;
    TFT_Write_Data_Ptr = TFT_16bit_Write_Data;
  }

  TFT_DISP_WIDTH = display_width;
  TFT_DISP_HEIGHT = display_height;
  if (display_width >= display_height)
    TFT_Disp_Rotation = 0;
  else
    TFT_Disp_Rotation = 90;

  TFT_Set_Pen(CL_BLACK, 1);
  TFT_Set_Brush(0, 0, 0, 0, 0, 0);

  TFT_Move_Cursor(0, 0);
  ExternalFontSet = 0;
  TFT_Set_DataPort_Direction();
  // Reset device
  TFT_Reset_ILI9488();
  TFT_Set_Address_Ptr = TFT_Set_Address_ILI9488;
}

/**
  * @brief  Complete initializing procedure for TFT controller (ILI9486)
  * without setting TFT_DataPort direction.
  * This procedure should be used when calls to custom TFT routines are used.
  * Must be used with TFT_Set_Active.
  * @param  display_width  : Width of display (in pixels).
  * @param  display_height : Height of display (in pixels).
  */
void TFT_Init_ILI9488_Custom(unsigned int display_width, unsigned int display_height) {
  __controller = _16BIT_CONTROLLER;
  if (Is_TFT_Set() != 1) {
    TFT_Set_Index_Ptr = TFT_Set_Index;
    TFT_Write_Command_Ptr = TFT_Write_Command;
    TFT_Write_Data_Ptr = TFT_16bit_Write_Data;
  }

  TFT_DISP_WIDTH = display_width;
  TFT_DISP_HEIGHT = display_height;
  if (display_width >= display_height)
    TFT_Disp_Rotation = 0;
  else
    TFT_Disp_Rotation = 90;

  TFT_Set_Pen(CL_BLACK, 1);
  TFT_Set_Brush(0, 0, 0, 0, 0, 0);

  TFT_Move_Cursor(0, 0);
  ExternalFontSet = 0;
  // Reset device
  TFT_Reset_ILI9486();
  TFT_Set_Address_Ptr = TFT_Set_Address_ILI9488;
}
/*************************** eof ILI9488 ***************************/

/************************** ILI9488 (8bit) *************************/
/**
  * @brief  Complete initializing procedure for TFT controller (ILI9486)
  * @param  display_width  : Width of display (in pixels).
  * @param  display_height : Height of display (in pixels).
  */
void TFT_Init_ILI9488_8bit(unsigned int display_width, unsigned int display_height) {
 __controller = _8BIT_CONTROLLER;
  if (Is_TFT_Set() != 1) {
    TFT_Set_Index_Ptr = TFT_Set_Index;
    TFT_Write_Command_Ptr = TFT_Write_Command;
    TFT_Write_Data_Ptr = TFT_Write_Data;
  }

  TFT_DISP_WIDTH = display_width;
  TFT_DISP_HEIGHT = display_height;
  TFT_Set_Pen(CL_BLACK, 1);
  TFT_Set_Brush(0, 0, 0, 0, 0, 0);

  TFT_Move_Cursor(0, 0);
  ExternalFontSet = 0;
  TFT_Set_DataPort_Direction();
  // Reset device
  TFT_Reset_ILI9488();
  TFT_Rotacion( display_width, display_height,180);
  TFT_Set_Address_Ptr = TFT_Set_Address_ILI9488;
}

/**
  * @brief  Complete initializing procedure for TFT controller (ILI9486)
  * without setting TFT_DataPort direction.
  * This procedure should be used when calls to custom TFT routines are used.
  * Must be used with TFT_Set_Active.
  * @param  display_width  : Width of display (in pixels).
  * @param  display_height : Height of display (in pixels).
  */
void TFT_Init_ILI9488_8bit_Custom(unsigned int display_width, unsigned int display_height) {
  __controller = _8BIT_CONTROLLER;
  if (Is_TFT_Set() != 1) {
    TFT_Set_Index_Ptr = TFT_Set_Index;
    TFT_Write_Command_Ptr = TFT_Write_Command;
    TFT_Write_Data_Ptr = TFT_Write_Data;
  }

  TFT_DISP_WIDTH = display_width;
  TFT_DISP_HEIGHT = display_height;


  TFT_Set_Pen(CL_BLACK, 1);
  TFT_Set_Brush(0, 0, 0, 0, 0, 0);

  TFT_Move_Cursor(0, 0);
  ExternalFontSet = 0;
  // Reset device
  TFT_Reset_ILI9488();
  //TFT_Rotacion( display_width, display_height,0);
  TFT_Set_Address_Ptr = TFT_Set_Address_ILI9488;
}
/************************ eof ILI9488 (8bit) ************************/

cfarizano
Posts: 3
Joined: 10 Nov 2016 19:19

Re: ILI9488

#2 Post by cfarizano » 26 Apr 2019 17:21

cfarizano wrote:Here I get it to work correctly

Code: Select all

#define TFT_Write_Strobe() TFT_WR = 0; Delay_Cyc(6); TFT_WR = 1; Delay_Cyc(8);  // VERY IMPORTANT

/***************************** ILI9488 *****************************/
/**
  * @brief  Move cursor to designated coordinates, in preparation for drawing on display.
  * @param  x : X coordinate. Range shoud be [0 - TFT_DISP_WIDTH-1]
  * @param  y : Y coordinate. Range shoud be [0 - TFT_DISP_HEIGHT-1]
  */
void TFT_Set_Address_ILI9488(unsigned int x, unsigned int y) {
    TFT_Set_Index_Ptr(0x2A);
    
    TFT_Write_Command_Ptr(x>>8);
    TFT_Write_Command_Ptr(x);
    TFT_Write_Command_Ptr(0x1);         // 380-1
    TFT_Write_Command_Ptr(0x3F);
    
    TFT_Set_Index_Ptr(0x2B);
    
    TFT_Write_Command_Ptr(y>>8);
    TFT_Write_Command_Ptr(y);
    TFT_Write_Command_Ptr(0x1);         // 420-1
    TFT_Write_Command_Ptr(0xDF);
    
    TFT_Set_Index_Ptr(0x2C);
}

/**
  * @brief  Configures sets of TFT controllers register to work with parameters
  *         assigneg in TFT_Init. Also it resets the TFT controller.
  */
static void TFT_Reset_ILI9488(){
    TFT_RST = 0;
    // Set reset pin as output
    TFT_RST_Direction = 0;

    // Enable data access
    TFT_RS = 1;
    // Set RS pin as output
    TFT_RS_Direction = 0;

    // Disable LCD
    TFT_CS = 1;
    // Set LCD CS pin as output
    TFT_CS_Direction = 0;

    TFT_RD_Direction = 0;
    TFT_WR_Direction = 0;
    TFT_RD = 1;
    TFT_WR = 1;

    TFT_RST = 1;
    Delay_ms(5);
    TFT_RST = 0;
    Delay_ms(10);
    TFT_RST = 1;
    Delay_ms(120);

    TFT_CS = 0;
    TFT_Set_Index_Ptr(0x01);    //Soft Reset
    Delay_ms(120);              // .kbv will power up with ONLY reset, sleep out, display on
    TFT_Set_Index_Ptr(0x28);    //Display Off
    
    TFT_Set_Index_Ptr(0x3A);    //Pixel read=565, write=565.
    TFT_Write_Command_Ptr(0x55);

    //0xE0, 15, 0x00, 0x07, 0x10, 0x09, 0x17, 0x0B, 0x40, 0x8A, 0x4B, 0x0A, 0x0D, 0x0F, 0x15, 0x16, 0x0F,
    TFT_Set_Index_Ptr(0xE0);
    TFT_Write_Command_Ptr(0x00);
    TFT_Write_Command_Ptr(0x07);
    TFT_Write_Command_Ptr(0x10);
    TFT_Write_Command_Ptr(0x09);
    TFT_Write_Command_Ptr(0x17);
    TFT_Write_Command_Ptr(0x0B);
    TFT_Write_Command_Ptr(0x40);
    TFT_Write_Command_Ptr(0x8A);
    TFT_Write_Command_Ptr(0x4B);
    TFT_Write_Command_Ptr(0x0A);
    TFT_Write_Command_Ptr(0x0D);
    TFT_Write_Command_Ptr(0x0F);
    TFT_Write_Command_Ptr(0x15);
    TFT_Write_Command_Ptr(0x16);
    TFT_Write_Command_Ptr(0x0F);

    //0xE1, 15, 0x00, 0x1A, 0x1B, 0x02, 0x0D, 0x05, 0x30, 0x35, 0x43, 0x02, 0x0A, 0x09, 0x32, 0x36, 0x0F,
    TFT_Set_Index_Ptr(0XE1);
    TFT_Write_Command_Ptr(0x00);
    TFT_Write_Command_Ptr(0x1A);
    TFT_Write_Command_Ptr(0x1B);
    TFT_Write_Command_Ptr(0x02);
    TFT_Write_Command_Ptr(0x0D);
    TFT_Write_Command_Ptr(0x05);
    TFT_Write_Command_Ptr(0x30);
    TFT_Write_Command_Ptr(0x35);
    TFT_Write_Command_Ptr(0x43);
    TFT_Write_Command_Ptr(0x02);
    TFT_Write_Command_Ptr(0x0A);
    TFT_Write_Command_Ptr(0x09);
    TFT_Write_Command_Ptr(0x32);
    TFT_Write_Command_Ptr(0x36);
    TFT_Write_Command_Ptr(0x0F);
    
    //0xC0, 2, 0x10, 0x10,              //Power Control 1 [0E 0E]
    TFT_Set_Index_Ptr(0XC0);
    TFT_Write_Command_Ptr(0x10);
    TFT_Write_Command_Ptr(0x10);

    //0xC1, 1, 0x41,                    //Power Control 2 [43]
    TFT_Set_Index_Ptr(0xC1);
    TFT_Write_Command_Ptr(0x41);

    //0xC5, 4, 0x00, 0x22, 0x80, 0x40,  //VCOM  Control 1 [00 40 00 40]
    TFT_Set_Index_Ptr(0xC5);
    TFT_Write_Command_Ptr(0x00);
    TFT_Write_Command_Ptr(0x22);
    TFT_Write_Command_Ptr(0x80);
    TFT_Write_Command_Ptr(0x40);

    //0x36, 1, 0x48,                    //Memory Access [00]
    TFT_Set_Index_Ptr(0x36);
    TFT_Write_Command_Ptr(0x48);

    //0xB0, 1, 0x00,                    //Interface     [00]
    TFT_Set_Index_Ptr(0xB0);
    TFT_Write_Command_Ptr(0x00);

    //0xB1, 2, 0xB0, 0x11,              //Frame Rate Control [B0 11]
    TFT_Set_Index_Ptr(0xB1);
    TFT_Write_Command_Ptr(0xB0);
    TFT_Write_Command_Ptr(0x11);
    
    //0xB4, 1, 0x02,                    //Inversion Control [02]
    TFT_Set_Index_Ptr(0xB4);
    TFT_Write_Command_Ptr(0x02);
    
    //0xB6, 3, 0x02, 0x02, 0x3B,        // Display Function Control [02 02 3B] .kbv NL=480
    TFT_Set_Index_Ptr(0XB6);
    TFT_Write_Command_Ptr(0x02);
    TFT_Write_Command_Ptr(0x02);
    TFT_Write_Command_Ptr(0x3B);

    //0xB7, 1, 0xC6,                    //Entry Mode      [06]
    TFT_Set_Index_Ptr(0XB7);
    TFT_Write_Command_Ptr(0xC6);

    //0x3A, 1, 0x55,                    //Interlace Pixel Format [XX]
    TFT_Set_Index_Ptr(0x3A);
    TFT_Write_Command_Ptr(0x55);

    //0xE9,  1, 0x00,
    TFT_Set_Index_Ptr(0XE9);
    TFT_Write_Command_Ptr(0x00);

    //0xF7, 4, 0xA9, 0x51, 0x2C, 0x82,    //Adjustment Control 3 [A9 51 2C 82]
    TFT_Set_Index_Ptr(0xF7);
    TFT_Write_Command_Ptr(0xA9);
    TFT_Write_Command_Ptr(0x51);
    TFT_Write_Command_Ptr(0x2C);
    TFT_Write_Command_Ptr(0x82);

    TFT_Set_Index_Ptr(0x11);    //Exit Sleep
    Delay_ms(150);

    TFT_Set_Index_Ptr(0x29);    //Display on

    TFT_CS = 1;
}

/**
  * @brief  Complete initializing procedure for TFT controller (ILI9488)
  * @param  display_width  : Width of display (in pixels).
  * @param  display_height : Height of display (in pixels).
  */
void TFT_Init_ILI9488(unsigned int display_width, unsigned int display_height) {
  __controller = _16BIT_CONTROLLER;
  if (Is_TFT_Set() != 1) {
    TFT_Set_Index_Ptr = TFT_Set_Index;
    TFT_Write_Command_Ptr = TFT_Write_Command;
    TFT_Write_Data_Ptr = TFT_16bit_Write_Data;
  }

  TFT_DISP_WIDTH = display_width;
  TFT_DISP_HEIGHT = display_height;
  if (display_width >= display_height)
    TFT_Disp_Rotation = 0;
  else
    TFT_Disp_Rotation = 90;

  TFT_Set_Pen(CL_BLACK, 1);
  TFT_Set_Brush(0, 0, 0, 0, 0, 0);

  TFT_Move_Cursor(0, 0);
  ExternalFontSet = 0;
  TFT_Set_DataPort_Direction();
  // Reset device
  TFT_Reset_ILI9488();
  TFT_Set_Address_Ptr = TFT_Set_Address_ILI9488;
}

/**
  * @brief  Complete initializing procedure for TFT controller (ILI9488)
  * without setting TFT_DataPort direction.
  * This procedure should be used when calls to custom TFT routines are used.
  * Must be used with TFT_Set_Active.
  * @param  display_width  : Width of display (in pixels).
  * @param  display_height : Height of display (in pixels).
  */
void TFT_Init_ILI9488_Custom(unsigned int display_width, unsigned int display_height) {
  __controller = _16BIT_CONTROLLER;
  if (Is_TFT_Set() != 1) {
    TFT_Set_Index_Ptr = TFT_Set_Index;
    TFT_Write_Command_Ptr = TFT_Write_Command;
    TFT_Write_Data_Ptr = TFT_16bit_Write_Data;
  }

  TFT_DISP_WIDTH = display_width;
  TFT_DISP_HEIGHT = display_height;
  if (display_width >= display_height)
    TFT_Disp_Rotation = 0;
  else
    TFT_Disp_Rotation = 90;

  TFT_Set_Pen(CL_BLACK, 1);
  TFT_Set_Brush(0, 0, 0, 0, 0, 0);

  TFT_Move_Cursor(0, 0);
  ExternalFontSet = 0;
  // Reset device
  TFT_Reset_ILI9486();
  TFT_Set_Address_Ptr = TFT_Set_Address_ILI9488;
}
/*************************** eof ILI9488 ***************************/

/************************** ILI9488 (8bit) *************************/
/**
  * @brief  Complete initializing procedure for TFT controller (ILI9488)
  * @param  display_width  : Width of display (in pixels).
  * @param  display_height : Height of display (in pixels).
  */
void TFT_Init_ILI9488_8bit(unsigned int display_width, unsigned int display_height) {
 __controller = _8BIT_CONTROLLER;
  if (Is_TFT_Set() != 1) {
    TFT_Set_Index_Ptr = TFT_Set_Index;
    TFT_Write_Command_Ptr = TFT_Write_Command;
    TFT_Write_Data_Ptr = TFT_Write_Data;
  }

  TFT_DISP_WIDTH = display_width;
  TFT_DISP_HEIGHT = display_height;
  TFT_Set_Pen(CL_BLACK, 1);
  TFT_Set_Brush(0, 0, 0, 0, 0, 0);

  TFT_Move_Cursor(0, 0);
  ExternalFontSet = 0;
  TFT_Set_DataPort_Direction();
  // Reset device
  TFT_Reset_ILI9488();
  //TFT_Rotacion( display_width, display_height,0);
  TFT_Set_Address_Ptr = TFT_Set_Address_ILI9488;
}

/**
  * @brief  Complete initializing procedure for TFT controller (ILI9488)
  * without setting TFT_DataPort direction.
  * This procedure should be used when calls to custom TFT routines are used.
  * Must be used with TFT_Set_Active.
  * @param  display_width  : Width of display (in pixels).
  * @param  display_height : Height of display (in pixels).
  */
void TFT_Init_ILI9488_8bit_Custom(unsigned int display_width, unsigned int display_height) {
  __controller = _8BIT_CONTROLLER;
  if (Is_TFT_Set() != 1) {
    TFT_Set_Index_Ptr = TFT_Set_Index;
    TFT_Write_Command_Ptr = TFT_Write_Command;
    TFT_Write_Data_Ptr = TFT_Write_Data;
  }

  TFT_DISP_WIDTH = display_width;
  TFT_DISP_HEIGHT = display_height;


  TFT_Set_Pen(CL_BLACK, 1);
  TFT_Set_Brush(0, 0, 0, 0, 0, 0);

  TFT_Move_Cursor(0, 0);
  ExternalFontSet = 0;
  // Reset device
  TFT_Reset_ILI9488();
  //TFT_Rotacion( display_width, display_height,0);
  TFT_Set_Address_Ptr = TFT_Set_Address_ILI9488;
}
/************************ eof ILI9488 (8bit) ************************/

Post Reply

Return to “mikroC PRO for PIC32 General”