ILI9488 coordinate not start from the left of the screen
ccldmf opened this issue · 1 comments
Hello,
I meet an issue that the start coordinate not start the left of the screen, it's start the right of the screen. I have checked the ili9488_Init(), but not found the helpful information. It's normal for me to use other's code, the follwing is the ili9488 init code:
LCD_WR_REG(0XD3);
LCD.ID=LCD_RD_DATA();
LCD.ID=LCD_RD_DATA();
LCD.ID=LCD_RD_DATA();
LCD.ID<<=8;
LCD.ID|=LCD_RD_DATA();
printf(" LCD ID:ILI%x\r\n",LCD.ID);
if(LCD.ID!=0x9488)while(1);
LCD_WR_REG(0xE0); //P-Gamma
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x03);
LCD_WR_DATA(0x0C);
LCD_WR_DATA(0x09);
LCD_WR_DATA(0x17);
LCD_WR_DATA(0x09);
LCD_WR_DATA(0x3E);
LCD_WR_DATA(0x89);
LCD_WR_DATA(0x49);
LCD_WR_DATA(0x08);
LCD_WR_DATA(0x0D);
LCD_WR_DATA(0x0A);
LCD_WR_DATA(0x13);
LCD_WR_DATA(0x15);
LCD_WR_DATA(0x0F);
LCD_WR_REG(0XE1); //N-Gamma
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x11);
LCD_WR_DATA(0x15);
LCD_WR_DATA(0x03);
LCD_WR_DATA(0x0F);
LCD_WR_DATA(0x05);
LCD_WR_DATA(0x2D);
LCD_WR_DATA(0x34);
LCD_WR_DATA(0x41);
LCD_WR_DATA(0x02);
LCD_WR_DATA(0x0B);
LCD_WR_DATA(0x0A);
LCD_WR_DATA(0x33);
LCD_WR_DATA(0x37);
LCD_WR_DATA(0x0F);
LCD_WR_REG(0XC0); //Power Control 1
LCD_WR_DATA(0x17); //Vreg1out
LCD_WR_DATA(0x15); //Verg2out
LCD_WR_REG(0xC1); //Power Control 2
LCD_WR_DATA(0x41); //VGH,VGL
LCD_WR_REG(0xC5); //Power Control 3
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x12); //Vcom
LCD_WR_DATA(0x80);
LCD_WR_REG(0x36); //Memory Access
LCD_WR_DATA(0x48);
LCD_WR_REG(0x3A); // Interface Pixel Format
LCD_WR_DATA(0x55); ///?????
LCD_WR_REG(0XB0); // Interface Mode Control
LCD_WR_DATA(0x00);
LCD_WR_REG(0xB1); //Frame rate
LCD_WR_DATA(0xA0); //60Hz
LCD_WR_REG(0xB4); //Display Inversion Control
LCD_WR_DATA(0x02); //2-dot
LCD_WR_REG(0XB6); //RGB/MCU Interface Control
LCD_WR_DATA(0x02); //MCU
LCD_WR_DATA(0x02); //Source,Gate scan dieection
LCD_WR_REG(0XE9); // Set Image Function
LCD_WR_DATA(0x00); // Disable 24 bit data input
LCD_WR_REG(0xF7);// Adjust Control
LCD_WR_DATA(0xA9);
LCD_WR_DATA(0x51);
LCD_WR_DATA(0x2C);
LCD_WR_DATA(0x82);
// D7 stream, loose
LCD_WR_REG(0x11); //Sleep out
LCD_Delay(120);
LCD_WR_REG(0x29); //Display on
LCD_DisplayMode(Mode_V); // Set display mode
LCD_Clear(); // clear the screen
The LCD_DisplayMode() function like this:
void LCD_DisplayMode(uint8_t direction)
{
if (LCD.Direction == Mode_H)
{
LCD_WR_REG(0X36);
LCD_WR_DATA(0X28);
LCD_WR_REG(0x2A);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x01);
LCD_WR_DATA(0XDF);
LCD_WR_REG(0x2B);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x01);
LCD_WR_DATA(0x3F);
}
else if(LCD.Direction == Mode_V)
{
LCD_WR_REG(0X36);
LCD_WR_DATA(0X48);
LCD_WR_REG(0x2A);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x01);
LCD_WR_DATA(0x3F);
LCD_WR_REG(0x2B);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x01);
LCD_WR_DATA(0XDF);
}
}
The LCD_Clear() like this:
void LCD_Clear(void)
{
uint32_t i = 0;
LCD_SetCursor(0,0);
LCD_WR_REG(0X2C);
for(i=0;i<320*480;i++)
{
*(__IO uint16_t*) FSMC_DATA = LCD.BackColor;
}
}
void LCD_SetCursor(uint16_t x, uint16_t y)
{
LCD_WR_REG(0x2A);
LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);
LCD_WR_DATA(0x01);
LCD_WR_DATA(0xDF);
LCD_WR_REG(0x2B);
LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);
LCD_WR_DATA(0x01);
LCD_WR_DATA(0xDF);
}
Could you tell me what register i was missed? How can i check this issue?
Thank you very much!
The drawing directions are contained in these macros:
#define ILI9488_MAD_X_LEFT 0x00
#define ILI9488_MAD_X_RIGHT 0x40
#define ILI9488_MAD_Y_UP 0x80
#define ILI9488_MAD_Y_DOWN 0x00
The left and right directions can be swapped as follows:
#define ILI9488_MAD_X_LEFT 0x40
#define ILI9488_MAD_X_RIGHT 0x00