Problema con la imagen del dibujo de la pantalla LCD de Arduino

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

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

Lo que he hecho hasta ahora:

- Mi método de dibujo en el boceto:

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 referencia a la implementación del método drawPixelLine de 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:

resultado actual

Imagen deseada:

ingrese la descripción de la imagen aquí

TFT LCD y placa Mega ingrese la descripción de la imagen aquí

ACTUALIZAR1

Ejecuté la prueba henningan de la biblioteca utft, dibujando el gráfico seno/coseno y cuadrados simples

ingrese la descripción de la imagen aquí

Aquí hay un intento de representar datos sin procesar de 100x100 cuadrados amarillos

ingrese la descripción de la imagen aquí

Respuestas (3)

Mirando la función SetXY, parece que el controlador podría ser ILI9341. Aquí hay una hoja de datos para ese controlador: http://www.newhavendisplay.com/app_notes/ILI9341.pdf .

Hay dos puntos que me llaman la atención en este momento; con suerte, a medida que haya nueva información 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íxel, por ejemplo, cuántos bits por píxel, configura para la pantalla LCD. Por lo general, este tipo de pantallas LCD aceptan 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 de DrawPixelLine sugiere que los datos son de 8 bits por píxel; en mi experiencia esto es bastante raro, aunque lo llamativo de tu imagen es que los colores parecen correctos. Tener el formato de píxel incorrecto explicaría muchas cosas.

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 una profundidad de píxeles de 8 bits. También declara que su búfer de datos es del tipo u_int16. Sin embargo, en la función de dibujo de línea, ese búfer se convierte en una matriz de char. Y creo que en Arduino (AVR), un char es un tipo de datos de 8 bits. Esto provocaría una indexación incorrecta en su búfer de datos.

Su controlador es un ILI9481 Ver.2.0. Si separa la PCB TFT y lee la hoja, encontrará la información que necesita. Pruebe estas configuraciones desde el código del controlador ILI9481 ubicado en la bibliotecaUTFT \ ... \ ... \ 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;

Yo tuve el mismo problema. La solucion es:

Cambio en ILI9841 intlcd.h:

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

A

LCD_Write_COM(0x36);
LCD_Write_DATA(0x4A);