Saltar al contenido
Control Automático Educación

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

Manejo del 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:

Conexión LCD con PIC

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.

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=='
#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++;
}
}
}
}
')) //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.

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Comentarios (23)

saludos. amigo, quiero montar algunas cosas pon pic, arduino y lcd, solo para entrenarme en este mundo. Dispongo de un Pic16f88 un arduino nano y un LCD que no se como identificar las patas para conectarlo, me puedes alludar a identificarl las patas de este LCD??? en la parte de atras dice:
GDM16032D, nos se si entre el 16 y el 32 hay una letra O, o un numero cero.

Gracias

Responder

Lo mejor es buscar los datasheets o hojas de datos de cada componente que tienes, de esa forma podrás identificar los pines de cada dispositivo de una forma más directa.

Responder

Interesante video. hay que realizar la practica.

Responder

Hola Sergio yo de nuevo jajaj, disculpa, los códigos me funcionan bien y al compilar no me marcan ningún error, solamente que al hacer la simulación en el proteus, me aparecen errores y no me aparece ningún mensaje, creo que las conexiones las tengo mal, ya que estoy usando un pic 18f2550 y no he encontrado como conectarlo al ldc 16*2, tú no sabrás como? Saludos

Responder

Intentaste usar la definición del cristal como:
#USE DELAY(CLOCK=4000000,CRYSTAL)
En esa familia del 18F he notado que toca especificar el cristal externo.

Responder

Sii sí utilicé esa función, y también coloqué el cristal con los capacitores en los pins de osciladores, pero me sigue marcando error, y hasta en unos pins del lcd, el cuadro aparece amarillo

Responder

Pero usar ese PIC no tiene misterio, se conecta exactamente igual que mostrado en el post, solo que en el puerto B. Incluso puedes descargar los archivos del proteus, y solo basta con sustituir el pic16f887 por el pic 18f2550. Recuerda colocar el pin 1 a positivo.

Responder

Que tal Sergio! Muy buena explicación y muy buenos ejemplos, tan solo que tengo un problema, y es mío, propio de mi compilador y no sé que hacer, ya que al añadir la librería lcd.d, al compilar el programa que he hecho me marca error en la librería, que no identifica ningún “delay”, y no sé que hacer ni porqué será, espero sepas qué sucede, saludos!

Responder

Ya solucioné el problema por si a alguien más le ocurre! Lo único que tuve que hacer fue colocar el #include al final del encabezado y con eso ya funcionó correctamente jajaja

Responder

Profesor Sergio, una pregunta lo intento simular con el pic 16f628a y tengo un problema, el cual cociste en que el pic no logra activar las resistencias en pull-ups al momento de simularlo en proteus, lo intente con otros pics y tampoco funciona, noce que registro tenga que linea de código deba aumentar.

Responder

Puedes probar poner:

port_b_pullups(0xFF);  
delay_us(10);

O quizas también sirva:

port_b_pullups(TRUE);
delay_us(10);
Responder

Es posible conectar el teclado4x4 y LCD solo en el puerto en el puerto D?

Responder

Si es posible, pero debes colocar las resistencias Pull-Up fisicamente en el puerto D, ya que internamente en el PIC estas resistencias solo estan en el puerto B.

Responder

Sergio, ante todo un saludo..
Quisiera pedirte ayuda porque me esta ocurriendo un problema que me tiene loco.
Hasta el momento no he tenido problemas al realizar los programas, pero el ejercicio 3 no encuentro manera de que funcione… Descargue tu contenido para utilizar tu código del ejercicio 3 y tu plantilla de proteus y funcionan PERO, si abro tu código en ccs y lo compilo (sin modificare nada a tu código) la simulación simplemente no funciona, no hace nada… Pareciera que el archivo .HEX generado desde mi programa no funciona para este ejercicio, pero si utilizo el .HEX que descargue de esta pagina si, no entiendo que esta pasando. Podrias ayudarme por favor?

Responder

Hola Pedro, no se a que pueda deberse ese problema. Los otros ejemplos de funcionan bien? Quizas sea la version del compilador

Responder

Saludos antes que nada Sergio, me ha servido mucho tu curso pero tengo el mismo problema que Pedro no me funciona de ninguna manera, podría saber ¿que versión del compilador estás ocupando?

Responder

Hola Dulce, he modificado el código del Ejemplo 3 y ahora se encuentra actualizado y funcional. Realmente lo compilé de nuevo y parecia que en las versiones actuales del compilador no rodaba, reestructuré la programación y ahora funciona bien. Descargalo de nuevo. Saludos!!

Responder

Saludos Sergio, tengo unas duda con el ejercicio 3.
-La primera: Porque en el encabezado del código configuramos el puerto C si luego no lo usamos o conectamos en la simulación?
-La segunda: Porque cuando introduzco un valor por el teclado telefónico, este se muestra en la LCD uno al lado del otro en vez de sobrescribirse. Lo pregunto porque en ningún momento veo que se este cambiando la coordenada. Eso acaso lo hace de forma automática? no se si me doy a explicar

Responder

Hola Pedro.
1. Puedes borrar las lineas de la configuración del Puerto C, eso no se esta usando. Seguramente ese programa lo hice sobre un programa antiguo que tenia.
2. Al usar las instrucciones del LCD automaticamente se desplaza hacia la otra linea. Eso lo hace la libreria por defecto.

Responder

Sergio C mencionarme el deposito de 2 dólares para contribuir a la causa de la educación, en que banco en Lima – Perú
Saludos cordiales

Responder

Hola Alipio gracias por tu interés en ayudar en este programa de educación. El único medio de pago para la doncación es através de PayPal, que recibe en la mayoria de paises porque yo no tengo banco en Lima. Saludos y muchos éxitos.

Responder

sALUDOS amigo
que curioso en el ejemplo 1 configuras el puerto como salida.
en el dos no configuras el puerto como nada.
y en el ejercicio 3 se debe poner el puerto como salida.

ahora una pregunta ¿por que en el ejemplo 3 se debe configurar el puerto como salida?

si tiene la lcd y el teclado conectado al mismo puerto
sera por cuestion de la libreria amigo sergio???

Responder

No es necesario configurar los puertos, yo lo hago por costumbre pero ya la propia librería configura los puertos para usar el periférico, si lo deseas puedes borrar esas lineas de código. Saludos!!

Responder