26.12.13

Pantalla LCD 2x16 - HD44780

El manejo de una pantalla LCD útil a la hora de mostrar datos realizados por el microcontrolador o también para poder interactuar con este de una manera más fácil.

Utilizaré el HD44780 que es un LCD de 16x2 muy conocido y bastante comercial.


El principio de funcionamiento es el siguiente:
- Se envía los datos por un puerto hacia la pantalla LCD.
- Luego se controlan estos datos mediante E, RS, RW de nuestra pantalla LCD.

Esta pantalla LCD permite una interfase de 4 o 8 bits, la diferencia entre ambos es la velocidad de transmisión ya que para una interfase de 4 bits se tiene que primero enviar el nible alto del byte y luego el nible bajo.

Hay que mencionar que los caracteres que se envían deben estar en código ASCII.

Listado de Instrucciones para la configuración del LCD.



Tabla de caracteres LCD:


Posición de caracteres en la Pantalla LCD:


Los pines correspondientes para cada uno de los 16 pines de nuestra pantalla LCD.


Las pantallas HD44780 tienen un área de CGRAM para crear patrones definidos por el usuario. Para la creación de modelos personalizados necesitamos definir qué píxel se hará brillar. Estos valores se deben escribir en la dirección CGRAM a partir de 0x40.


CGRAM cuenta con un total de 64 Bytes. Cuando se utiliza como pantalla LCD de 5x8 puntos en función de conjunto se puede definir un total de 8 patrones definidos por el usuario (1 byte para cada fila y ocho filas para cada modelo).

Para empezar a graficar lo que tenemos que hacer es un mapa de píxeles de 7x5 y obtener valor binario de cada fila, el valor de bit es 1 si píxel es el valor que brilla intensamente y bit es 0 si pixel está apagado. El final de 7 valores se cargan en el CGRAM uno por uno. Como he dicho, hay 8 líneas por cada patrón, fila, de manera última se suele dejar en blanco (0x00) para el cursor.


Por ejemplo vamos a definir una flecha:
Los valores decimales de las filas serán 4, 14 , 21, 4, 4, 4, 4.
Los valores binarios de las filas serán: 00100,01110,10101,00100,00100,00100,00100
Estos valores en binario serán ingresados a la CGRAM para definir un carácter.

Para evitar tener que calcular cada número de cada linea, adjunto un LCD Custom Character Builder que nos ayudará a conseguir los códigos de manera rápida.

Usaremos la libreria HD44780.h; para cambiar entre una interfase de 8-bits y 4-bits o en que puertos ira colocado el LCD simplemente modificamos las siguiente lineas:


La ventaja de trabajar con una interfase de 4 bits es que podemos utilizar solo un puerto para controlar el LCD, si colocamos el mismo puerto para enviar datos y enviar el control del LCD no existirá ninguna colisión en el programa.

Las funciones con las que cuenta esta librería son las siguientes:

void LCDinit(void): Inicia la configuración del LCD.

void LCDclr(void): Limpia la pantalla LCD.

void LCDhome(void): Coloca el inicio de escritura en la posicion (0,0).

void LCDsendChar(uint8_t): Envía un solo carácter a la pantalla LCD.

void LCDstring(const char *s, uint8_t, uint8_t): Envía un string desde la SRAM a la pantalla LCD en la posición definida.

void LCDGotoXY(uint8_t, uint8_t): Coloca el inicio de escritura en la posición definida.

void CopyStringtoLCD(const uint8_t*, uint8_t, uint8_t): Envía un string desde la memoria Flash hacia la pantalla LCD en la posición definida.

void LCDdefinechar(const uint8_t *,uint8_t): Coloca un nuevo caracter definido por el usuario en la CGRAM.
 
void LCDshiftRight(uint8_t): Mueve toda la pantalla LCD n posiciones a la derecha.

void LCDshiftLeft(uint8_t): Mueve toda la pantalla LCD n posiciones a la izquierda.

void LCDcursorOn(void): Activa el cursor visual.

void LCDcursorOnBlink(void): Activa el blink en el cursos visual.

void LCDcursorOFF(void): Desactiva el cursor visual.

void LCDcursorLeft(uint8_t): Mueve el cursor n posiciones a la izquierda.

void LCDcursorRight(uint8_t): Mueve el cursor n posiciones a la derecha.

void LCDblank(void): Oculta la pantalla LCD pero no borra los datos.

void LCDvisible(void): Muestra la pantalla LCD.




Descargas:
Datasheet ATmega16A
Datasheet HD44780
LCD Custom Character Builder
Source Code

4 comments:

  1. hola. podria ayudarme con una guia de un codigo en assembler con el atmega16 para leer un teclado matricial 4x4 y verlo en la pantalla LCD.Gracias.

    ReplyDelete
    Replies
    1. Hola Sebastian, te puedo ayudar con el programa assembler para el LCD, este programa esta @8MHz:
      - PB0 -> RS
      - PB1 -> RW
      - PB2 -> E
      - PA0-7 -> D0-7

      https://gist.github.com/vduenasg/02770af82eae51992f67

      Ahora con lo que respecta al teclado matricial puedes revisar mi post Keypad4x4 y utilizar el concepto general que esta antes de usar la maquina de estado.

      Saludos

      Delete
  2. hola que tal tengo un problema tengo una tabla donde rs 1, rw 1, e 1 ,d0 1, d1 0, d2 1 , d3 0, d4 1, d5 1, d6 1, d7 1, me piden que proceso se realiza en el lcd y que se visualiza en la pantalla

    ReplyDelete
    Replies
    1. Hola David, el proceso que realiza lo encontrara en el Listado de Instrucciones para la configuracion y lo que se visualizara en la pantalla busquelo en la Tabla de Caracteres.

      Delete