Pantallas LCD con microcontroladores


Compartir: Share on Facebook2Tweet about this on TwitterShare on Google+0Share on Tumblr0Share on LinkedIn0

pantallas lcd

Pantallas LCD con el PIC BASIC PRO.

Pantallas LCD con el CCS.

Pantallas LCD con el XC8.

Pantallas LCD con el AVR.

Pantallas LCD con el ARDUINO.

Aprender a utilizar pantallas LCD es muy importante cuando se utilizan microcontroladores, las pantallas lcd son útiles para obtener información en forma visual sobre que es lo que está ocurriendo en el microcontrolador, como puede ser los valores de los registros, o de alguna variable que se esté utilizando, la observación por ejemplo de algún dato como puede ser una medida analógica entre muchas otras informaciones de interés.

En este apartado se comentará sobre las pantallas LCD de 2×16 caracteres es decir pantallas LCD de 2 lineas por 16 columnas como las que se muestran en la imagen, estas pantallas lcd dejan ver 16 caracteres por fila, permitiendo por lo tanto la observación de hasta 32 caracteres, pero en realidad por cada fila se puede almacenar hasta 40 caracteres dando un total de 80 caracteres.

Los caracteres están almacenados dentro de una memoria interna que tienen las pantallas lcd, son controlador por un microcontrolador HD44780 o algún otro compatible que viene con la pantalla; entonces para utilizarlas lo que hay que hacer es que el microcontolador que se esté utilizando ya sea un PIC, un AVR, un ARDUINO o algún otro, se comunique con el microcontrolador del LCD, interactuen y nos permitan ver información en las pantallas LCD mediante caracteres.

Las pantallas LCD tienen una serie de pines, las cuales tienen unos nombres especiales que por supuesto tienen un orden de conexión, son 14 pines ordenados del  1 al 14, esto siempre viene indicado en la placa de las pantallas lcd, estos pines son para  la alimentación, el control y la comunicación, el envió y recibo de datos, tienen ademas 2 pines para el uso de un led interno que algunas pantallas lcd lo tienen y otras no, normalmente serán como se ve en la  siguiente imagen.

Paantallas lcd pines de conexión

Pantallas LCD pines de conexión

En la siguiente lista se tienen los pines de las pantallas LCD de 2×16 con su número de orden,  su nombre y su función:

pantallas lcd pines de conexión

El siguiente es un vídeo publicado por MrElberni, donde se da una breve introducción a las características de las pantallas LCD, se hacen unas pruebas en cuanto a la alimentación, el contraste de los caracteres y del led interno del LCD.

En este enlace encontrarás información mas detallada sobre las características de las pantallas lcd.

Para utilizar las pantallas LCD con los microcontroladores, primeramente hay que alimentar adecuadamente el LCD, con su pin 1 al negativo o tierra, su pin 2 al positivo, y su pin 3 a un potenciometro para regular el contraste de los caracteres, en el vídeo anterior se muestra como hacer esto. Sus pines 4, 5 y 6 que son los pines de control se conectarán cada uno a un pin diferente del microcontrolador, los pines 7 a 14 son los pines a través de los cuales se enviarán los datos del microcontrolador al LCD, para este envío de datos no es necesario utilizar los 8 pines que van del 7 al 14, se puede utilizar solo 4 de estos pines que es lo que normalmente se hará para hacer que el LCD trabaje adecuadamente, de esta manera se utilizan menos pines del microcontrolador que podrán ser utilizados para otras labores, en la siguiente imagen se muestra como hacer esto.

pantallas LCD interconexión

No es necesario conocer el funcionamiento interno de las pantallas LCD para su utilización ya que es un tanto complejo aunque si es muy interesante, si te interesa lo puedes ver en este enlace, normalmente los programas como el PicBasicPro, el CCS, el ARDUINO, entre otros traen drivers para el manejo de los microcontroladores, solo hay que indicar los pines del microcontrolador donde se conectarán los pines del LCD, luego utilizar una serie de funciones del programa que se esté utilizando para poder trabajar con el microcontrolador y el LCD.

Pantallas LCD en PIC BASIC PRO (PBP)

El PBP tiene una serie de definiciones que hacen bien simple el uso de las pantallas LCD estas son las que se indican a continuación:

DEFINE LCD_DREG PORTX          ‘Se utiliza el puerto x para  los datos a enviar al LCD.

DEFINE LCD_BITS 4                    ‘Se utilizarán 4 bits para el bus de datos.

DEFINE LCD_DBIT 4                   ‘Se utilizarán los pines D4, D5, D6 y D7 del LCD.

DEFINE LCD_RSREG PORTx         ‘El pin RS del LCD se conectará al puerto x.

DEFINE LCD_RSBIT n                  ‘RS se conectará en el pin n del puerto  x.

DEFINE LCD_EREG PORTx           ‘El pin E del LCDse conectará al puerto x.

DEFINE LCD_EBIT m                   ‘E se  conectará al pin m del puerto x.

DEFINE LCD_LINES 2                  ‘El LCD será de 2 líneas (2×16).

Una vez configurados los pines a utilizar, mediante la instrucción lcdout del PBP se hace que las pantallas LCD hagan algo.

En el canal de Youtube de MrElberni se han publicado 3 vídeos para el manejo de las pantallas LCD mediante el PBP.

Microcontroladores PIC en PBP pantallas LCD ejemplo 1, en este primer vído publicado por MrElberni se realiza un primer programa para el manejo de una pantalla LCD de 2×16 con el PBP, en este caso se utiliza el PIC16F84A; se comenta sobre la forma en que hay que escribir el código para decirle al programa que pines del PIC serán utilizados para datos y que pines serán los de control; luego mediante la instrucción lcdout del PBP se enviarán mensajes que se podrán ver en la pantalla LCD.

El formato de la instrucción lcdout que se utiliza tiene la siguiente forma:

lcdout dato,dato,dato…

Donde dato puede ser una instrucción para la pantalla LCD, y si dato va entre comillas será eso lo que se imprima en la pantalla.

En este caso se utiliza la instrucción $fe,1 la cual sirve para limpiar o borrar la pantalla LCD, es decir que borre todo lo escrito en la pantalla.

El vídeo es el siguiente:

El código utilizado en este caso es el siguiente:

pantallas lcd en pbp ejemplo1

Microcontroladores PIC en PBP pantallas LCD ejemplo 2 en este segundo vídeo publicado por MrElberni se ve la forma que se codifica en PBP para ver números en el la pantallas LCD en forma decimal, binaria, hexadecimal y en código ASCII, se utilizan las dos líneas del LCD 2×16; el programa utilizado en este caso es el PBP (PIC BASIC PRO), se usa el programador pickit3, se usa el PIC16F84A

Para ver los datos numéricos en forma decimal se utiliza la palabra dec o el caracter #

           dec dato

           # dato

Para ver datos numéricos en forma binaria se utiliza la palabra bin

           bin dato

Para ver datos numéricos en forma hexadecimal se utiliza la palabra hex

hex dato

Si no se antepone ninguna de las palabras anteriores al dato numérico, este se verá en la pantalla lcd en su equivalente ASII.

En este ejemplo también se trata sobre como se puede cambiar de línea en la pantalla LCD de 2×16, para eso se utilizan las siguientes instrucciones:

$fe,$80  con esta instrucción se va al inicio de la primera línea del LCD.

$fe,$c0  con esta instrucción se va al inicio de la segundo línea del LCD

El vídeo es el siguiente:

El diagrama de flujo y las conexiones realizadas en la siguiente imagen:

pantallas lcd en pbp ejemplo2

El código en PBP utilizado en este caso es el siguiente:

pantallas lcd en pbp codigo ejemplo2

Microcontroladores PIC en PBP pantallas LCD ejemplo 3, en este tercer vídeo publicado por MrElberni se realiza un programa en el PBP, para poder visualizar información sobre lo que está ocurriendo en el PIC, dicha información se verá a través de una pantalla LCD de 2×16 caracteres, se usa el programador pickit3, se usa el PIC16F84A.

En este caso se crea una variable, cuyo valor irá cambiando con el tiempo, este valor lo podremos ver en la pantalla LCD, además se activarán unos pines donde se conectan unos leds los  cuales encenderán o apagarán de acuerdo al valor que vaya tomando la variable, en la pantalla LCD se informará cual de los leds se ha activado.

El vídeo es el  siguiente:

El diagrama de flujo del programa utilizado es el siguiente:

pantallas lcd en pbp ejemplo3 diagrama de flujo

Las conexiones del circuito utilizado a continuación:

pantallas lcd en pbp ejemplo3 circuito.2

El código en PBP utilizado en este caso es el siguiente:

pantallas lcd en pbp ejemplo3 codigo1

pantallas lcd en pbp ejemplo3 codigo2

Pantallas LCD en CCS

El CCS tiene un driver para el manejo de pantallas LCD, este driver hay que incluirlo en la cabecera del programa mediante la siguiente línea de código

#include <lcd.c>

Este driver trabaja por defecto con el puerto D y permite utilizar las pantallas LCD para que trabajen con 4 bits de datos, siendo los pines a conectar como se muestra a continuación.

Pin del PIC          Pin del LCD

RD0                       E

RD1                       RS

RD2                       RW

RD4                       D4

RD5                       D5

RD6                       D6

RD7                       D7

También se puede hacer que trabaje con el puerto B agregando la siguiente linea de código

#define use_portb_lcd TRUE

Siendo el orden de conexión de los pines el mismo pero en este caso en el puerto B

La elección de los pines a utilizar del microcontrolador PIC, tambíen se puede seleccionar con el asistente al crear el programa, se puede elegir cualquier pin para los pines de control y para los pines de datos, en la siguiente imagen se muestra el asistente del CCS para elegir el uso de pantallas LCD con el  pic, se selecciona la casilla Use LCD, luego se seleccionan los pines que se usaran para el control y el envió de datos a la pantalla LCD.

pantallas lcd en ccs asistente

Al darle en Create Project, el programa incluirá automaticamente el archivo de cabecera, las definiciones de los pines a utilizar los cuales deben ir antes de la inclusión del archivo de cabecera para el uso de las pantallas LCD, además crea la función lcd_init() tal como se muestra en la siguiente imagen:

pantallas lcd en ccs codigo creado por el asistente

Una vez incluido el archivo de cabecera y elegido los pines del microcontrolador a utilizar ya se pueden utilizar las funciones para el manejo de las pantallas lcd, la primera función que hay que llamar siempre es

lcd_init(); //esta se encargará de inicializar las pantallas lcd para su utilización.

Luego hay otras funciones mas como:

lcd_gotoxy(int8 x, int8 y);//para ubicar el cursor en una posición de la pantalla x para la columna e y para la fila, por ejemplo lcd_gotoxy(4,1) que indica en la primera fila la cuarta columna.

lcd_putc(char s);//para escribir caracteres en la pantalla lcd.

printf(lcd_putc,cstring,valores);//esta es una función del lenguaje C por lo que se recomienda que se lea sobre la función printf en el lenguaje C, en este caso está adaptada para su uso con los microcontroladores, permite ver en las pantallas lcd cadenas de caracteres con formato, un ejemplo sería:

printf(lcd_putc,”timer1 = %u”,timer1);// donde %u es para indicarle que el dato timer1 será de tipo entero sin signo, para datos de tipo cadena sería %s, en la siguiente tabla se  pueden ver los formatos para los diferentes tipos de datos.

Formato         Tipo de dato

%c                   Caracter

%s                   Cadena o caracter

%u                   Entero sin signo

%d                   Entero con signo

%Lu                 Entero largo sin signo

%Ld                 Entero largo con signo

%x                   Entero hexadecimal en minúsculas

%X                   Entero hexadecimal en mayúsculas

%Lx                  Entero largo hexadecimal en minúsculas

%LX                 Entero largo hexadecimal en mayúsculas

%f                    Número real o flotante

%g                   Número real o flotante con redondeo

%e                   Número real o flotante en  forma exponencial

Si esto se ve en una forma mas general tendrían esta forma %t donde t puede ser cualesquiera de los indicados, esto se puede manipular mas si se usa la forma %nt, donde n representa una opción para mejorar la presentación de los números en la pantalla.

si n va de 1 a 9 indica la cantidad de caracteres que se tendrán, si tiene la forma de 01 a 09 indica la cantidad de ceros a la izquierda y si va de 1.1 a 9.9 para indicar cuantos decimales tendrá el número.

por ejemplo %3d indica un entero con signo de 3 caracteres, %.3f indica un numero real con 3 decimales.

También se cuenta con unos caracteres especiales como

“\n” para cambiar de una fila a otra.

“\f” para limpiar o borrar la pantalla.

Ejemplito 1 El siguiente es un ejemplo del uso de las pantallas lcd con el CCS, en este caso se está utilizando el PIC16F877A del cual previamente se han configurado sus bits, está trabajando con un cristal de 4Mhz, este programa solo imprimirá el mensaje Amor mio en la pantalla LCD como se ve luego de la imagen del programa.

pantallas lcd con ccs ejemplo1 codigo

Borra la pantalla, imprime “amor mio”, espera 200ms, vuelve a borrar la pantalla, vuelve a imprimir “amor mio”, vuelve a esperar 200ms, vuelve a borrar la pantalla, vuelve a imprimir “amor mio”, vuelve a borrar la pantalla, vuelve a…. y así hasta el infinito, lo que pasa es que ocurre muy rápido por eso que no se ve.

El circuito funcionando es el siguiente:

papntallas lcd en ccs ejemplo1 circuito

En el siguiente vídeo publicado por MrElberni, se comenta la forma de utilizar el CCS para hacer trabajar las pantallas lcd con un microcontrolador PIC, la intención en este caso es conocer el driver necesario para realizar esto, y el uso del asistente del CCS para el manejo de las pantallas LCD, a la hora de iniciar un programa.

Ejemplito 2 El siguiente programa de ejemplo imprimirá el mensaje “Juntos amor” en la primera fila y en la segunda fila una variable entera de 8 bits llamada tiempo que ira aumentando de de uno en uno desde 0 hasta 255, en la imagen que se tome aparecerá un número entre estos valores ya que no se podrá ver como cambia, si gustan se puede simular en el proteus, el programa es el siguiente:

pantallas lcd con ccs ejemplo2 codigo

pantallas lcd con ccs ejemplo 2 codigo2

Borra o limpia la pantalla, el cursor del lcd se ubica en la primera columna de la primera fila, a partir de esa posición imprime Junto a ti Amor, luego el cursor se ubica en la primera  columna de la segunda fila, a partir de allí imprime Tiempo = valor de la variable tiempo, la variable tiempo aumentará en una unidad cada 200ms esto no se podrá ver en la imagen que sigue pero se verá algún valor entre 0 y 255, cuando el valor de la variable tiempo es igual a 255 la variable tiempo se pondrá a 0 nuevamente.

El circuito funcionando es el siguiente:

pantallas lcd con ccs ejemplo2 circuito

En el siguiente vídeo publicado por MrElberni, se comenta sobre la forma de lograr ver datos numéricos en una pantalla LCD la cual se encuentra conectada al PIC16F877A, se utiliza el CCS para lograr esto.

Pantallas LCD en MPLAB XC8

El XC8 tiene unos drivers para el uso de las pantallas LCD con los pic18 o de gama alta, estos drivers no funcionan con los pic16 o gama  baja como es el caso del PIC16F877A, el cual se está utilizando para los ejemplos, por lo que será necesario crear un controlador propio, existen muchos por allí, en este caso se utilizará uno creado por nosotros para el manejo de pantallas LCD de 2×16.

El código utilizado para controlar el LCD se agregará en los programas como un archivo de cabecera, en este caso el nombre del archivo de cabecera es lcd.h, pero el nombre se puede cambiar.

En este caso se ha programado para que lso pines del control de la pantalla LCD sea a través de los pines RA0, RA1, y RA2 del PIC; y los pines para el envio de datos u ordenes se hacen por los pines RB4, RB5, RB6 y RB7 del microcontrolador PIC, los pines utilizados se pueden modificar, con la condición de que los pines utilizados para el control puede ser cualesquiera, pero los pines para los datos tienen que ser los 4 pines que estén conectados a el nibble alto de cualquier puerto, esto es de los bits 4 al 7 por ejemplo RC4, RC5, RC6 y RC7.

Se deja mas abajo también el archivo de cabecera para el control de los tiempos utilizados para la elaboración del archivo de cabecera del LCD.

El código del archivo de cabecera para el uso de las pantallas LCD con los PIC es el siguiente:

#ifndef     LCD_H
#define LCD_H
#include “tiempo.h”              ///Se incluye para los retardos
#define rs             PORTAbits.RA0             //Esto lo puedes
#define tris_rs     TRISAbits.TRISA0         //modificar si quieres utilizar
#define rw            PORTAbits.RA1            //otros pines del PIC
#define tris_rw     TRISAbits.TRISA1        //para los bits de control del LCD
#define e              PORTAbits.RA2
#define tris_e      TRISAbits.TRISA2
#define db4           PORTBbits.RB4              //Esto lo puedes modificar si quieres
#define tris_db4    TRISBbits.TRISB4          //que los pines para el envio de datos
#define db5           PORTBbits.RB5             //u ordenes sean a través de otro puerto
#define tris_db5    TRISBbits.TRISB5        //pero es este caso siempre tendrá que
#define db6           PORTBbits.RB6             //ser el nibble alto del puerto que utilices.
#define tris_db6    TRISBbits.TRISB6
#define db7           PORTBbits.RB7
#define tris_db7    TRISBbits.TRISB7
void lcd_inicia();
void lcd_pulso();
void lcd_orden(unsigned int);
void lcd_caracter(unsigned int );
void lcd_mensaje(char*);
void lcd_limpiar();
void lcd_acasa();
void lcd_ubicate(char,char);
void lcd_inicia(){
    tris_rs=0;
    tris_rw=0;
    tris_e=0;
    tris_db4=0;
    tris_db5=0;
    tris_db6=0;
    tris_db7=0;
    rs=0;
    rw=0;
    e=0;
    db4=0;
    db5=0;
    db6=0;
    db7=0;
    delay_ms(20);
    PORTB=0X03<<4;                           //Esto también deberá modificarce,
    lcd_pulso();                                       //dependiendo del puerto que utilices para
    delay_us(4100);                                 //el envio de datos u ordenes.
    PORTB=0X03<<4;
    lcd_pulso();
    delay_us(4100);
    PORTB=0X03<<4;
    lcd_pulso();
    delay_us(150);
    PORTB=0X02<<4;//a 4 bits
    lcd_pulso();
    lcd_orden(0x28);//a 4 bits,2 lineas, 5×7 puntos
    delay_us(80);
    lcd_orden(0x0c);//display encendido,no muestra cursor,sin parpadeo
    delay_us(80);
    lcd_orden(0x01);//Limpia pantalla;
    delay_ms(2);
    lcd_orden(0x06);//incremento a la derecha, sin desplazamiento de display
    delay_us(80);
}
void lcd_pulso(){   //función para habilitar el LCD
    e=1;
    delay_us(40);
    e=0;
    delay_us(40);
}
void lcd_orden(unsigned int orden){   //Función para enviar ordenes al LCD
    rs=0;
    //Se modificará  si se usa un puerto diferente al PORTB
    PORTB=(((((PORTB>>4&0x0f)|0x0f)&(orden>>4&0x0f))<<4)|(PORTB&0x0f));
    lcd_pulso();
    PORTB=(((((PORTB>>4&0x0f)|0x0f)&(orden&0x0f))<<4)|(PORTB&0x0f));
    lcd_pulso();
}
void lcd_caracter(unsigned int caracter){   //Función para enviar caracteres al LCD
    rs=1;
    //Se modificará  si se usa un puerto diferente al PORTB
    PORTB=(((((PORTB>>4&0x0f)|0x0f)&(caracter>>4&0x0f))<<4)|(PORTB&0x0f));
    lcd_pulso();
    PORTB=(((((PORTB>>4&0x0f)|0x0f)&(caracter&0x0f))<<4)|(PORTB&0x0f));
    lcd_pulso();
    rs=0;
}
void lcd_mensaje(char* cadena){  //Función para enviar cadenas de caraacteres al LCD
    while(*cadena != 0x00){
        lcd_caracter(*cadena);
        cadena++;
    }
}
void lcd_limpiar(){     //Función para limpiar la pantalla LCD
    lcd_orden(0x01);
    delay_ms(2);
}
void lcd_acasa(){        //Función par enviar el cursor al inicio de la pantalla
    lcd_orden(0x02);
    delay_us(40);
}
void lcd_ubicate(char linea,char columna){  //Función para ubicar el cursor
    lcd_acasa();                         //en cualquier ubicación del LCD
    if (linea==1){
        for(char i=1; i<columna; i++){
            lcd_orden(0x14);
        }
    }
    if(linea==2){
        for (char i=1;i<(columna+40);i++){
            lcd_orden(0x14);
        }
    }
}
#endif

El código para el archivo de cabecera de los tiempos es el  siguiente:

#ifndef TIEMPO_H
#define TIEMPO_H
void delay_ms(unsigned int);
void delay_us(unsigned int);
void delay_ms(unsigned int tiempo){
    for(int i=0;i<tiempo;i++){
        __delay_ms(1);
    }
}
void delay_us(unsigned int tiempo){
    for(int i=0;i<tiempo;i++){
        __delay_us(1);
    }
}
#endif

En el canal de youtube de MrElberni se han publicado 2 vídeos para ver el uso de las pantallas LCD con el XC8, en ellos se  ven la forma de utilizar los archivos indicados lineas arriba.

Microcontroladores  PIC en XC8 Pantallas LCD parte 1, en este primer vídeo se ve como utilizar los archivos de cabecera para la utilización de las pantallas lcd, en este caso se  ve como ver mensajes y como ver números en los LCD.

Microcontroladores  PIC en XC8 Pantallas LCD parte 2, este es un complemento al vídeo anterior, en este caso se comenta mas sobre el archivo de cabecera para el manejo de las pantallas LCD y sobre las funciones que podemos utilizar.

Compartir: Share on Facebook2Tweet about this on TwitterShare on Google+0Share on Tumblr0Share on LinkedIn0