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.
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=='#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); } } }') //si no se oprime ninguna tecla sigue llamando al teclado. { k=kbd_getc(); } IF( (k!='#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); } } }')) { 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.
Mi nombre es Sergio Andres Castaño Giraldo, y en este sitio web voy a compartir una de las cosas que mas me gusta en la vida y es sobre la Ingeniería de Control y Automatización. El sitio web estará en constante crecimiento, voy a ir publicando material sobre el asunto desde temas básicos hasta temas un poco más complejos. Suscríbete al sitio web, dale me gusta a la página en Facebook y únete al canal de youtube. Espero de corazón que la información que comparto en este sitio, te pueda ser de utilidad. Y nuevamente te doy las gracias y la bienvenida a control automático educación.