Diferencia entre revisiones de «ST7920»
Sin resumen de edición |
|||
| Línea 113: | Línea 113: | ||
== Modo paralelo 8 bits == | == Modo paralelo 8 bits == | ||
Aqui voy a poner el esquema de la inicialización con interfaz de 8 bits. La de 4 bits no la pondré porque trabajar este LCD con 4 bits da errores que no se de donde vienen exactamente pero que con la interfaz de 8 bits o la de serie no pasa. | Aqui voy a poner el esquema de la inicialización con interfaz de 8 bits. La de 4 bits no la pondré porque trabajar este LCD con 4 bits da errores que no se de donde vienen exactamente pero que con la interfaz de 8 bits o la de serie no pasa.<br/> | ||
<br/> | |||
Al hacer las pruebas he visto como siguiendo este esquema se hace una buena inicialización y el lcd funciona correctamente, pero también he visto en códigos encontrados por internet que no siguen todo el esquema y también se le inicializa correctamente el lcd.<br/> | |||
<br/> | |||
Supongo que de la segunda manera ahorras tiempo en inicializar, pero no se si hay más ventajas o no, ni puedo decir con certeza cual es mejor utilizar. | |||
Revisión del 13:40 3 abr 2013
Características
Address Counter (AC)
La AC es una dirección que sirve para poder acceder a la DDRAM, CGRAM y GDRAM. Cuando yo quiero acceder a una posicion de la DDRAM, CGRAM o GDRAM lo hago a traves de una dirección. Mediante el siguiente dibujo explico la relación entre la AC y la DDRAM. La relación con la CGRAM no la explicaré porque no la encuentro necesaria y no me he parado a "jugar" con ella, y la relación con la GDRAM la explico en el apartado de Relación AC con GDRAM.
Dibujo
CGROM
Esta CGROM tiene la particularidad que tiene caracteres chinos de 16x16 puntos. Según el manual tiene 8192 caracteres.
HCGROM
La HCGROM contiene 128 caracteres alfanumericos de 8x16 puntos. Lo que quiere decir que son los caracteres que representan nuestro abecedario. Cada caracter de estos ocupa la mitad que los de la CGROM y necesitas escribir dos caracteres de la HCGROM para completar una dirección AC.
Explicación gráfica:
DDRAM
Hay 64x2bytes de espacios para la DDRAM. Son 4 lienas para 16 caracteres de 16x16 puntos o 32 caracteres de 8x16 puntos.
La explicación de que es la DDRAM ya se puede leer en el apartado DDRAM del HD44780U
CGRAM
Esta es la RAM que nos permite crear caracteres personalizados, pero debido a que este lcd es un GLCD lo encuentro poco útil. En la sección de Modo Gráfico (GLCD) hay funciones mucho más interesantes.
Descripción Pines
- XRESET: Es el pin de reset. Para resetear el lcd desde el hardware se hace con este pin. Tiene que pasar de LOW a HIGH para hacer el reset. Yo no lo utilizo.
- PSB: Es un pin para seleccionar si usamos la comunicación serie o paralela. LOW es serie y HIGH paralela
- Vo: Es para el contraste (creo)
- VSS: GND
- VDD: +5V
SPI
En el modo serie no se puede leer de la pantalla. Solo se pueden hacer operaciones de escritura.
- RS: es el pin SS del protocolo SPI
- RW: es el pin MOSI del protocolo SPI
- E: es el pin clock del protocolo SPI
Paralelo 8 bits
- RS: Es el pin Register Select. LOW es para seleccionar las instrucciones de registro (IR) y HIGH es para seleccionar los registros de datos (DR).
- RW: Es el pin de lectura/escritura. LOW es para indicar escritura y HIGH para indicar lectura.
- E: Es el pin utilizado para indicar el paso de datos del microcontrolador al st7920. Se ve mejor su utilidad en la sección Como funciona la comunicación paralela 8bits
- D0-D7: Son los pines de datos.
Funciones Básicas
- Todas las instrucciones básicas excepto Function Set son muy parecidas o iguales a las de HD44780U
Function Set
- El bit DL indica si estamos en comunicación paralela de 8 bits(HIGH) o comunicación paralela de 4 bits (LOW)
- El bit RE es para indicar si estamos en modo extendido(HIGH) o en modo normal(LOW). El modo extendido es en modo GLCD
Funciones Extendidas
De todas las funciones extendidas, de momento, yo solo he "trasteado" con Extended Function Set y Set Graphic Display Ram Address
Extended Function Set
- DL indica lo mismo que en el apartado anterior, HIGH para comunicacion paralelo 8 bits y LOW para 4 bits.
- RE indica modo extendido (HIGH) o normal (LOW)
- G indica lcd encendido (HIGH) o apagado (LOW). Este es el bit importante, porque cada vez que pasemos de modo normal a modo GLCD tenemos que asegurarnos de enviar esta instrucción con este bit en HIGH, sino no se verá nada. Esto lo explico en el apartado de pasos a seguir al dibujar un pixel
Set Graphic Display Ram Address
Esta instrucción es la que se usa para pasar una dirección de memoria a la AC (que recordemos que es la dirección que necesitamos para saber donde dibujar un pixel, es decir las cordenadas X e Y).
En la imagen se ven dos filas porque se tiene que enviar dos veces esta instrucción, una para el eje X y la otra para el eje Y. La primera instrucción se envia para determinar la X y la segunda para determinar la Y.
En el apartado Relación AC con GDRAM hay una imagen explicativa de la relación entre la AC y la GDRAM
Como funciona la comunicación Serial (SPI)
Como funciona la comunicación paralela 8bits
- El bit RS controla si enviamos operaciones DR o IR (Paralelo 8 bits). El bit lo tenemos que colocar a 1 o 0 antes de activar Enable
- El bit RW controla si son operaciones de lectura o escritura (Paralelo 8 bits). Igual que con RS se tiene que establecer en 0 o 1 antes de acrtivar Enable
- Los bits DB0-DB7 son los que llevan los datos. Se tienen que establecer antes de activar Enable
- El bit E (Enable) es el que utilizamos para transmitir las instrucciones al lcd
Ejemplo:
/*RS, RW, DB0-DB7 y E son pines digitales de Arduino*/ digitalWrite(RS, LOW); digitalWrite(RW, LOW); digitalWrite(DB7, LOW); digitalWrite(DB6, LOW); digitalWrite(DB5, LOW); digitalWrite(DB4, LOW); digitalWrite(DB3, LOW); digitalWrite(DB2, LOW); digitalWrite(DB1, LOW); digitalWrite(DB0, HIGH); digitalWrite(E, HIGH); delayMicroseconds(1); digitalWrite(E, LOW);
- En este ejemplo vamos a enviar el comando Display Clear 0x01
- Como se puede comprobar en la tabla de Funciones Básicas estamos transmitiendo la instrucción DR Display Clear
- Esta es una forma muy básica de hacerlo, pero es para que quede claro
- Cuando establecemos todos los pines con su bit correspondiente (0 o 1) pasamos a enviar la instrucción al lcd
- En el flanco de bajada de Enable es cuando se transmite la instrucción al lcd
Inicialización por software
Modo paralelo 8 bits
Aqui voy a poner el esquema de la inicialización con interfaz de 8 bits. La de 4 bits no la pondré porque trabajar este LCD con 4 bits da errores que no se de donde vienen exactamente pero que con la interfaz de 8 bits o la de serie no pasa.
Al hacer las pruebas he visto como siguiendo este esquema se hace una buena inicialización y el lcd funciona correctamente, pero también he visto en códigos encontrados por internet que no siguen todo el esquema y también se le inicializa correctamente el lcd.
Supongo que de la segunda manera ahorras tiempo en inicializar, pero no se si hay más ventajas o no, ni puedo decir con certeza cual es mejor utilizar.
Modo serie (SPI)
Modo Gráfico (GLCD)
Relación AC con GDRAM
Proceso al dibujar uno o varios pixeles
Fuentes personalizadas
Documentación
Notas
- Hacer una representación gráfica de la disposicion de las filas y columnas, lo del 0x80 y 0x88
- Explicar como lo soluciona dc42
- Explicar como soluciona dc42 el problema de que cada AC son 2 bytes y que cada byte representa 8 pixeles (cada pixel corresponde a un bit)
- Explicar uint8_t *ptr = image + ((16 * r) + (2 * startColNum)); y también la parte (2*startColNum)
- Explicar sendLcdData(*ptr++);
- Creo que cada vez que si se hace esto:
setPixel(1,1); flush(); setPixel(2,1); flush();
Esta dibujando la pantalla entera para cada flush(), pero no lo entiendo porque la función flush() esta preparada para renderizar un AC de una fila concreto
