Desplazamiento horizontal con pantalla OLD SSD1306 genérica

1

Compré una pantalla OLED 128x64 genérica en ebay y logré que funcionara con la biblioteca Adafruit SSD1306. Porté la función de inicialización a C y estoy manejando el LCD usando la interfaz SPI. Sin embargo, cuando aparece la pantalla de bienvenida, hay un desplazamiento horizontal.

Creo que debería ser posible parchear esto modificando la función de visualización. Sin embargo, mi pregunta es si existe una forma más limpia de hacerlo en los ajustes de configuración de la pantalla OLED. La configuración de inicialización relevante que estoy usando se proporciona a continuación:

void ssd1306_init (uint8_t vccstate) {

// Init sequence
ssd1306_command(SSD1306_DISPLAYOFF);                    // 0xAE
ssd1306_command(SSD1306_SETDISPLAYCLOCKDIV);            // 0xD5
ssd1306_command(0x80);                                  // the suggested ratio 0x80

ssd1306_command(SSD1306_SETMULTIPLEX);                  // 0xA8
ssd1306_command(SSD1306_LCDHEIGHT - 1);

ssd1306_command(SSD1306_SETDISPLAYOFFSET);              // 0xD3
ssd1306_command(0x0);                                   // just changes the horizontal offset
ssd1306_command(SSD1306_SETSTARTLINE | 0x0);            // line #0
ssd1306_command(SSD1306_CHARGEPUMP);                    // 0x8D
if (vccstate == SSD1306_EXTERNALVCC)
{
    ssd1306_command(0x10);
}
else
{
    ssd1306_command(0x14);
}
ssd1306_command(SSD1306_MEMORYMODE);                    // 0x20
ssd1306_command(0x00);                                  // 0x0 act like ks0108
ssd1306_command(SSD1306_SEGREMAP | 0x1);
ssd1306_command(SSD1306_COMSCANDEC);

if( SSD1306_LCDWIDTH == 128 && SSD1306_LCDHEIGHT == 32) {
    ssd1306_command(SSD1306_SETCOMPINS);                    // 0xDA
    ssd1306_command(0x02);
    ssd1306_command(SSD1306_SETCONTRAST);                   // 0x81
    ssd1306_command(0x8F);
}
else if (SSD1306_LCDWIDTH == 128 && SSD1306_LCDHEIGHT == 64) {
    ssd1306_command(SSD1306_SETCOMPINS);                    // 0xDA
    ssd1306_command(0x12);
    ssd1306_command(SSD1306_SETCONTRAST);                   // 0x81
    if (vccstate == SSD1306_EXTERNALVCC)
    {
        ssd1306_command(0x9F);
    }
    else
    {
        ssd1306_command(0xCF);
    }
}
else if (SSD1306_LCDWIDTH == 96 && SSD1306_LCDHEIGHT == 16) {
    ssd1306_command(SSD1306_SETCOMPINS);                    // 0xDA
    ssd1306_command(0x2);   //ada x12
    ssd1306_command(SSD1306_SETCONTRAST);                   // 0x81
    if (vccstate == SSD1306_EXTERNALVCC)
    {
        ssd1306_command(0x10);
    }
    else
    {
        ssd1306_command(0xAF);
    }
}

ssd1306_command(SSD1306_SETPRECHARGE);                  // 0xd9
if (vccstate == SSD1306_EXTERNALVCC)
{
    ssd1306_command(0x22);
}
else
{
    ssd1306_command(0xF1);
}

ssd1306_command(SSD1306_SETVCOMDETECT);                 // 0xDB
ssd1306_command(0x40);
ssd1306_command(SSD1306_DISPLAYALLON_RESUME);           // 0xA4
ssd1306_command(SSD1306_NORMALDISPLAY);                 // 0xA6

ssd1306_command(SSD1306_DEACTIVATE_SCROLL);

//Debug
//ssd1306_command( 0x22 ); // Set page start and end addresses
//ssd1306_command( 0x00 ); // start at zero
//ssd1306_command (0x07) ; // end at seven.
//DEBUG


ssd1306_command(SSD1306_DISPLAYON);//--turn on oled panel

}

    
pregunta mr_js

2 respuestas

0

Dado que escribes que has portado el código a C, asumo que ya no estás usando el código original.

El desplazamiento horizontal no se puede configurar en la inicialización. En su lugar, se establece como el primer paso de cada pantalla de cuadro.

El código original en la biblioteca de Arduino es:

void Adafruit_SSD1306::display(void) {
  ssd1306_command(SSD1306_COLUMNADDR);
  ssd1306_command(0);   // Column start address (0 = reset)
  ssd1306_command(SSD1306_LCDWIDTH-1); // Column end address (127 = reset)
  ...

Supongo que no has portado correctamente este código a C.

Si no, intente corregir la línea de dirección de inicio de columna , es decir, utilice un valor diferente de 0.

    
respondido por el Codo
0

Comience siempre con la hoja de datos del dispositivo y lea enlace

Consulte el circuito del oscilador 8.3 y el generador de tiempo de visualización

La pantalla que se muestra muestra la resolución incorrecta o la frecuencia del reloj se ha configurado incorrectamente. Yo diría que es en la inicialización que tiene un problema, tal vez ingresó un número incorrecto o no pudo inicializar algo tan simple como no inicializar la relación de división para el reloj. Volvería a verificar el código y me aseguraré de que todo se haya inicializado correctamente.

    
respondido por el LateDev

Lea otras preguntas en las etiquetas