LCD PIC PANTALLA LCD 2×16 CON EL PIC
Una de las aplicaciones de las entradas salidas digitales PIC viene a ser el uso de las pantallas LCD, estas pantallas LCD son muy útiles para obtener información sobre lo que va ocurriendo en los registros, en las variables o como se van actualizando los datos que se este utilizando mientras se utiliza el microcontrolador PIC.
La pantalla LCD que se comentará y que será la que se utilice en los ejemplos con los microcontroladores PIC será la de 2 filas por 16 columnas, que es la que aparece en la imagen, esta se alimenta a 5VCC, como se ve consta de 16 pines, el pin 1 es el negativo de la alimentación, el pin 2 es el positivo de la alimentación, y el pin 3 es para el contraste de los caracteres que se visualizan.
Los pines 4, 5 y 6 son para el control de la pantalla LCD, los pines 7 al 14 son utilizados para el envió y recepción de datos en un grupo de 8 bits, pero resulta que se le puede hacer trabajar con solo 4 pines, de este modo se ahorran pines del microcontrolador PIC.
Los pines 15 y 16 son para unos leds de fondo de pantalla, esto es para iluminar la pantalla si así se desea, algunas pantallas LCD no cuentan con estos pines.
Se encuentra una guía sobre como utilizar la pantalla LCD en este enlace.
El siguiente es el vídeo publicado por MrElberni sobre el uso de las pantallas LCD.
En este caso se ha preparado un código para hacer trabajar la pantalla LCD con el Microcontrolador PIC utilizando el XC8, se necesitarán un total de 7 pines del microcontrolador, son muchos pero para hacer pruebas de visualización por ahora vale la pena.
Para tener un orden al programar se recomienda que el siguiente código para el manejo del LCD PIC sea incluida en un archivo de cabecera dentro del mismo proyecto en el que se esté trabajando, para ello en el MPLABX, en la pestaña del proyecto se hará click derecho sobre Header Files -> new -> C Header File, poner como nombre lcd, esto creará el archivo de cabecera lcd.h, como se muestra en la imagen.
Para el ejemplo el proyecto se ha llamado lcd1, el programa principal que está en Suorce Files se llamo lcdpic.c y el archivo creado en Header Files será lcd.h, es el mostrado en la imagen, en este archivo en la parte resaltada se colocará el código siguiente para el uso de la pantalla LCD con el microcontrolador PIC, este lcd.h luego será incluido en el programa principal.
El código a utilizar es el siguiente:
#define mitris TRISD //se usará el puerto D, si se quiere otro puero se puede cambiar
#define mipuerto PORTD //LATD para el PIC18F4550
#define rs 0 //Pin rs al pin RD0 del PIC
#define tris_rs 0
#define rw 1 //Pin rw al pin RD1 del PIC
#define tris_rw 1
#define e 2 //Pin e al pin RD2 del PIC
#define tris_e 2
#define rd4 4 //Pin data4 al pin RD4 del PIC
#define tris_rd4 4
#define rd5 5 //Pin data5 al pin RD5 del PIC
#define tris_rd5 5
#define rd6 6 //Pin data6 al pin RD6 del PIC
#define tris_rd6 6
#define rd7 7 //Pin data7 al pin RD7 del PIC
#define tris_rd7 7
void lcd_inicia(void);
void lcd_pulso(void);
void lcd_orden(unsigned char);
void lcd_caracter(unsigned char);
void lcd_mensaje(const char*);
void lcd_limpiar(void);
void lcd_acasa(void);
void lcd_ubicate(unsigned char,unsigned char);
void lcd_inicia(void){
//los pines a utilizar como salidas digitales
mitris&=~(1<<tris_rs);
mitris&=~(1<<tris_rw);
mitris&=~(1<<tris_e);
mitris&=~(1<<tris_rd4);
mitris&=~(1<<tris_rd5);
mitris&=~(1<<tris_rd6);
mitris&=~(1<<tris_rd7);
//las salidas se inician a 0
mipuerto&=~(1<<rs); //rs=0;
mipuerto&=~(1<<rw); //rw=0;
mipuerto&=~(1<<e); //e=0;
mipuerto&=~(1<<rd4); //db4=0;
mipuerto&=~(1<<rd5); //db5=0;
mipuerto&=~(1<<rd6); //db6=0;
mipuerto&=~(1<<rd7); //db7=0;
__delay_ms(20); //secuencia de inicio
mipuerto=0X03<<4;
lcd_pulso();
__delay_us(4100);
mipuerto=0X03<<4;
lcd_pulso();
__delay_us(4100);
mipuerto=0X03<<4;
lcd_pulso();
__delay_us(150);
mipuerto=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(void){ //función para habilitar el LCD
mipuerto|=(1<<e); //e=1
__delay_us(40);
mipuerto&=~(1<<e); //e=0
__delay_us(40);
}
void lcd_orden(unsigned char orden){ //Función para enviar ordenes al LCD
mipuerto&=~(1<<rs);//rs=0
mipuerto=(unsigned char)(((((mipuerto>>4&0x0f)|0x0f)&(orden>>4&0x0f))<<4)|(mipuerto&0x0f));
lcd_pulso();
mipuerto=(unsigned char)(((((mipuerto>>4&0x0f)|0x0f)&(orden&0x0f))<<4)|(mipuerto&0x0f));
lcd_pulso();
}
void lcd_caracter(unsigned char caracter){ //Función para enviar caracteres al LCD
mipuerto|=(1<<rs);//rs=1
mipuerto=(unsigned char)(((((mipuerto>>4&0x0f)|0x0f)&(caracter>>4&0x0f))<<4)|(mipuerto&0x0f));
lcd_pulso();
mipuerto=(unsigned char)(((((mipuerto>>4&0x0f)|0x0f)&(caracter&0x0f))<<4)|(mipuerto&0x0f));
lcd_pulso();
mipuerto&=~(1<<rs);//rs=0
}
void lcd_mensaje(const char* cadena){ //Función para enviar cadenas de caracteres al LCD
while(*cadena != 0x00){
lcd_caracter(*cadena);
cadena++;
}
}
void lcd_limpiar(void){ //Función para limpiar la pantalla LCD
lcd_orden(0x01);
__delay_ms(2);
}
void lcd_acasa(void){ //Función par enviar el cursor al inicio de la pantalla
lcd_orden(0x02);
__delay_ms(2);
}
void lcd_ubicate(unsigned char linea,unsigned char columna){ //Función para ubicar el cursor
lcd_acasa(); //en cualquier ubicación del LCD
if (linea==1){
for(unsigned char i=1; i<columna; i++){
lcd_orden(0x14);
}
}
if(linea==2){
for (unsigned char i=1;i<(columna+40);i++){
lcd_orden(0x14);
}
}
}
Una vez pegado el código en la parte indicada, estará listo para utilizarse, en la siguiente imagen se muestra parte de como se verá.
PANTALLA LCD PIC EJEMPLO DE USO 1
El código está preparado para utilizarse con el puerto D, pero puede cambiarse al B por ejemplo con solo cambiar en la línea que se indica la D por B, el microcontrolador PIC a utilizar será el PIC16F877A, en la siguiente imagen se indica como tendrán que ser las conexiones:
Las funciones existentes para el manejo de la pantalla lcd son:
void lcd_inicia(); //se usará siempre par inicializar el LCD
void lcd_pulso();//se usa internamente en el código
void lcd_orden(unsigned char);//se usa internamente en el código
void lcd_caracter(unsigned char);//para enviar caracteres a la pantalla LCD
void lcd_mensaje(const char*);//para enviar texto a la pantalla LCD
void lcd_limpiar();//para limpiar la pantalla
void lcd_acasa();//Función par enviar el cursor al inicio de la pantalla
void lcd_ubicate(unsigned char_t,unsigned char);//para ubicar el cursor fila, columna
La función lcd_inicia() siempre será necesaria para poder utilizar la pantalla LCD PIC, de las demás se usará la función lcd_ubicate(fila,columna), donde fila solo puede tomar valores de 1 o 2 ya que solo se tendrán 2 filas, mientras columna puede tomar valores de 1 a 40, normalmente se usara de 1 a 16.
La otra función a utilizar normalmente será lcd_caracter(caracter) para enviar caracteres individuales a pantalla, la función mas utilizada será lcd_mensaje(texto), esta permitirá enviar cadena de texto a la pantalla LCD PIC.
En el ejemplo se enviará por pantalla en la primera fila el texto "MrElberni PIC", y en la segunda fila "Suscríbete".
El código realizado en el MPLABX con el XC8, donde se incluye el archivo de cabecera lcd.h es el siguiente
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#define _XTAL_FREQ 20000000 //frecuencia del cristal utilizado
#include <xc.h>
#include "lcd.h" //archivo de cabecera creado necesario
void main(void) {
TRISB&=~(1<<2);//pin RB2 como salida digital
PORTB|=(1<<2);//pin RB2 inicia led encendido
lcd_inicia();//se inicializa la pantalla lcd PIC
while (1) {//ciclo principal del programa
lcd_ubicate(1,1);//ubica el cursor en la fila 1 columna 1
lcd_mensaje("MrElberni PIC");//mensaje primera fila
lcd_ubicate(2,1);//ubica el curso en la fila 2 columna 1
lcd_mensaje("Suscribete");//mensaje primera fila
PORTB^=(1<<2);//pin RB2 cambia de estado
__delay_ms(200);//para ver el parpadeo de los leds
}
return;
}
La siguiente es la imagen del resultado obtenido con el PIC16F877A utilizando una pantalla LCD PIC
PANTALLA LCD PIC EJEMPLO DE USO 2
Se seguirá utilizando el mismo circuito utilizado para el ejemplo1, es decir el LCD PIC conectado al puerto D del PIC16F88, en este caso se quieren ver datos numéricos en el LCD, pero resulta que a la pantalla LCD PIC solo se le pueden enviar caracteres y no valores numéricos, por lo tanto se tiene que convertir el valor numérico que se desea visualizar en el LCD PIC en una cadena de caracteres, para esto será necesario incluir el archivo de cabecera:
#include <stdio.h>
Esta librería contiene una función llamada sprintf cuya sintaxis es la siguiente:
sprintf(arreglo,”cadena a almacenar en arreglo %(especificador)”,dato);
Donde arreglo es un array de tipo char de una longitud adecuada, donde se guardará todo lo que aparece entre comillas en forma de cadena de caracteres, especificador es para indicar de que tipo es dato, %d para tipo entero, %f para tipo real, %s para tipo cadena, %c para tipo carácter, hay mas pero para el uso del LCD PIC son suficientes.
Por ejemplo si se tiene un numero real con un valor de 1.01 y se quiere visualizar en el LCD PIC, utilizando la función sprintf para ver en la pantalla LCD PIC el mensaje “Num real = 1.01”, entonces se crea un arreglo de una longitud de 16, será suficiente para almacenar la cantidad de caracteres del mensaje, y como el número es real entonces el especificador tiene que ser %f, luego
char cadena[16];//arreglo para almacenar el mensaje
sprintf(cadena,”Num real = %f”,1.01);//se almacena en el arreglo cadena el mensaje
lcd_mensaje(cadena);//para ver en la pantalla LCD PIC lo guardado en cadena
El siguiente es un código preparado en el XC8 para la visualización de un número entero de 8 bits en la segunda fila de la pantalla LCD PIC, este número irá cambiando su valor en cada ciclo de programa:
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#define _XTAL_FREQ 20000000 //frecuencia del cristal utilizado
#include <xc.h>
#include <stdio.h> //para poder convertir numero a cadenas
#include "lcd.h" //archivo de cabecera creado necesario
char numcad[5]; //arreglo donde se guarda el numero entero convertido a cadena
unsigned char numero=0; //numero de 8 bits a ser visto en el LCD inicia a 0
void main(void) {
TRISB&=~(1<<2);//pin RB2 como salida digital
PORTB|=(1<<2);//pin RB2 inicia led encendido
lcd_inicia();//se inicializa la pantalla lcd PIC
while (1) {//ciclo principal del programa
lcd_ubicate(1,1);//ubica el cursor en la fila 1 columna 1
lcd_mensaje("MrElberni PIC");//mensaje primera fila
sprintf(numcad,"numero = %d",numero); //guarda numero en numcad
lcd_ubicate(2,1);//ubica el curso en la fila 2 columna 1
lcd_mensaje(numcad);//mesaje segunda fila
lcd_mensaje(" ");//para borrar caracteres finales innecesarios
PORTB^=(1<<2);//pin PB2 cambia de estado
numero++;//número aumenta en una unidad cada 200ms
if(numero>255){//al llegar numero a 255
numero=0; //se reinicia a 0
}
__delay_ms(200);//para ver el parpadeo de los led y
//el cambio de numero
}
return;
}
La siguiente es la imagen del resultado obtenido con el PIC16F877A utilizando una pantalla LCD PIC para ver datos numéricos.
Esperamos de todo corazón ser de vuestra ayuda, no olviden suscribirse al canal de mrelberni, darle me gusta a los vídeos, compartirlos, que de esa manera nos ayudan a continuar, desde ya muchas gracias.
Publicar un comentario