RobertoBenjami/stm32_graphics_display_drivers

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