Interconectando con un lcd gráfico

2

Estoy ordenando un lcd gráfico NHD ‐ 12864AZ ‐ FL ‐ YBW y más Del código de la interfaz parece bastante simple. En la hoja de datos tiene la siguiente lista de comandos

No entiendo qué se pone en el comando de escritura de datos de visualización 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.

    
pregunta popgalop

2 respuestas

2

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

La matriz de visualización se comporta básicamente como un mapa de bits monocromático. Se divide físicamente entre dos controladores idénticos, uno para la mitad izquierda y el otro para la mitad derecha. Sus líneas de datos / luces estroboscópicas 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 se divide 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 bytes de la página y cada página tiene 64 bytes. Por lo tanto,

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

para toda la pantalla. 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 la parte superior, como se usa ampliamente en gráficos de 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 el comando Page Select con el argumento 1 , que es 00 10111001 para los valores de bit en la tabla.

  2. Después de esto, debe emitir el comando Set address para establecer el índice de columna 5 , que significa valores de bit 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 una lógica en este bit hace que el píxel deseado se oscurezca.

Desafortunadamente, solo puedes escribir un byte entero. 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 una OR lógica con 0b00000001 y vuelva a escribir.

Tenga en cuenta que la dirección en la página (registro Y) avanza automáticamente a medida que escribe los 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 el contenido completo de la pantalla Páginas modificadas a petición. Esto depende de tu 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 proporcionará algunos gráficos básicos (línea, rectángulo, posiblemente incluso elipse) y / o salida de texto sin manipular directamente la pantalla LCD.

    
respondido por el Ladislav
0

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

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 LCD es que parece haber al menos dos controladores diferentes (el PCD8544 real y algunos clones) que requieren una inicialización absolutamente diferente para funcionar. Mi código de inicio es (después de configurar, reiniciar, 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   
    
respondido por el Wouter van Ooijen

Lea otras preguntas en las etiquetas