Interfaz con un LCD gráfico

Estoy ordenando un LCD gráfico NHD-12864AZ-FL-YBW y la mayor parte del código de la interfaz parece bastante simple. En la hoja de datos tiene la siguiente lista de comandosingrese la descripción de la imagen aquí

No entiendo qué se pone en el comando de datos de pantalla de escritura para dibujar algo en la pantalla. Por ejemplo, ¿cómo se oscurecería el píxel en (5, 8)). Revisé la hoja de datos pero no pude encontrar nada.

Respuestas (2)

Como señaló Wouter, no se puede escribir directamente en un solo píxel.

La matriz de visualización se comporta básicamente como un mapa de bits monocromático. Está físicamente dividido entre dos controladores idénticos, uno para la mitad izquierda y otro para la mitad derecha. Sus líneas de datos/luz estroboscópica están conectadas entre sí y puede seleccionar una con la que hablar mediante los pines de selección de chip, CS1B y CS2B. Ambos están activos en alto y ambas mitades de la pantalla se escribirían simultáneamente si hubiera afirmado ambos pines CS.

La pantalla está dividida verticalmente en ocho páginas , que se colocan una encima de la otra, formando filas de ocho píxeles de alto. Estos ochos verticales de píxeles están conectados con los bytes de la página y cada página tiene 64 bytes. Por eso,

  • 8 páginas * 8 bits = 64 filas
  • 2 controladores * 64 bytes por página = 128 columnas

para toda la pantalla. Se puede encontrar una buena imagen del diseño de la memoria aquí .


Por ejemplo, ¿cómo se oscurecería el píxel en (5, 8)).

Supongo que con la notación (5,8) te refieres a la quinta columna desde la izquierda y la octava fila desde arriba, como se usa ampliamente en los gráficos por computadora. Desafortunadamente, el fabricante del controlador llama a la coordenada vertical (índice de página) X, lo cual es bastante confuso.

  1. fila no. 8 pertenece a la página no. 1. Debe emitir Page Selectun comando con el argumento 1, es decir, 00 10111001para valores de bits en la tabla.

  2. Después de esto, debe emitir Set addressun comando para establecer el índice de la columna 5, lo que significa valores de bits de 00 01000101. Ahora el "cursor" de la pantalla se establece en el byte que contiene el píxel especificado.

  3. Ahora puede escribir el contenido deseado del byte a través del comando Write Display Data. La octava fila es el LSB de la página 1 y uno lógico en este bit hace que el píxel deseado se oscurezca.

Desafortunadamente, solo puede escribir un byte completo. Por lo tanto, necesita una copia del contenido de la pantalla en el RWM de su MCU, o primero lea el valor actual de la pantalla LCD (comando Read Display Data), realice un OR lógico con 0b00000001y reescriba.

Tenga en cuenta que la dirección en la página (registro Y) avanza automáticamente a medida que escribe datos. Puede llenar fácilmente toda la página solo con escrituras secuenciales: si tiene suficiente memoria en su MCU de control, puede asignar un bloque de 2 * 8 * 64 = 1024 bytes, mantener y manipular el mapa de bits allí y enviar todo el contenido de la pantalla /páginas modificadas bajo petición. Esto depende de su aplicación.

Este protocolo es muy común para las pantallas GLCD 128x64. Creo que también podría encontrar una biblioteca lista para usar para su MCU, que le proporcione algunos gráficos básicos (línea, rectángulo, posiblemente incluso elipse) y/o salida de texto sin manipular directamente la pantalla LCD.

Parece un controlador LCD PCD8544 (como se encuentra en la pantalla común Nokia 84 x 48 BW). La explicación completa está en la hoja de datos :) No hay un comando para cambiar un solo píxel, pero puede escribir un byte (8 píxeles, orientados verticalmente). Para cambiar un solo píxel, debe recordar el valor del byte (almacenarlo en el uC en una matriz) o leerlo primero. Luego cambie el píxel, luego escriba el byte en la pantalla LCD. Este es (parte de) mi controlador para tal LCD. Almacena la 'imagen' en el uC, por lo que a costa de algo de RAM (504 bytes) evita tener que leer cada byte primero.

void lcd5510_pixels( unsigned char x, unsigned char y, unsigned char d ){
   lcd5510_command( 0x80 | x );   
   lcd5510_command( 0x40 | y );  
   lcd5510_data( d );
} 

unsigned char lcd5510_buf[ 504 ];

void lcd5510_write( unsigned int x, unsigned int y, unsigned char d ){
   unsigned int a = x + ( y / 8 ) * 84;
   unsigned int m = 1 << ( y % 8 );

   if(( x >= 84 ) || ( y >= 48 )){
      return;
   }

   if( d ){
      lcd5510_buf[ a ] |= m;
   } else {     
      lcd5510_buf[ a ] &= ~m;
   }

   lcd5510_pixels( x, y / 8, lcd5510_buf[ a ] );         
}

Un problema con este grupo de pantallas LCD es que parece haber al menos dos controladores diferentes (el PCD8544 real y algunos clones) que requieren una inicialización ligeramente diferente para funcionar. Mi código de inicio es (después de configurar pin, restablecer, etc. (:

   // inspired by https://www.sparkfun.com/products/10168
lcd5510_command( 0x21 );  // select exteded instructions
lcd5510_command( 0xC8 );  // Vop = 110000b
lcd5510_command( 0x06 );  // TCx = 00b
lcd5510_command( 0x13 );  // BSx = 100b
lcd5510_command( 0x20 );  // select basic instructions, horizontal addressing
lcd5510_command( 0x0C );  // normal mode