Problema de imagen en el dibujo de la pantalla LCD de Arduino

2

Estoy jugando con la pantalla TFT de 3,5 "(400x240 chino controlador de 8 bits desconocido) que se coloca en la placa Arduino Mega 2560 R3.

Mi objetivo final es tomar los datos .raw de la tarjeta SD y dibujarlos en la pantalla.

Lo que he hecho hasta ahora:

- Mi dibujo en el bosquejo:

void LoadImage(File& file)
{
    for (int y = 0; y < SCREEN_HEIGHT && file.available(); y++) {
        uint16_t buf[SCREEN_WIDTH];
        for (int x = SCREEN_WIDTH - 1; x >= 0; x--) {
            byte l = file.read();
            byte h = file.read();
            buf[x] = ((uint16_t)h << 8) | l;
        }
        myGLCD.drawPixelLine(0, y, SCREEN_WIDTH, buf);
    }
}

- Para la implementación del método de referencia drawPixelLine desde la biblioteca UTFT:

void UTFT::drawPixelLine(int x, int y, int sx, uint16_t* data)
{
    unsigned int col;
    cbi(P_CS, B_CS);
    setXY(x, y, x+sx-1, y);
    for (int tc=0; tc<sx; tc++)
    {
        char* p = (char*)&data[tc];
        LCD_Write_DATA(*(p + 1), *p);
    }
    sbi(P_CS, B_CS);
}
void UTFT::setXY(word x1, word y1, word x2, word y2)
{
    if (orient==LANDSCAPE)
    {
        swap(word, x1, y1);
        swap(word, x2, y2)
        y1=disp_y_size-y1;
        y2=disp_y_size-y2;
        swap(word, y1, y2)
    }
        LCD_Write_COM(0x2a);
        LCD_Write_DATA(x1>>8);
        LCD_Write_DATA(x1);
        LCD_Write_DATA(x2>>8);
        LCD_Write_DATA(x2);
        LCD_Write_COM(0x2b);
        LCD_Write_DATA(y1>>8);
        LCD_Write_DATA(y1);
        LCD_Write_DATA(y2>>8);
        LCD_Write_DATA(y2);
        LCD_Write_COM(0x2c);                             
}

Mi representación actual:

Imagendeseada:

TFT Lcd y Mega Board

ACTUALIZADO1

Ejecutélapruebadehenningandelabibliotecautft,dibujandoelgráficosin/cosycuadradossimples

Aquí hay un intento de representar datos en bruto de 100x100 cuadrados amarillos

    
pregunta Neil Galiaskarov

3 respuestas

4

Mirando la función SetXY, parece que el controlador podría ser ILI9341. Aquí hay una hoja de datos para ese controlador: enlace .

Hay dos puntos que me llaman la atención en este momento; con suerte, a medida que la nueva información esté disponible, puedo extender la respuesta.

En primer lugar, ¿son correctas las definiciones de SCREEN_WIDTH y SCREEN_HEIGHT? Me parece que podrían no serlo.

En segundo lugar, qué formato de datos de píxeles, por ejemplo, ¿Cuántos bits por píxel, establece para la pantalla LCD. Por lo general, este tipo de LCD acepta datos en formatos como RGB565 (16 bits por píxel), BGR233 (8 bits por píxel) o RGB666 (18 bits por píxel). El código para DrawPixelLine sugiere que los datos son 8 bits por píxel; En mi experiencia, esto es bastante raro, aunque lo sorprendente de su imagen es que los colores parecen ser correctos. Tener el formato de píxel incorrecto explicaría mucho.

Es bastante extraño que parezca que hay dos entidades diferentes para la altura de la pantalla: SCREEN_HEIGHT y disp_y_size. ¿Estás seguro de que ambos son correctos?

Editar: Basado en la hoja de datos ILI9341; ese controlador no admite la profundidad de píxeles de 8 bits. También declara que su búfer de datos es de tipo u_int16. Sin embargo, en la función de dibujo de líneas, ese búfer se convierte en una matriz de caracteres. Y creo que en el Arduino (AVR), un char es un tipo de datos de 8 bits. Esto causaría una indexación incorrecta en su búfer de datos.

    
respondido por el PkP
1

Su controlador es un ILI9481 Ver.2.0. Si desconecta la PCB TFT y lee la hoja, encontrará la información que necesita. Pruebe estos ajustes desde el código del controlador ILI9481 ubicado en la biblioteca UTFT \ ... \ ... \ ILI9481 \ initlcd.h

código: initlcd.h

case ILI9481:  //ver.2.0
LCD_Write_COM(0x11);   //0x11
delay(20);
LCD_Write_COM(0xD0);   //(0xD0)
LCD_Write_DATA(0x07);  //(0x07)
LCD_Write_DATA(0x41);  //(0x42)
LCD_Write_DATA(0x1D);  //(0x1B)

LCD_Write_COM(0xD1);   //(0xD1)
LCD_Write_DATA(0x00);  //(0x00)
LCD_Write_DATA(0x2B);  //(0x07)
LCD_Write_DATA(0x1F);  //(0x10)

LCD_Write_COM(0xD2);   //(0xD2)
LCD_Write_DATA(0x01);  //(0x01)
LCD_Write_DATA(0x11);  //(0x02)

LCD_Write_COM(0xC0);   //(0xC0) //Panel Driving Setting / Set Default Gamma
LCD_Write_DATA(0x00);  //(0x10)
LCD_Write_DATA(0x3B);  //(0x3B)
LCD_Write_DATA(0x00);  //(0x00)
LCD_Write_DATA(0x02);  //(0x02)
LCD_Write_DATA(0x11);  //(0x11)

//Display_Timing_Setting for Normal Mode
    LCD_Write_COM(0xC1);    //
LCD_Write_DATA(0x10);   //Line inversion,DIV1[1:0]
LCD_Write_DATA(0x10);   //RTN1[4:0]
LCD_Write_DATA(0x88);   //BP and FP 


LCD_Write_COM(0xC5);    //(0xC5) //Frame Rate Control / Set frame rate
LCD_Write_DATA(0x03);   //(0x03)

LCD_Write_COM(0xB6);    // Display Function Control
LCD_Write_DATA(0x00);
LCD_Write_DATA(0x22);   // 0x42 = Rotate display 180 deg.
LCD_Write_DATA(0x3B);


LCD_Write_COM(0xC8);   //(0xC8) //Gamma Setting / Set Gamma
LCD_Write_DATA(0x00);  //(0x18)
LCD_Write_DATA(0x14);  //(0x32)
LCD_Write_DATA(0x33);  //(0x36)
LCD_Write_DATA(0x10);  //(0x45)
LCD_Write_DATA(0x00);  //(0x06)
LCD_Write_DATA(0x16);  //(0x18)
LCD_Write_DATA(0x44);  //(0x37)
LCD_Write_DATA(0x36);  //(0x75)
LCD_Write_DATA(0x77);  //(0x77)
LCD_Write_DATA(0x00);  //(0x54)
LCD_Write_DATA(0x0F);  //(0x0C)
LCD_Write_DATA(0x00);  //(0x00)

    LCD_Write_COM(0x21);   // Display Inversion ON 0x21 / 0x20 inversion OFF
LCD_Write_DATA(0xC8);  // C8     

    LCD_Write_COM(0xE4);   // 
LCD_Write_DATA(0xA0);  // 

    LCD_Write_COM(0xF0);   // 
LCD_Write_DATA(0x01);  //

//======RGB IF setting========
//RGB OR SYS INTERFACE
    LCD_Write_COM(0xB4);
LCD_Write_DATA(0x10);  //RGB / BGR

    LCD_Write_COM(0xC6);
LCD_Write_DATA(0x1B);
//============================ 


LCD_Write_COM(0x36);   //(0x36) //set_address_mode MIROR IMAGE LENDSCAPE
LCD_Write_DATA(0x0D);  //(0x0D) //MIROR AND ORIENTATION IMAGE 0x0C change ORIENTATION 
//Page Address Order:Top to Bottom,Column Address Order:Right to Left,Page/Column Order:Normal Mode,Line Address Order:LCD Refresh Top to Bottom

LCD_Write_COM(0x3A);   //(0x3A) //set_pixel_format
LCD_Write_DATA(0x55);  //(0x55) //DBI:16bit/pixel (65,536 colors)

LCD_Write_COM(0x2A);   //(0x2A) //set_column_address
LCD_Write_DATA(0x00);  //(0x00)
LCD_Write_DATA(0x00);  //(0x00)
LCD_Write_DATA(0x01);  //(0x)1)
LCD_Write_DATA(0x3F);  //(0x3F)

LCD_Write_COM(0x2B);   //(0x2B) //set_page_address
LCD_Write_DATA(0x00);  //(0x00)
LCD_Write_DATA(0x00);  //(0x00)
LCD_Write_DATA(0x01);  //(0x01)
LCD_Write_DATA(0xE0);  //(0xE0)

LCD_Write_COM(0x13);   //(0x13) //NORMAL DISPLAY 

    delay(120);
LCD_Write_COM(0x29);   //(0x29) //set_display_on / display on
break;
    
respondido por el bwginfo
-1

Tuve el mismo problema. La solución es:

Cambio en ILI9841 intlcd.h:

LCD_Write_COM(0x36);
LCD_Write_DATA(0x0A);

A

LCD_Write_COM(0x36);
LCD_Write_DATA(0x4A);
    
respondido por el user87348

Lea otras preguntas en las etiquetas