Display LCD grafico 128x128 con controlador T6369C anda la mitad de la pantalla

Hola buenos días, antes que nada espero cumplir con las normal del foro, sino avisen y lo corrijo.

Bueno les comento el problema que tengo hace tiempo, tengo varios de estos display de 128x128, usan el famosísimo controlador T6963c acompañado de un T6A40 y cuatro T6A39A, en las fotos se ve bien esto, lo raro es la forma es como esta armado el display porque es mas no encontré ningún display que use esa configuración, y creo que por ese lado esta el problema que estoy teniendo.

Acá se ve el problema que tengo, los primeros 64x128 andan perfecto

Acá se ve la estructura que tiene el LCD

El diagrama lo hice yo modificando otro que encontre. Este LCD usa el T6A40 para las lineas 1 a 63 y le manda lo mismo a la 64 a 128.

Aca para que se vea bien la parte de atras del LCD con el T6963C y el T6A40

Aca para que se vea bien la parte de abajo de la pantalla donde se ven los cuatro T6A39A

Acá usa el primero de los T6A39A para las 80 primeras columnas y el segundo para las otras 48.

Acá dejo el código que use, usa las conocidísimas librerías de U8g, que las probé en display de 320x240, 240x64 y me andan perfecto, con este de 128x128 tengo problemas nomas.

Aca les dejo el codigo que uso.

#include "U8glib.h"

U8GLIB_T6963_128X128 u8g(22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 32); // 8Bit Com: D0..D7, cs, a0, wr, rd, reset

void drawColorBox(void)
{
  u8g_uint_t w,h;
  u8g_uint_t r, g, b;
  
  w = u8g.getWidth()/32;
  h = u8g.getHeight()/8;
  for( b = 0; b < 4; b++ )
    for( g = 0; g < 8; g++ )
      for( r = 0; r < 8; r++ )
      {
        u8g.setColorIndex((r<<5) |  (g<<2) | b );
        u8g.drawBox(g*w + b*w*8, r*h, w, h);
      }
}

void drawLogo(uint8_t d)
{
#ifdef MINI_LOGO
    u8g.setFont(u8g_font_gdr17r);
    u8g.drawStr(0+d, 22+d, "U");
    u8g.setFont(u8g_font_gdr20n);
    u8g.drawStr90(17+d,8+d,"8");
    u8g.setFont(u8g_font_gdr17r);
    u8g.drawStr(39+d,22+d,"g");
    
    u8g.drawHLine(2+d, 25+d, 34);
    u8g.drawVLine(32+d, 22+d, 12);
#else
    u8g.setFont(u8g_font_gdr25r);
    u8g.drawStr(0+d, 30+d, "U");
    u8g.setFont(u8g_font_gdr30n);
    u8g.drawStr90(23+d,10+d,"8");
    u8g.setFont(u8g_font_gdr25r);
    u8g.drawStr(53+d,30+d,"g");
    
    u8g.drawHLine(2+d, 35+d, 47);
    u8g.drawVLine(45+d, 32+d, 12);
#endif
}
void drawURL(void)
{
#ifndef MINI_LOGO
  u8g.setFont(u8g_font_4x6);
  if ( u8g.getHeight() < 59 )
  {
    u8g.drawStr(53,9,"code.google.com");
    u8g.drawStr(77,18,"/p/u8glib");
  }
  else
  {
    u8g.drawStr(10,54,"Esto SI se ve");
    u8g.drawStr(10,110,"Esto NO se ve");
  }
#endif
}

void draw(void) {
  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
    drawColorBox();
  }
  u8g.setColorIndex(1);
  if ( U8G_MODE_GET_BITS_PER_PIXEL(u8g.getMode()) > 1 ) {
    drawLogo(2);
    u8g.setColorIndex(2);
    drawLogo(1);
    u8g.setColorIndex(3);
  }
  drawLogo(0);
  drawURL();
  
}

void setup(void) {
  // flip screen, if required
  //u8g.setRot180();
}

void loop(void) {
  
  // picture loop
  u8g.firstPage();  
  do {
    draw();
  u8g.setColorIndex(1);
  } while( u8g.nextPage() );
  
  delay(200);  
}

Muchisimas gracias

Solo busqué rápidamente. Prueba a ver si esto te sirve link

Gracias por responder. Esa libreria es la u8g la version 2 que si miras en los display que soporta, aparece el controlador T6963C pero no para 128x128 nose porque.

Sospecho que es algo que la libreria lo maneja como para la mayoria de los display, pero no para este que tengo yo que usa es esquema raro, yo creo que con alguna pequeña modificacion a la libreria deberia andar, pasa que al ser para tantos controladores cuesta mucho seguirlas para entender bien como funcionan.

Que tal este? link

Se que no hay soporte para Arduino pero esta para Linux de modo que puedes ver/comparar códigos similares y hacer un poco de ingeniería inversa para tu caso.
Compara alguno similar y mira que cosas hay que cambiar/agregar.

EDITO:
Algo mas que puede ser positivo. Hay muchos links y consultas comenzadas pero muy pocas respuestas con soluciones.
MIra esta

olikraus:
Maybe U8glib will work.
You could start with this constructor:

U8GLIB_T6963_128X64(d0, d1, d2, d3, d4, d5, d6, d7, cs, a0, wr, rd [, reset])

Locate u8g_dev_t6963_128x64.c
Change

#define HEIGHT 64

to

#define HEIGHT 128

Let me know if this works.

Oliver

Gracias de nuevo por responder, igual veo que sos muy activo en el canal.

Sabes que me parece que viene por el lado de que el T6963C tiene algo llamado dual scan o dual screen y separa la parte superior de la inferior, supuestamente esto trae algunas ventajas (no creo que muchas porque casi ningun fabricante lo uso) pero que maneja de forma diferente algunos pines y la memoria. Y con esto separa el mapeo de la RAM en dos.

Con esto en mente para vos, sera un problema de muestreo en el display o de como se guardan las cosas en la memoria?

Voy a mirar un poco lo link que vos me pasaste.

Espera a los expertos @TFTLCDCyg o @lightcalamar que saben mucho del tema.

Hay que tomar en cuenta que la librería U8glib tiene mas de 3 años que no ha sido actualizada. Específicamente el controlador T6963 que quieres usar, no fue probado para la resolución de 128x128.

Toca mirar en el interior de la libreria para determinar como gestiona el manejo de los pixeles verticales. Al mirar dentro del datasheet del controlador T6A39A, veo que se controla solo con 4 lineas de datos (D11, D12, D13, D14), es posible que mediante algún registro sea posible direccionar el control de la otra mitad de la pantalla.

Tocará experimentar con esa parte de la librería y como dispones de la pantalla, creo que deberías hacerle los honores, es difícil darte un curso de acción ya que en este caso la prueba y error son el paso indicado.

PD: no te desgastes mucho con el que falla. A veces es mejor dejar que acumulen algo de suciedad en algún cajón de los pendientes, antes de que puedas dar con la solución correcta.