Hola a todos 
La manera "común" de conectar un LCD (HD44780 o compatible) directamente al PIC, es poner el LCD en modo de 4 bits y sólo utilizar 6 pines del PIC (4 de datos, enable y RS).
Esta forma no me ayuda mucho en el proyecto que necesito, aunque ya logré obtener más pines libres utilizando el oscilador interno sin salidas, y desactivando el Reset del pic, me hacían falta 2 pines mas en algún puerto. Sin contar que la manera de enviar datos al LCD en modo de 4 bits es un poco tediosa y cansada para programar.
Así que opté por usar el LCD en modo de 8 bits, pero la pregunta es: Si mi circuito como estaba no era la solución, añadir 4 pines mas de datos sonaba de risa.
Buscando información en al red (de la cuál no existe mucha variedad), me topé con una variante del circuito que presento.
Se utiliza un TTL 74LS374, conectado como registro de corrimiento, para recibir de manera serial los datos del PIC y enviarlos al LCD de manera paralela, así sólo se utilizan 4 pines del PIC, 1 de datos, 1 de reloj para el TTL, enable y RS (estos dos últimos del LCD).
Ahora bien, si se quisiera utilizar el LCD en modo de 4 bits, se puede utilizar un TTL 74LS174 de sólo 6 registros. Así se usan 4 para datos, 1 para enable y 1 para RS, dejando el uso de pines del PIC reducido a dos solamente, 1 de datos y uno de reloj para el TTL.
Esta solución tiene un pequeño detalle, el último bit de salida del TTL debe ser casi por fuerza conetado al enable del LCD, ya que es el que activa la orden de leer e interpretar los demás datos en las entradas del LCD. si se conecta al otro bit, el LCD podría no responder al comando de enable, aunque esto depende mucho de los tiempos de propagación del TTL.
Una ventaja de este sistema es que ninguno de los dos TTL son caros, y son una manera sencilla de solucionar ese problema de los pines que nunca sobran en el PIC (Claro esto a menos que se cuente con bastante capital y se opte por un PIC de 40 o mas pines).
Pensando en el consumo de corriente, desafortunada mente los dos TTL tienen un consumo "elevado" del rango de los 30ma, y digo "elevado", ya que si el proyecto se va a utilizar con baterías, no esperen que duren demasiado. Pero claro, en su variante "CMOS", ya sea 74HC374 o 74HC174, las cosas cambian.
Ahora, esto es desde el punto de vista del hardware, pasando al tema del software, no es muy complicado realizar el envío serial al TTL.... mhhh bueno no es complicado una vez que se encuentra la manera correcta después de varias noches de desvelo ajjajajaj.
El código de pureba que utilicé es este:
(Solamente para enviar un comando, Encender o apagar el LCD, limpiar la pantalla, mover el cursos, hacer que parpadee, etc, para enviar las letras, se utiliza uno un poco diferente)
Antes de llamar a esta sub-rutina, se debe cargar el registro W con el valor del comando que se desea activar.
El registro "corrimiento" se carga a 8 ya que son 8 bits los que se van a rotar.
Claro que esta sólo es una de tantas maneras de hacerlo, pero es la primera a la que llegué y me funcionó, ya después lo aplique directamente a resto de mi programa haciendo los ajustes necesarios.
Espero y esta información dea de utilidad para todos
Saludos al foro
La manera "común" de conectar un LCD (HD44780 o compatible) directamente al PIC, es poner el LCD en modo de 4 bits y sólo utilizar 6 pines del PIC (4 de datos, enable y RS).
Esta forma no me ayuda mucho en el proyecto que necesito, aunque ya logré obtener más pines libres utilizando el oscilador interno sin salidas, y desactivando el Reset del pic, me hacían falta 2 pines mas en algún puerto. Sin contar que la manera de enviar datos al LCD en modo de 4 bits es un poco tediosa y cansada para programar.
Así que opté por usar el LCD en modo de 8 bits, pero la pregunta es: Si mi circuito como estaba no era la solución, añadir 4 pines mas de datos sonaba de risa.
Buscando información en al red (de la cuál no existe mucha variedad), me topé con una variante del circuito que presento.
Se utiliza un TTL 74LS374, conectado como registro de corrimiento, para recibir de manera serial los datos del PIC y enviarlos al LCD de manera paralela, así sólo se utilizan 4 pines del PIC, 1 de datos, 1 de reloj para el TTL, enable y RS (estos dos últimos del LCD).
Ahora bien, si se quisiera utilizar el LCD en modo de 4 bits, se puede utilizar un TTL 74LS174 de sólo 6 registros. Así se usan 4 para datos, 1 para enable y 1 para RS, dejando el uso de pines del PIC reducido a dos solamente, 1 de datos y uno de reloj para el TTL.
Esta solución tiene un pequeño detalle, el último bit de salida del TTL debe ser casi por fuerza conetado al enable del LCD, ya que es el que activa la orden de leer e interpretar los demás datos en las entradas del LCD. si se conecta al otro bit, el LCD podría no responder al comando de enable, aunque esto depende mucho de los tiempos de propagación del TTL.
Una ventaja de este sistema es que ninguno de los dos TTL son caros, y son una manera sencilla de solucionar ese problema de los pines que nunca sobran en el PIC (Claro esto a menos que se cuente con bastante capital y se opte por un PIC de 40 o mas pines).
Pensando en el consumo de corriente, desafortunada mente los dos TTL tienen un consumo "elevado" del rango de los 30ma, y digo "elevado", ya que si el proyecto se va a utilizar con baterías, no esperen que duren demasiado. Pero claro, en su variante "CMOS", ya sea 74HC374 o 74HC174, las cosas cambian.
Ahora, esto es desde el punto de vista del hardware, pasando al tema del software, no es muy complicado realizar el envío serial al TTL.... mhhh bueno no es complicado una vez que se encuentra la manera correcta después de varias noches de desvelo ajjajajaj.
El código de pureba que utilicé es este:
(Solamente para enviar un comando, Encender o apagar el LCD, limpiar la pantalla, mover el cursos, hacer que parpadee, etc, para enviar las letras, se utiliza uno un poco diferente)
Código:
comando_LCD
movwf datos_seriales ; Toma le valor de W, previamente cargado con los 8 bits del comando
movlw 0x08
movwf corrimiento ; Se utiliza para recorrer 8 veces los datos
shift
btfsc datos_seriales, 7 ; se checa el valor del bit 7 del registro datos_seriales
bsf TTL_data ; si es 1
goto setbit ; si es 0
setbit
bsf TTL_clk ; cambia el nivel del pin de CLK del TTL o 1
nop ; espera
bcf TTL_clk ; cambia el nivel del pin de CLK del TTL o 0
bcf TTL_data ; Pone en 0 el pin de entrada de datos del TTL
rlf datos_seriales, 1 ; Rotar hacia la izquierda datos_seriales, poniendo el resultado en si mismo
decfsz corrimiento, 1 ; resta uno al registro corrimiento, skip si es 0
goto shift ; Si es 1 va al label "shift"
bsf LCD_e ; Si es 0 Enciende el LCD Enable
call delay01 ; Retraso "X" de tiempo (Consultar la tabla de tiempos de espera para el LCD)
clrf datos_seriales ; Borra el registro datos_seriales
bcf LCD_e ; Apaga LCD Enable
bcf TTL_data ; Pone en 0 el pin de entrada de datos del TTL
call delay01 ; Retraso "Y" de tiempo (Consultar la tabla de tiempos de espera para el LCD)
return ; Regresa a donde se hizo la llamada a esta sub-rutina
Antes de llamar a esta sub-rutina, se debe cargar el registro W con el valor del comando que se desea activar.
El registro "corrimiento" se carga a 8 ya que son 8 bits los que se van a rotar.
Claro que esta sólo es una de tantas maneras de hacerlo, pero es la primera a la que llegué y me funcionó, ya después lo aplique directamente a resto de mi programa haciendo los ajustes necesarios.
Espero y esta información dea de utilidad para todos
Saludos al foro