lunes, 27 de abril de 2015

Como programar un display LCD de 16x2 con el PICAXE 8M2

La pantalla LCD que usé en este proyecto es de las más económicas y de las que no tienen luz de fondo, pero el funcionamiento es básicamente el mismo.

Primero voy a mostrar cómo imprimir mensajes en la LCD de manera manual; el objetivo de esto es para saber cómo se envían los datos a la LCD y tú mismo puedas desarrollar la plantilla de código que pueda manejar una LCD. Después voy a utilizar el PICAXE 8M2 para imprimir los mensajes.

La LCD puede ser manejada en formato de 8 o 4 bits. Para los humanos es más fácil manejar el formato de 8 bits que el de 4 bits, pero para un microcontrolador es lo mismo. En el formato de 4 bits se utilizan menos pines de salida, por lo tanto un micro normalmente maneja la LCD en formato de 4 bits. A pesar de esto algunas plantillas de código para manejar LCDs utilizan el formato de 8 bits (como Arduino y PIC) pero para el caso de PICAXE lo vamos a manejar con tan sólo 3 salidas del microcontrolador, esto nos ayuda bastante cuando en nuestro proyecto tenemos muy pocas salidas disponibles.

El circuito para manejar la LCD de forma manual es el siguiente:



NOTA: La parte del circuito para enviar el pulso "habilitar" (S9) también puede ser un flip-flop SR u otro que ustedes conozcan. Yo lo hice con un 555 configurado en monoestable. El objetivo es mandar un único pulso sin rebote mecánico.

La tabla de comandos que la LCD entiende es la siguiente:



En la tabla se indica con un * los valores de inicio de la LCD aunque puede variar un poco.


Formato de 8 bits

Vamos a ver cómo se inicia una LCD en formato de 8 bits:

  • Primero poner en cero el pin RS de la LCD (para enviar comandos).
  • Después ingresar los siguientes números en hexadecimal. Tener en cuenta que después de cada número se debe enviar un pulso al pin de "enable" de la LCD:
  • 30
  • 38
  • 0F
  • 84 (Enviar este comando sólo si el cursor no aparece en la primer celda)

Con estos comando el cursor debe estar parpadeando en la primer celda visible. Si no es así verificar que la alimentación sea la correcta (5 volts y algunas LCD manejan 3 volts), que todo esté bien conectado y por último revisar que el contraste sea el correcto.

Se puede jugar con los comandos para realizar varias acciones por ejemplo: que el cursor se desplace hacia la izquierda, que no sea visible el cursor, desplazar la ventana de visualización de la LCD, limpiar pantalla, etc.

Ahora para ingresar un caracter en formato de 8 bits ingresamos el código hexadecimal según la siguiente tabla de caracteres ASCII:



Existen celdas vacías en la tabla, quiere decir que los caracteres de esas celdas varían según el fabricante de las LCDs. Llena tu propia tabla con los caracteres que imprime tu LCD.

Observa que en la primer columna dice CGRAM (generador de caracteres de la memoria RAM) y hay un total de 16 direcciones (00 - 0F) para generar caracteres diferentes a los de la tabla ASCII.

Para generar tu propio caracter, primero dibújalo en un cuaderno haciendo una tabla de 8x8 cuadros, las primeras tres columnas no se imprimen en la LCD puesto que cada matriz donde se imprimen caracteres son de 5x7 y 5x8 (columnas x filas). De la tabla de 8x8 que dibujaste genera el código hexadecimal para cada fila y ahora introduce lo siguiente:

  • Con el cursor en la posición de inicio visible ajusta el pin de RS en 1 lógico (para imprimir un caracter).
  • Ahora imprime el primer caracter de la CGRAM, para esto ajusta el 00 y envía el pulso de enable (se imprimirá un caracter que es basura), esto sólo es para que veas como cambia el contenido del caracter.
  • Después cambia al modo comando (RS = 0) e ingresa la primera dirección de CGRAM que es con el comando 40 (vea tabla de comandos).
  • Nuevamente cambia al modo caracter (RS = 1) y ahora introduce el código de cada fila que obtuviste de tu propio caracter seguido de un pulso de enable.
  • Cuando envíes el último caracter cambia al modo comando y envía el comando limpiar pantalla (01).

Otra forma de generar un caracter más fácil es utilizando la herramienta "LCD CGRAM Wizard" del software PICAXE editor porque es más rápido dibujar ahí y te genera el código hexadecimal. Además de entrega el código para que envíes la información de forma serial a un chip especial.



Ya tienes tu primer caracter generado en la memoria RAM, recuerda que tienes 15 direcciones de memoria más para almacenar otros caracteres. Además una vez que la LCD se desconecte de la alimentación la memoria RAM se borra y por lo tanto se pierden los caracteres ya generados.


Formato de 4 bits


En el caso del formato en 4 bits sólo se usan los 4 bits más significativos (b4 - b7) para enviar los datos y los comandos. Este formato es más tardado y puede ser confuso para los humanos, pero para un microcontrolador es más eficiente porque requiere de menos pines de salida.


Entonces vamos a ver cómo se inicia la LCD en formato de 4 bits:

  • Primero pasar al modo comando (RS = 0)
  • Después conectar los bits menos significativos (b0 - b3) a 0 lógico.
  • Ahora ingresar los siguientes comandos seguidos de un pulso enable cada uno:
  • 2 (En realidad se envía el 20 porque hasta ahora la LCD está trabajando en el formato 8 bits)
  • 2
  • 8
  • 0
  • F
  • 8 (Enviar estos dos comandos sólo si el cursor no aparece en la primer celda)
  • 4

Para imprimir un caracter pasamos al modo caracter (RS = 1) y si queremos imprimir el caracter "A" entonces introducir el códígo hexadecimal 41 pero primero se envía el 4 y después el 1.

Lo mismo ocurre para generar un caracter en la memoria RAM.



Espero que me haya explicado bien aún así les comparto un artículo que lo explica mucho mejor que yo.




Manejar una LCD usando el microcontrolador PICAXE 8M2

En el manual número de 3 de PICAXE, mencionan que sólo hay tres maneras de programar una LCD. En las dos primeras se necesita un chip especial para recibir los datos de manera serial desde el microcontolador y en la tercera opción es conexión directa, pero si no cuentas con este tipo de chip especial, en ese caso la interfaz que puedes utilizar es una derivación de la conexión directa. El microcontrolador PICAXE 8M2 sólo tiene 4 salidas y en la conexión directa se requieren de 6 salidas como mínimo para programar la LCD (4 bits de datos, 1 bit de RS y 1 bit para enable) pero utilizando un registro de corrimiento serial-paralelo de 8 bits como el 74LS164 ó el 74HC164 sólo necesitamos 3 salidas de nuestro microcontrolador. Además de que su precio es muy accesible, va de $7 a $10 aproximadamente (pesos mexicanos), ni siquiera un dólar de EEUU.

El diagrama del circuito es el siguiente:

Una salida del microcontrolador es para los datos, otra para la entrada de reloj del registro de corrimiento y la tercera para el pulso de enable de la LCD, El bit de selección del RS es una de las salidas del registro de corrimiento.

La siguiente plantilla de código sirve para este tipo de conexión y para una frecuencia de trabajo de 4 MHz:

;***********************************************************************************************
;    INICIALIZACION DE VARIABLES
;***********************************************************************************************
EEPROM 0,("PICAXE 8M2+")
EEPROM 16,("w4 = +")
symbol clock = C.4
symbol enable = C.2
symbol dato = C.1
low clock
low enable
low dato
;***********************************************************************************************
;    PROGRAMA PRINCIPAL
;***********************************************************************************************
gosub ini_lcd
let w4=987
bintoascii w4,b10,b11,b12,b13,b14 ; Separa la variable w4 en cinco variables
gosub imprime
end
;***********************************************************************************************
;    SUBRUTINAS
;***********************************************************************************************
imprime:
let b0=b10
gosub numero
let b0=b11
gosub numero
let b0=b12
gosub numero
let b0=b13
gosub numero
let b0=b14
gosub numero
return

numero:
let b3=1
let b5=0
num:
high dato ;RS = 1
pulsout clock,1
for b4=0 to 3
let b2 = b0*b3 & %10000000 'Realiza un corrimiento a la izquierda y aplica una máscara
let b3=b3*2
if b2 = 128 then
high dato
pulsout clock,1
else
low dato
pulsout clock,1
endif
next b4
pulsout enable,1
pause 10
inc b5
if b5 = 2 then ' Se puede sustituir esta parte por un ciclo for anidado con el anterior
return ' pero parece que a veces no funciona bien
else
goto num
endif

ini_lcd:
pause 100
pulsout clock,1 'RS = 0
pulsout clock,1
pulsout clock,1
high dato
pulsout clock,1
low dato
pulsout clock,1
pulsout enable,1
pause 10
let b6=$28
gosub comando
let b6=$0F
gosub comando
let b6=$01
gosub comando
let b6=$84
gosub comando
let b1=0
gosub mensaje
let b6=$C4
gosub comando
let b1=16
gosub mensaje
return

comando:
let b3=1
let b5=0
cmd:
low dato ;RS = 0
pulsout clock,1
for b4=0 to 3
let b2 = b6*b3 & %10000000
let b3=b3*2
if b2 = 128 then
high dato
pulsout clock,1
else
low dato
pulsout clock,1
endif
next b4
pulsout enable,1
pause 10
inc b5
if b5 = 2 then
return
else
goto cmd
endif

mensaje:
read b1,b0
if b0 = 43 then
return
endif
let b3=1
let b5=0
men:
high dato ;RS = 1
pulsout clock,1
for b4=0 to 3
let b2 = b0*b3 & %10000000
let b3=b3*2
if b2 = 128 then
high dato
pulsout clock,1
else
low dato
pulsout clock,1
endif
next b4
pulsout enable,1
pause 10
inc b5
if b5 = 2 then
inc b1
goto mensaje
else
goto men
endif

NOTAS:

  • Esta plantilla sólo inicia la LCD y es capaz de enviar comandos y mensajes pero no tiene la función para generar caracteres en la memoria RAM, eso se los dejo a ustedes ;).
  • Cuando se maneja la LCD con un microcontrolador se debe tener en cuenta la frecuencia de trabajo del microcontrolador, porque se requiere de un cierto tiempo de espera entre los pulsos, si el microcontrolador trabaja a una frecuencia alta y la LCD no responde correctamente, seguramente es por los tiempos entre cada instrucción.

La relación entre pulsos y tiempo es la siguiente:

Aquí el vídeo



Agradecimentos:
Ing. Juan Manuel Cobilt Catana
Ing. Edgar R. Calderón Díaz
Profesores del IPN de la ESIME Zacatenco de la carrera de ingeniería en comunicaciones y electrónica, sin ellos no habría podido realizar este pequeño trabajo.

2 comentarios: