Problema de visualización de SSD1306 de 128 x 32 SSD (imagen en el interior)

1

Compré una de estas pantallas OLED baratas de 0.91 "y la conecté de acuerdo con una hoja de datos que me envió el vendedor. Probé varios controladores después de que pensé que hay problemas de compatibilidad, pero todos dan el mismo problema. Solo la parte superior de la pantalla muestra cualquier carácter, el resto parecen píxeles aleatorios y parpadea mientras las líneas se ejecutan hacia arriba y hacia abajo. VBAT + VDD está conectado a ~ 3.3V.

¿Quizás alguien pueda detectar el problema simplemente mirando la imagen de la pantalla?

Aquíestálasecuenciadeiniciación:

voidoled_init(){L(PORTE,SS1306_OLED_RST);_delay_ms(10);H(PORTE,SS1306_OLED_RST);_delay_ms(10);oled_write(0,0xAE);//displayoffoled_write(0,0xD5);//clockoled_write(0,0x81);//uppernibbleisrate,lowernibbleisdivisoroled_write(0,0xA8);//muxratiooled_write(0,0x3F);//rtfmoled_write(0,0xD3);//displayoffsetoled_write(0,0x00);//rtfmoled_write(0,0x00);oled_write(0,0x8D);//chargepumpoled_write(0,0x14);//enableoled_write(0,0x20);//memoryaddrmodeoled_write(0,0x00);//horizontaloled_write(0,0xA1);//segmentremapoled_write(0,0xA5);//displayonoled_write(0,0xC8);//comscandirectionoled_write(0,0xDA);//comhardwarecfgoled_write(0,0x12);//altcomcfgoled_write(0,0x81);//contrastakacurrentoled_write(0,0x7F);//128ismidpointoled_write(0,0xD9);//prechargeoled_write(0,0x11);//rtfmoled_write(0,0xDB);//vcomhdeselectleveloled_write(0,0x20);//rtfmoled_write(0,0xA6);//non-invertedoled_write(0,0xA4);//displayscanonoled_write(0,0xAF);//driverson}

YloquemuestralapantallaLCDdespuésdequeleenviéalgunoscaracteres.

    
pregunta user34920

3 respuestas

3

Adivinar en lugar de más información (ver mis comentarios arriba). Se ve sospechosamente, ya que lo que se dibuja es 1/8 de la pantalla. El controlador dice que opera a 8 bits por píxel (256 niveles monocromáticos). ¿Está dibujando en la pantalla como si fuera una pantalla de 1 bit por píxel en lugar de 8? Como señalé en el comentario anterior, no podrá mantener un búfer de cuadros a 8 bpp y aún le quedará algo de RAM para hacer cualquier otra cosa.

    
respondido por el Zuofu
2

Respondiendo en caso de que alguien realmente necesite resolver el problema,

Si no está familiarizado con el SSD1306, sería una buena idea leer la documentación.

Cada byte es vertical, con el LSB en la parte superior y el MSB en la parte inferior. La pantalla se divide en varias páginas, cada una de las cuales almacena 1 byte por N columnas. Para una pantalla de 128 por 32 píxeles, es de 4 páginas (8 * 4 = 32) y 128 columnas de ancho. Todo esto se puede volver a asignar, pero si sigue las guías del fabricante, la configuración predeterminada es la forma en que lo describo.

Al escribir un byte de datos, por cualquier método, incrementará el puntero de columna en uno. Por lo tanto, si configura la columna y la página en cero, se encuentra en la parte superior izquierda de la pantalla. Si escribe 10 bytes en todo 0xff, tendría un cuadrado de 10x8 píxeles en la parte superior izquierda de la pantalla. Si continúas y escribes 128, se llenará toda la página superior.

Sin embargo, si configura el modo de dirección incorrectamente, no incrementará automáticamente la página. Por lo tanto, es posible que tenga un búfer completo (que solo tiene 512 bytes), pero solo está escribiendo los primeros 128 de esos bytes, después de lo cual no sé qué sucederá. Parece que se sale de la página, en lugar de volver a escribir sobre ella.

Entonces, tl; dr, cambia el modo de dirección a horizontal para que incremente automáticamente la página. Alternativamente, escriba 128 bytes a la vez, luego incremente la página después de cada fragmento.

Como referencia, las especificaciones del SSD1306.

enlace

En particular, busque la documentación bajo el comando "Establecer modo de direccionamiento", tiene muchas imágenes para aclarar qué está sucediendo exactamente.

    
respondido por el Alex
0

Bueno, tuve el mismo problema y encontré una respuesta. Todo lo que tienes que cambiar es

esta línea: oled_write (0, 0x3F); a esto: oled_write (0, 0x1F);

y esta línea: oled_write (0, 0x12); a esta línea: oled_write (0, 0x02);

Su código anterior funciona para las pantallas OLED de 128x64. Los cambios en el código lo hacen funcionar para pantallas OLED de 128x32.

    
respondido por el abo

Lea otras preguntas en las etiquetas