1 votos

Desplazamiento horizontal con pantalla OLED genérica SSD1306

Compré una pantalla genérica OLED 128x64 en ebay y tuve cierto éxito en conseguir que funcione con el Biblioteca SSD1306 de Adafruit. He portado la función de inicialización a C y estoy manejando el LCD usando la interfaz SPI. Sin embargo, cuando aparece la pantalla de inicio, hay un desplazamiento horizontal.

OLED pinout Horizontal offset in splash screen

Creo que debería ser posible parchear esto modificando la función de visualización. Sin embargo, mi pregunta es, ¿hay una manera más limpia de hacer esto en los ajustes de configuración de la pantalla OLED. Los ajustes de inicialización pertinentes que estoy usando se dan 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
}

1voto

Mick Puntos 1185

Empiece siempre por la ficha técnica del aparato y lea https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf

Véase 8.3 Circuito oscilador y generador de tiempo de visualización

La pantalla que se muestra parece ser la resolución incorrecta o la frecuencia de reloj se ha establecido incorrectamente. Yo diría que es en la inicialización que usted tiene un problema, tal vez el número incorrecto introducido o que no han inicializado algo tan simple como no inicializar la relación de división para el reloj. Yo revisaría su código y me aseguraría de que todo se ha inicializado correctamente.

0voto

Lisa Anne Puntos 108

Dado que escribes que has portado el código a C, supongo que ya no utilizas el código original.

El desplazamiento horizontal no puede configurarse en la inicialización. En su lugar, se establece como el primer paso de la visualización de cada fotograma.

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 es así, intente solucionar el dirección de inicio de columna es decir, utilizar un valor distinto de 0.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X