Hola controleros y controleras, en esta entrada vamos a aprender a utilizar un LCD con PIC de forma fácil usando el PIC C Compiler. Aquí trataremos los LCD más comunes como el LCD 16×2 o el LCD 20×4, sin embargo esto puede ser extendido a cualquier LCD que tengas.
Antes que nada te hago la invitación de que veas
👉👉👉 CURSO GRATIS DE MICROCONTROLADORES PIC
👉👉👉 TODOS LOS VIDEOS EN YOUTUBE
LCD con PIC
Existe en el compilador un driver para manejar un display de cristal líquido (LCD) de 2 líneas por 16 caracteres cada una.
El procedimiento para trabajar con el LCD 16×2 con PIC es parecido al procedimiento del teclado telefónico.
La conexión entre el LCD y el microcontrolador es la siguiente:
Los pasos que se deben seguir para manejar el LCD son:
1. Incluir en el encabezado del programa el driver para manejar el teclado.
#INCLUDE<LCD.C>
2. Por defecto el LCD se conecta al puerto D, si se desea conectar el LCD en el puerto B se incluye esta línea en el encabezado:
#DEFINE USE_PORTB_LCD TRUE
3. En el programa principal se inicializa el driver
LCD_INIT();
4. Se usan las funciones del LCD que tiene implementadas el driver:
LCD_PUTC(c);// Muestra el caracter “C” en la próxima posición del LCD.
LCD_PUTC("/f”);//Borra todo lo que haya en el display.
LCD_PUTC(“/n”);// Va al inicio de la segunda línea.
LCD_PUTC(“/b”); //Se mueve una posición hacia atrás.
LCD_GOTOXY(x,y); //Ubica el cursor en la posición indicada por “X” y ”Y”.
//La posición de la esquina superior izquierda es (1,1).
LCD_GETC(x,y); //Retorna el carácter ubicado en la posición X,Y del LCD.
Un LCD 16×2 PIC (Mostrado en la figura al inicio) esta conformado por 16 columnas y 2 filas
Sin embargo también existen en el mercado otros tipos de LCDs como por ejemplo el LCD 20×4 PIC que tiene 20 columnas y 4 filas.
Quizas te pueda interesar ver como configurar una Pantalla LCD con Arduino.
Balanza Digital con PIC – HX711
Memoria EEPROM del PIC
Adquisición de Datos e Identificación de un Horno con PIC
LCD PIC – EJEMPLOS
A continuación se encuentran los 4 Ejemplos del video, donde podrás ver y descargar el código en lenguaje C y también los archivos de simulación del Proteus, para que puedas reproducirlos por ti mismo y practiques con el uso del LCD. Para tener acceso a todos estos códigos, debes compartir el contenido de este blog con cualquiera de los siguientes 3 botones, asi ayudas a que la pagina sea más conocida y contribuyes a que siga aportando mucho más contenido de interes,
Códigos
A continuación están disponibles los códigos de ejemplos vistos en los videos para descarga y reproducción de los mismos.
[sociallocker id=948]
>> DESCARGAR CÓDIGOS Y ESQUEMA EN PROTEUS <<
Ejemplo 1 – Mensaje en el LCD
#INCLUDE <16F887.H>
#USE DELAY(CLOCK=4000000)
#INCLUDE <LCD.C>
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
void MAIN()
{
LCD_INIT(); //Inicializa el LCD
LCD_PUTC("\f"); //Borrar el contenido del LCD
WHILE(TRUE)
{
LCD_GOTOXY(5,1); //Se ubica En la columna 5 fila 1
LCD_PUTC("Control"); //Muestre el mensaje “Control”
LCD_GOTOXY(3,2); //Ubicarse en la columna 3 fila 2
LCD_PUTC("Automatico"); // Sacar el mensaje “Automatico”
} //Cierra while true
}
Ejemplo 2 – Animación de Desplazamiento en LCD
#INCLUDE <16F887.H>
#fuses XT, NOPROTECT, NOWRT, NOPUT, NOWDT, NOLVP, NOCPD //Órdenes para el programador
#use delay (clock=4000000)
#include <lcd.c> // Librería para el manejo del lcd
const char mensaje[]= {"Control Automatico Educacion"};
///PROGRAMA
void main(void)
{
char y=1; //índice fíla
signed char x=16; //índice columnas (posiciones)
lcd_init(); //inicializa lcd
while(TRUE){ //bucle...
lcd_gotoxy(x,y) ; //ubica cursor para escribir mensaje
lcd_putc(mensaje ) ; //muestra por pantalla el mensaje
delay_ms(100);
x--; //incremento indice de columnas
if(x<-28)
{
//¿se ha mostrado mensaje entero en la primera fila?
x=16; //SI, índice columna x=-16, para que inicie el último caracter en la primera posición
y++; //incremento índice fila (mostrar texto en segunda columna)
if(y>2) //¿se ha mostrado mensaje por segunda fila?
y=1; //SI, restaurar índice de fila
}
lcd_putc("\f" ) ; //borra pantalla
} //...infinito
}
Ejemplo 3 – LCD y Teclado en el mismo Puerto B
#INCLUDE <16F887.H>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
//Definiciones para colocar el LCD y el teclado en el puerto B
#DEFINE USE_PORTB_LCD TRUE
#DEFINE USE_PORTB_KBD TRUE
//Librerías del LCD y Teclado
#INCLUDE <LCD.C>
#INCLUDE <KBD.C>
// Variables Globales
CHAR K;
INT DIR;
//Programa Principal
VOID MAIN()
{
lcd_init(); //Inicializa el LCD
kbd_init(); //Inicializa el Teclado
//Configura las Resistencias PULL-UP del Puerto B
port_b_pullups(0xFF); //PIC16F887
//port_b_pullups(TRUE); //PIC16F877A
LCD_PUTC("\f"); //Limpia el LCD
//Ciclo infinito
WHILE(1)
{
DIR=0;
LCD_PUTC("\f");
while (DIR<17)
{
k=kbd_getc(); //Llamar la función del teclado y almacenar el
//valor digitado en una variable tipo carácter. Si
//no se oprime ninguna tecla el teclado
//retornara el carácter nulo.*/
WHILE( (k=='\0')) //si no se oprime ninguna tecla sigue llamando al teclado.
{
k=kbd_getc();
}
if( (k!='*')&&(k!='#'))
{
lcd_putc(k);
DIR++;
}
}
}
}
Ejemplo 4 – LCD con Teclado para Contraseña
#INCLUDE <16F887.H>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
//Usadas para conectar el LCD y Teclado en el Puerto B
#DEFINE USE_PORTB_LCD TRUE
#DEFINE USE_PORTB_KBD TRUE
//Librerías del LCD y Teclado
#INCLUDE<KBD.C>
#INCLUDE<LCD.C>
#BYTE PORTC=7
#DEFINE LED1 PORTC,7
#DEFINE LED2 PORTC,4
//Variables Globales
CHAR K;
INT MIL,CEN,DEC,UNI,VAL;
//Función Teclado
VOID TECLADO()
{
k=kbd_getc(); //Llamar la función del teclado y almacenar
//el valor digitado en una variable tipo
//carácter. Si no se oprime ninguna tecla el
//teclado retornara el carácter nulo.*/
WHILE(k=='\0') //si no se oprime ninguna tecla sigue llamando al teclado.
{
k=kbd_getc();
}
IF( (k!='\0'))
{
IF(K=='0')//Si K es igual a cero
VAL=0;//Val es igual a cero
IF(K=='1')
VAL=1;
IF(K=='2')
VAL=2;
IF(K=='3')
VAL=3;
IF(K=='4')
VAL=4;
IF(K=='5')
VAL=5;
IF(K=='6')
VAL=6;
IF(K=='7')
VAL=7;
IF(K=='8')
VAL=8;
IF(K=='9')
VAL=9;
}
}
VOID MAIN()
{
LCD_INIT(); //Inicializa el LCD
KBD_INIT(); //Inicializa el Teclado
//Configura las Resistencias PULL-UP del Puerto B
PORT_B_PULLUPS(0xFF); //PIC16F887
//port_b_pullups(TRUE); //PIC16F877A
//Configura el puerto C como Salida
SET_TRIS_C(0);
//Programa Principal
WHILE(TRUE)
{
LCD_GOTOXY(1,1);
LCD_PUTC(" BIENVENIDOS ");
LCD_GOTOXY(1,2);
LCD_PUTC(" DIGITE CLAVE ");
DELAY_MS(1000);
TECLADO();
LCD_PUTC("\f");
LCD_GOTOXY(1,1);
IF((k!='#')&&(k!='*'))
{
lcd_putc('*');
UNI=VAL;
}
TECLADO();
IF((k!='#')&&(k!='*'))
{
lcd_putc('*');
DEC=VAL;
}
TECLADO();
IF((k!='#')&&(k!='*'))
{
lcd_putc('*');
CEN=VAL;
}
TECLADO();
IF((k!='#')&&(k!='*'))
{
lcd_putc('*');
MIL=VAL;
}
TECLADO();
WHILE((k!='#'))
{
TECLADO();
}
IF((UNI==1)&&(DEC==2)&&(CEN==3)&&(MIL==4)) //Aquí se compara si
//los números digitados
//están correctos.*/
{
LCD_PUTC("\f"); //Se borra LCD
LCD_GOTOXY(1,1);//Se ubica en la posición 1,1
LCD_PUTC(" CLAVE CORRECTA ");
BIT_SET(LED1);
DELAY_MS(2000);
BIT_CLEAR(LED1);
}
ELSE
{
LCD_PUTC("\f");
LCD_GOTOXY(1,2);
LCD_PUTC(" CLAVE INVALIDA ");
BIT_SET(LED2);
DELAY_MS(4000);
BIT_CLEAR(LED2);
}
}
}
[/sociallocker]
Eso es todo por la entrada del dia de hoy, espero les haya gustado y hayan aprendido algo nuevo. Si te ha servido el contenido de esta entrada, de los videos y los códigos de implementación y deseas apoyar mi trabajo invitandome a un café super barato, puedes hacerlo en el siguiente link:
👉 Invitar a Sergio a un Café ☕️
Que esten muy bien, nos vemos en la siguiente entrada.
Citar este Artículo
¡Hola! Soy Sergio Andrés Castaño Giraldo. Bienvenidos a Control Automático Educación, un espacio dedicado a una de mis grandes pasiones: la Ingeniería de Control y la Automatización.
Mi objetivo aquí es tender un puente entre la teoría académica y la práctica profesional. Como profesor e investigador, he tenido la oportunidad de trabajar en proyectos complejos —desde sistemas de compresión en plataformas offshore hasta modelos de control avanzado— y todo ese aprendizaje lo vuelco en este sitio.
Aquí encontrarás material que crece constantemente: desde fundamentos de instrumentación hasta estrategias de control avanzado y programación profesional. Mi meta es que la información que comparto te sea de utilidad real en tu carrera o formación.
Te invito a que te suscribas, te unas a nuestro canal de YouTube y formemos una comunidad de aprendizaje continuo. ¡Gracias por estar aquí!
