Control de un LCD con un solo PIN

Diseño de una pequeña placa con microcontrolador para el control de un LCD utilizando un solo pin del micro

Biblioman

9/8/20105 min read

Después del periodo estival empezamos con este artículo que muestra como podemos enviar información a un LCD utilizando un solo pin de nuestro Microcontrolador. La idea es utilizar el protocolo de comunicación serie estándar RS-232 para enviar la información a otro microcontrolador que hará las funciones de controlador del LCD,

este se encargará de recibir los comandos y el texto enviados por el PIC transmisor y enviarlos en
el formato correcto al LCD para su representación en el mismo. No es necesario que el PIC transmisor disponga de UART, por ejemplo si programamos el PIC utilizando el compilador de CCS, podemos a través de la directiva #USE RS232 seleccionar fácilmente cualquier pin del PIC para la transmisión y recepción de datos, en el caso de que nuestro microcontrolador no disponga de UART la comunicación será gestionada por software a través de las funciones "buit-in" de las que dispone el compilador y de forma totalmente transparente para nosotros.

El funcionamiento es muy simple en el código del transmisor lo único que hay que hacer es enviar los caracteres en formato ASCII a través de las funciones especificas que cada compilador dispone para ello, por ejemplo si programamos nuestro PIC en C esas funciones serán printf(), puts() y putchar(), si utilizamos otro lenguaje de programación, lo único que habrá que hacer es ver que funciones implementa el compilador que utilicemos para tal fin.

El controlador serie se encargará de forma transparente de todo lo concerniente al control del LCD, cambiará de línea cuando sea necesario y borrará la pantalla al inicio de cada mensaje.

Configuración y control de flujo de datos.

En cualquier comunicación serie lo primero que se debe de establecer es la configuración de la interfaz entre transmisor y receptor, en este caso el controlador serie está configurado para una velocidad de 9600 baudios, 8 bits de datos y un bit de parada, pero fácilmente se le puede cambiar la configuración a otra distinta.

Otro tema importante en la comunicación serie es el control de flujo de datos, para ello el estándar establece dos formas: control de flujo de datos por hardware (handshaking RTS/CTS), en este caso además de los pines Tx y Rx para la transmisión y recepción de datos se utilizan dos pines más para las señales RTS y CTS que son utilizadas para la sincronización de los datos entre emisor y receptor. La otra forma de controlar el flujo de datos es por software a través del envío de caracteres especiales (XON/XOFF), en este caso no se necesita ningún pin adicional. El controlador serie necesita saber cuando acaba una cadena de texto y empieza otra, para ello se utiliza el caracter de retorno de carro (/r) que hay que incluir al final de cada cadena de texto en el programa del PIC transmisor.

El Microcontrolador utilizado en el controlador serie es un PIC16f628 que es un PIC de 18 pines muy utilizables, ya que una característica de este microcontrolador es que dispone de un oscilador interno a 4MHz, con lo que si lo utilizamos nos ahorramos el incluir en el circuito el cristal de cuarzo con los condensadores.

Como se muestra en la figura de abajo el esquema del circuito es bien simple:

El circuito incluye un conector IDE de 16 pines que permite la conexión y desconexión del LCD fácilmente, de esta manera no hacemos fijo el LCD al controlador, pudiendo utilizar el LCD en otros circuitos.

Vamos a ver el funcionamiento del controlador serie con un ejemplo, para ello utilizaremos como PIC transmisor el que viene en el kit de desarrollo PIC16f877A de CCS y al que se le conectan diferentes periféricos típicos en cualquier desarrollo con microcontroladores, el esquema de bloques del
ejemplo será el siguiente:

Comentario

El programa del PIC transmisor se encarga de hacer la lectura de datos de un reloj en tiempo real (RTC) y el de un sensor de temperatura, los datos son enviados via serie al controlador LCD a través de la función printf() incluyendo al final de cada cadena de texto el caracter de retorno de carro, que le indicará al controlador LCD el final de la cadena, la función delay_ms() establece un retardo de 1,5 segundos entre cada mensaje para que de tiempo a leerlos en el LCD:

while(true)

{

.........

.........

printf("www.AquiHayApuntes.com\r");

delay_ms(1500);

printf("Prueba Controlador LCD Serie Universal\r");

delay_ms(1500);

printf(" Hora : %02u:%02u:%02u\r",hora,minutos,segundos);

delay_ms(1500);

printf("Temperatura = %f\r",datos);

delay_ms(1500);

.........

.........

}

Una de las ventajas que presenta el utilizar el controlador LCD serie además de solo necesitarse un pin para transmitir los datos, es que al transmitirse los datos a través de un protocolo estándar, es independiente de la plataforma utilizada por lo que podremos utilizarlo en diferentes placas con microcontroladores de arquitectura diferente y sin tener que preocuparnos de ningún driver. Otro uso que le podemos dar es para depurar nuestros programas, supongamos que no disponemos de ningún debugger en tiempo real y nuestro simulador software favorito no dispone del modelo de pic que estemos utilizando en nuestro proyecto, por ejemplo un PIC32. Podemos incluir en nuestro programa fragmentos de código que envíen mensajes al LCD del valor de determinadas variables, de manera similar a como hacíamos cuando enviábamos los mensajes a través del adaptador de niveles MAX232 y veíamos los resultados en el hyper terminal de nuestra computadora personal, pero esta vez sin tener que utilizar ningún PC.

Por ejemplo el siguiente fragmento de código lo podemos utilizar para comprobar el valor que va tomando la variable "x" durante la ejecución del programa. Para hacer más funcional nuestro código de depuración vamos ayudarnos de las directivas del Pre-procesador, lo que hay dentro de las directivas #ifdef y #Endif solo se compilará si previamente hemos definido la etiqueta DEBUG. Si no está definida esa etiqueta ese código no se compilará y por tanto no consumirá recursos de memoria del PIC. Por lo que comentando o descomentando una sola línea de nuestro código es suficiente para saber el valor que van tomando las variables en la secuencia de ejecución de nuestros programas.

//#define DEBUG

void main(void)

{

int x;

while(true)

{

.......

.......

//Ejemplo depuración

#ifdef DEBUG

printf("Debugging con el controlador LCD serie:\r");

delay_ms(1500);

printf("El valor de x es: %d\r",x);

delay_ms(1500);

#Endif

x++;

}

Aquí tenéis el vídeo del circuito funcionando.