Como utilizar un Display LCD con solo tres lineas de I/O del HC908.
Breve descripción de funcionamiento
Este circuito es apto para el 90% de las aplicaciones con lcd excepto aquellas que necesiten de un muestreo rápido de datos. Es de mucha utilidad cuando el procesador no dispone de suficientes lineas de entrada-salida y no es generalmente necesario con procesadores grandes como los HC908GP32, HC908AP64, etc.
Observe el circuito; un HC908QY4 es el corazón de todo esto. Utilizamos los pines PTB0, PTB1 y PTB2 para controlar y mostrar textos en el LCD. Esto nos lleva a un CD4094 (shift regiter - convertidor de serie a paralelo) que nos va a proporcionar el bus de datos hacia el display LCD
En el CD4094 los datos son sicronizados en el flanco ascendente y en display LCD los va a tomar en el flanco descendente nos hace ver que esta señal puede ser compartida.
Bien, entonces en el flanco creciente el CD4094 transfiere el dato del nuevo byte hacia fuera y en el flanco de caída el display LCD lo lee. Tengamos en cuenta que con este método no podemos leer información del display LCD (Opinión personal: es totalmente innecesario).
Ahora viene la parte más dura: Como separar textos de comandos. El LCD tiene un pin para esto: el pin RS. Cuando este esta en 0 son aceptados comandos, cuando esta en uno es aceptado texto (caracteres ASCII). ¿Como se resuelve esto?
Antes de enviar un character al CD4094 inicializo un timer en 500uSec. El resistor R1 va a cargar el capacitor C5. Luego envío el carácter al CD4094 tan rápido como sea posible. De esta forma el capacitor simplemente no tiene el tiempo suficiente como para descargarse. El display LDC lo aceptará como texto. Para comando es lo mismo, solo en sentido contrario. El capacitor se tiene que descargar.
T1 forma un seguidor por emisor para proteger la red R/C. La razón de esto es que la entrada RS del LCD es una entrada TTL y debemos acondicionar adecuadamente la señal para que trabaje correctamente.
#include <hidef.h>
#include "derivative.h"
#define LINE1 0x80
#define LINE2 0xC0
#define DTASHT 0x01 // PTA0
#define CLKSHT 0x02 // PTA1
#define STBSHT 0x04 // PTA2
#define CTRL 1
#define DATA 0
void Shift(char, char);
void Delay(int);
void Write(char, char*);
void Init_Dsp(void);
void main(void) {
CONFIG1 = 0x01;
CONFIG2 = 0x00;
DDRA = 0x07;
PTA = 0x00;
Init_Dsp();
for(;;) {
Init_Dsp();
Write(LINE1," Hola Mundo ");
}
}
//=====================================
void Init_Dsp(void) {
PTA |= CLKSHT;
Shift(CTRL,0x06);
Shift(CTRL,0x0E);
Shift(CTRL,0x38);
Shift(CTRL,0x80);
Shift(CTRL,0x0C); // Cursor off
Shift(CTRL,0x01); // Clear Display
}
void Write(char pos, char *text) {
Shift(CTRL,pos);
while(*text) Shift(DATA,*text++);
}
void Shift(char donde, char dato) {
int i;
for(i=0; i<8; i++){
if(dato & 0x80) PTA |= DTASHT;
else PTA &= ~DTASHT;
if(donde) {
PTA &= ~CLKSHT;
Delay(200);
PTA |= CLKSHT;
}
else {
PTA &= ~CLKSHT;
PTA |= CLKSHT;
}
dato <<= 1;
}
PTA |= STBSHT;
PTA &= ~STBSHT;
if(donde) Delay(2000);
}
void Delay(int time) {
for(; time>0; time--);
}





