Programando PIC con CCS ejercicio 3 (LCD) 馃摕
La pantalla LCD es otro dispositivo muy vers谩til y viene en una gran cantidad de modelos y configuraciones. Sirven como ventana a los datos, configuraciones o despliegue de informaci贸n donde un LED no es suficiente.
Lo primero que debemos saber, es la conexi贸n de la pantalla LCD seg煤n el tipo que vamos a usar y para esto consultaremos los siguiente datashet (Hoja informaci贸n) de una pantalla LCD gen茅rica 16X2 es decir 2 filas de 16 caracteres cada una.
"Despu茅s se puede profundizar con el siguiente libro"
En el libro “Compilador C CCS Y Simulador Proteus Para Microcontroladores PIC” est谩 todas la informaci贸n de lo que aqu铆 vamos explicar de una forma m谩s resumida, en la secci贸n 3.3 entradas y salida 3.3.1 LCD.
Si no entendiste no importa (>*.*)> voy a explicarlo aqu铆 otras vez.
Las pantallas LCD son dispositivos que se puede da帽ar muy f谩cilmente =S varios de mis amigos en la facultad, por malas conexiones, malos tratos o un simple descuido se las cargaron x_X pero no hay que asustarse ^_^ lo hay que hacer es consultar la hojas de los fabricantes y se vera que es un standar en los pines (PIN) yo he usado varios modelos, 1X30, 4X16, 2X16 y de led, en vez de cristal liquido y todas trabaja de forma similar.
Al dorso de la pantalla veremos que los pines est谩n numerados.
En este modelo en particular de pantalla LCD, solo se marca el PIN 1 y el 14.
Las pantallas LCD son dispositivos que se puede da帽ar muy f谩cilmente =S varios de mis amigos en la facultad, por malas conexiones, malos tratos o un simple descuido se las cargaron x_X pero no hay que asustarse ^_^ lo hay que hacer es consultar la hojas de los fabricantes y se vera que es un standar en los pines (PIN) yo he usado varios modelos, 1X30, 4X16, 2X16 y de led, en vez de cristal liquido y todas trabaja de forma similar.
Conexi贸n de pines Fig-02 |
Al dorso de la pantalla veremos que los pines est谩n numerados.
Dorso Pantalla LCD Fig-03 |
En este modelo en particular de pantalla LCD, solo se marca el PIN 1 y el 14.
Numeraci贸n pines Fig-04 |
Y para identificar cual es el A y K en este modelo se chekea desde el frente (figura-05) y se aprecia A y K, que est谩n conectado a los dos pines anteriores al PIN se帽alado como 1, esto se comprueba con un multimetro, usando la funci贸n continuidad.
Vista de frente Fig-05 |
Como se aprecia en la figura-02 K y A se debe respetar una polaridad, identificar los pines no es gran problema, ahora debemos saber como conectarlos, para eso vamos a ver el siguiente diagrama.
Diagrama de la pantalla LCD Fig-06 |
Podemos dividir el diagrama en dos partes como se ve en la figura-07, la parte de "control y despliegue" (izquierda) y la parte de "alimentaci贸n y ajuste" (derecha).
El LED BKL (LED BACKLIGHT) lo podemos tomar como un circuito independiente, su funci贸n es de retroiluminar la pantalla, en cristiano moderno, es para poder ver los d铆gitos en la oscuridad, la A y K no es casualidad se comporta en cierto modo como un led normal, pero este tiene mayor consumo, se alimenta directamente a +4.5V o a +5V mediante una resistencia de 22 ohm.
No es obligatorio conectar el (LED BACKLIGHT) para que funciones la LCD, como comentamos antes es un circuito independiente, lo interesante es que podemos usar un interruptor normal o uno mediante un circuito de conmutaci贸n (transistores o MOSFEST) controlado por el mismo PIC que solo cuando halla actividad (por ejemplo) este encendido ya que este tiene un consumo considerable.
Para los dem谩s pines voy a colocar la descripci贸n que me da la hoja del fabricante.
MANOSSSSSSSS a la obra!!!!!!!!!!!!
En PIC-C CCS creamos un proyecto (ejemplo) con las siguientes caracter铆sticas:
*Micro-controlador PIC 16F877A.
*Frecuencia de reloj 500.000 Hz (recuerda es una simulaci贸n simple).
*Seleccionamos un cristal de <= 4 MHz (tipo de oscilador).
*Todas la dem谩s opciones dejarla tal como est谩n.
Si no recuerda como hacerlo repacen aqu铆 y aqu铆. <-------------------- repaso.
Recuerde que esto es un ejemplo para simularlo y si para un proyecto real se debe tomar otra configuraciones, ejemplo un oscilador o un Cristal de mayor velocidad.
Diagramas LCD Fig-07 |
El diagrama Power Supply (alimentaci贸n y ajuste) VSS seria el neutro (0V / GND) y VDD de +3.3V a +5V (seg煤n el modelo de la LCD), entre ellos una resistencia ajustable (reostato) o potenci贸metro a V0 que nos servir谩 para ajustar el contraste de la pantalla.
El reostato o resistencia variable puede ser de 5K ohm o 10K ohm o si prefiere m谩ximo contraste directo a VDD.
El reostato o resistencia variable puede ser de 5K ohm o 10K ohm o si prefiere m谩ximo contraste directo a VDD.
El LED BKL (LED BACKLIGHT) lo podemos tomar como un circuito independiente, su funci贸n es de retroiluminar la pantalla, en cristiano moderno, es para poder ver los d铆gitos en la oscuridad, la A y K no es casualidad se comporta en cierto modo como un led normal, pero este tiene mayor consumo, se alimenta directamente a +4.5V o a +5V mediante una resistencia de 22 ohm.
Diodo LED Fig-08 |
No es obligatorio conectar el (LED BACKLIGHT) para que funciones la LCD, como comentamos antes es un circuito independiente, lo interesante es que podemos usar un interruptor normal o uno mediante un circuito de conmutaci贸n (transistores o MOSFEST) controlado por el mismo PIC que solo cuando halla actividad (por ejemplo) este encendido ya que este tiene un consumo considerable.
Para los dem谩s pines voy a colocar la descripci贸n que me da la hoja del fabricante.
Descripci贸n de los pines y su funci贸n Fig-09 |
MANOSSSSSSSS a la obra!!!!!!!!!!!!
En PIC-C CCS creamos un proyecto (ejemplo) con las siguientes caracter铆sticas:
*Micro-controlador PIC 16F877A.
*Frecuencia de reloj 500.000 Hz (recuerda es una simulaci贸n simple).
*Seleccionamos un cristal de <= 4 MHz (tipo de oscilador).
*Todas la dem谩s opciones dejarla tal como est谩n.
Si no recuerda como hacerlo repacen aqu铆 y aqu铆. <-------------------- repaso.
Recuerde que esto es un ejemplo para simularlo y si para un proyecto real se debe tomar otra configuraciones, ejemplo un oscilador o un Cristal de mayor velocidad.
Configuraci贸n B谩sica Fig-10 |
Agregamos la librer铆a #include < lcd.c > que hace una funci贸n similar como un drivers en una PC, pero esta vez entre el PIC y la LCD, por eso no hice 茅nfasis en la descripci贸n de los pines de la figura-09 y su funciones ya que todo lo vamos a manejar mediante esta librer铆a.
Agregar librer铆a LCD Fig-11 |
Compilamos (F9) y luego en proyecto (project) abrimos todos los archivos (OPEN ALL Filles) y no ubicamos en la ventana LCD.C
Librer铆a LCD Fig-12 |
Aqu铆 nos indica como debemos usarla, lo primero que dice es que debemos colocar lcd_init(); (linea 7 figura-14) luego del void main {} (linea 5 figura-14)
M谩s abajo encontramos (Figura-13) la informaci贸n para conectar el PIC con la pantalla LCD la cual usaremos para armar nuestro circuito en ISIS Proteus, como se puede apreciar la librer铆a indica la forma de usarla y la conexi贸n.
PIC-C tiene una variedad de librer铆as para los dispositivos LCD ya que como sabemos hay muchos tipos de LCD y configuraciones (Librer铆as), por ejemplo la Pantalla LCD mediante I2C.
Librer铆a LCD conexi贸n Fig-13 |
Continuando con el ejemplo vamos a la pesta帽a lcd.c
Para evitar inconveniente borramos la pantalla (como una pizarra borramos todo lo anterior en vez de escribir encima) con el comando printf(LCD_PUTC, "\f"); (linea 18 figura-14) se puede usar cuanta veces se requiera en nuestro programa, luego dentro de un bucle infinito (linea 20 al 26 figura-14) colocamos nuestro primer ejemplo.
Ejemplo LCD Fig-14 |
En el circuito seleccionamos un PIC18F877A y un LM016L una pantalla LCD 16X2 gen茅rica, como en ejercicios anteriores algunas conexiones no se hacen por simplificar, pero eso no indica que, cuando vamos hacerlo en un Proto-Board no debamos hacerlas.
Hay que recordar de configurar el reloj 500kHz (en la simulaci贸n), tambi茅n colocar en alto el pin 1 del PIC (el 18F877A lo requiere) si usamos un bot贸n y colocamos el pin 1 en bajo se reseteara el PIC.
Diagrama del circuito Fig-15 |
El ejemplo es muy simple para comenzar, as铆 que explicare lo necesario para que funcione, basado en la figura-14
En la linea 2 declare la librer铆a -----------> #include < lcd.c >
En la linea 7 por petici贸n de la librer铆a coloque ----------> lcd_init();
En la linea 18 borre la LCD antes de escribir -------------> printf(LCD_PUTC, "\f");
Luego uso dentro del bucle infinito, el siguiente ejercicio.
1) La primera linea es un simple comentario, en C todo lo que esta luego de // en una linea de programaci贸n se toma como un comentario, en este caso una descripci贸n.
2) lcd_gotoxy(1,1); nos indica que se ubicara en la fila 1 columna 1.
3) printf(LCD_PUTC, " escribir aqui "); Este comando es para escribir en la pantalla LCD y escribe lo que esta dentro de la comillas.
Comentamos todo el ejemplo 1 y pegamos el siguiente ejercicio.
2) lcd_gotoxy(1,1); nos indica que se ubicara en la fila 1 columna 1.
3) printf(LCD_PUTC, " escribir aqui "); Este comando es para escribir en la pantalla LCD y escribe lo que esta dentro de la comillas.
Comentamos todo el ejemplo 1 y pegamos el siguiente ejercicio.
Aqu铆 usamos la fila una y dos.
Descripci贸n:
1) Lo nuevo aqu铆 es que escribimos en la segunda columna y primera linea lcd_gotoxy(1,2);
Antes debemos declarar -------------> int i;
Usando la figura -14 la podemos ubicar en la linea16.
Hacemos un efecto de carga, tambi茅n lo podemos hacer con un texto.
Ejemplo 3 Fig-18 |
Descripci贸n:
1) Usamos la funci贸n FOR y la variable "i" en una estructura de repetici贸n, cada vez que se ejecuta la funci贸n de repetici贸n se incrementa la variable "i" .
2) La variable "i" la usamos en la funci贸n lcd_gotoxy(i,2); as铆 desplazamos lo que escribimos en la funci贸n printf(LCD_PUTC, "*");
3) Usamos un retardo dentro de la estructura FOR usando comando delay_ms( 500 ); as铆 controlamos la velocidad de la barra de carga.
4) La estructura FOR se repetir谩 hasta que "i" se incremente hasta 16, que coincide con los 16 filas de la columna.
5) Luego de escribir Loading y llenar la Columna 2 de * borramos la pantalla con printf(LCD_PUTC, "\f"); hay que recordar que estamos dentro de un bucle infinito figura 14 linea 20.
Comentamos todos los ejemplos anteriores y pegamos el ultimo ejemplo el 4, recuerde que debemos tener declarada "i"como entero.
Podemos usar un texto en movimiento y dentro de este una variable, por ejemplo un aviso que se帽ale un temperatura.
Descripci贸n:
1) Usamos la funci贸n FOR y la variable "i" en una estructura de repetici贸n, cada vez que se ejecuta la funci贸n de repetici贸n se incrementa la variable "i" .hasta que llegue el valor de 16 la cual usamos para desplazar "*".
2) Aqu铆 usamos variable "i" no solo para controlar el FOR y desplazar *, si no tambi茅n mostramos este valor en la columna 1 mediante el comando printf(LCD_PUTC, "Loading (%2i)",i);
Digamos que tenemos una pantalla LCD de una sola Columna y de 40 filas por poner un ejemplos, la usamos como una marquesina donde desplazamos temperaturas en tiempo real, as铆 podemos aprecia que no solo podemos escribir palabras, si no variables que est谩n cambiando.
Otro ejemplo es censando una velocidad o temperatura, pero aqu铆 todav铆a no hemos tocado ese tema de censar variables, por eso usamos el valor de "i" para mostrar un valor cambiante.
Para comentar todo un ejemplo o un segmento de c贸digo usamos al comienzo */ y al final /*
2) Aqu铆 usamos variable "i" no solo para controlar el FOR y desplazar *, si no tambi茅n mostramos este valor en la columna 1 mediante el comando printf(LCD_PUTC, "Loading (%2i)",i);
Digamos que tenemos una pantalla LCD de una sola Columna y de 40 filas por poner un ejemplos, la usamos como una marquesina donde desplazamos temperaturas en tiempo real, as铆 podemos aprecia que no solo podemos escribir palabras, si no variables que est谩n cambiando.
Otro ejemplo es censando una velocidad o temperatura, pero aqu铆 todav铆a no hemos tocado ese tema de censar variables, por eso usamos el valor de "i" para mostrar un valor cambiante.
Para comentar todo un ejemplo o un segmento de c贸digo usamos al comienzo */ y al final /*
Para una mejor compresi贸n un V铆deo con los cuatros ejemplos.
Recursos:
Nota:
Debo decir que no soy ning煤n experto en el tema, estoy aprendiendo y comparto lo aprendido, as铆 que cualquier recomendaci贸n o critica constructiva hacerla en los comentarios 馃槈 o los enlaces de contacto del blog.
Fuentes:
[Ultima modificaci贸n Jue 20 Feb 2014]
Es muy bueno tu Tutorial podr铆as explicar lo del texto con la variable desde ya muchas gracias.
ResponderBorrarSaludos cordiales.
Listo y tambi茅n un retoque de la redacci贸n y el formato.
ResponderBorraroye y para poner los kanjis como le puedo hacer...????
ResponderBorrarmuy bueno gracias
ResponderBorrarcomo puedo programar dos pantallas lcd a la vez pero con diferentes puertos y diferentes anuncios gracias
ResponderBorrar@luiggi zapata: la 煤nica forma que he visto lo que comentas en un mismo PIC, es usando las LCD mediante I2C.
ResponderBorrarhola esta muy bueno el tutorial y muy explicito solo que tengo una duda como puedo hacer para que el mensaje se despliegue de derecha a izquierda?
ResponderBorrarhola la verdad es que esta muy bueno el tutorial y muy sencillo... tengo una gran duda lo que pasa es que necesitamos desplegar un mensaje que diga "Universidad Tecnologica" solo que debe desplegarse de derecha a izquierda... como lo puedo hacer?
ResponderBorrarXD es similar al ejemplo 3 con el uso del "for" y "lcd_gotoxy", de todo modo d茅jame si puedo buscar un PC con windows instalar proteus y pic-c y hago una entrada.
Borrarinteresante
ResponderBorrarHOLA OLLE MUY BUENO ME PODRIAS AYUDAR A HACER ESTO MISMO PERO CON EL PIC 18F4550 Y UN LCD 4X20 X I2C
ResponderBorrarPOR FAVOR
TE DEJO MI FACEBOOK
https://www.facebook.com/xikito.tatzu
no me funciona la funcion lcd_gotoxy(8,1);
ResponderBorraragregue la libreria ldc.c pero no funciona
creo me falta el LCD.h pero no se como arreglarlo
Con el asistente, creo un proyecto llamado "ejemplo1" el creara un archivo llamado "ejemplo1.C" donde esta el c贸digo fuente y ejemplo1.h donde hay configuraciones del pic para el proyecto. En este caso llame el proyecto LCD y por lo tanto creo un archivo de configuraci贸n LCD.h. El #include < lcd.c > es la librer铆a para usar la LCD.
Borrarhola
ResponderBorrarEL ejemplo del libro no me funciona y es que no se que versi贸n es el compilador, ya he intentado todo el cambiar el puerto que dice que esta por defecto y nada y los pines de control uso RB0 a Rb2 tal como esta en el diagrama del libro que menciona al principio pero no lo puedo hacer funcionar alguien tiene el consigo correcto? o que le falta al c贸digo del libro? gracias
Baje la versi贸n 4.124, 4.130 y 1.40 y todos me dan problemas, no se si sera eso.
Borrarmuchachos, esta mas que explicito este primer ejemplo, despues vean ustedes como pueden resolver sus demas cuestiones, solo traten de pensar un poco para "aprender" y no hagan "copiar y pegar". No es que sea mala onda, si no para que les traiga sus frutos despu茅s..
ResponderBorrarMuy bueno el tutorial, muy sencillo. Un abrazo grande!
Hola, estoy aprendiendo a programar PICS y me surgi贸 un problema que no puedo solucionar y quer铆a ver si me pod铆as ayudar. Estoy automatizando una pista de scalextric usando un PIC 16F873A y utilizando un LCD16x2 (Igual al que tenes mas arriba), Modificado el fichero (LCD) para que pueda trabajar en el puerto C. Tengo el programa probado por ISIS y en Protoboard en la vida real, y me funciona perfectamente pero mi problema es que el LCD me parpadea como que si se prendiera y se apagara muy r谩pidamente. Te dejo aca la programaci贸n que hice, para ver si me podrias ayudar, desde ya, muchas gracias.
ResponderBorrar#include
#include
int8 contador=3; //cantidad vueltas
int8 rojo=0; //jug1
int8 blanco=0; //jug2
#use fast_io(A)
#use fast_io(B)
//A0 incrementa
//A1 decrementa
//A2 inicio
//a3 y a4 lectura jugadores
//B0, B1, B2 SEMAFORO y b2 habilita jugadores
//B3(JUG1) Y B4(JUG2) sensor linea
//B5(JUG1) y B(JUG2) valet parking
void main(void)
{
Output_low(pin_B0);
Output_low(pin_B1);
Output_low(pin_B2);
disable_interrupts(global);
set_tris_a(0b00011111);
set_tris_b(0b00000000);
set_tris_c(0b00000000);
do
{
lcd_init();
delay_ms(200);
Printf(LCD_PUTC,"\f CANTIDAD \n DE VUELTAS= %d", contador );
if (input(PIN_A0)==0&&contador>=3&&contador<12)
{
delay_ms(1000);
contador++;
}
if (input(PIN_A1)==0&&contador>3&&contador<=12)
{
delay_ms(1000);
contador--;
}
}
while (input(PIN_A2)==1);
do
{
delay_ms(50);
Printf(LCD_PUTC,"\f PREPARADOS");
Output_high(pin_B0);
delay_ms(2000);
Output_low(pin_B0);
Printf(LCD_PUTC,"\f LISTOS");
delay_ms(50);
Output_high(pin_B1);
delay_ms(2000);
Output_low(pin_B1);
delay_ms(50);
Printf(LCD_PUTC,"\f FUERA");
Output_high(pin_B2);
delay_ms(500);
break;
}
do
{
delay_ms(100);
Printf(LCD_PUTC,"\f JUGADOR 1= %d \n JUGADOR 2= %d", rojo, blanco);
if(input(PIN_A3)==0&&rojo<contador)
{
rojo++;
delay_ms(500);
printf(LCD_PUTC,"\f JUGADOR 1= %d \n JUGADOR 2= %d", rojo, blanco );
}
if(input(PIN_A4)==0&&blanco<contador)
{
blanco++;
delay_ms(500);
printf(LCD_PUTC,"\f JUGADOR 1= %d \n JUGADOR 2= %d" , rojo, blanco );
}
if(rojo==contador)
{
break;
}
if(blanco==contador)
{
break;
}
}
while(TRUE);
do
{
if (rojo==contador)
{
Output_LOW(pin_B2);
delay_ms(50);
Printf(LCD_PUTC,"\f GANADOR \n JUGADOR 1");
delay_ms(5000);
Output_HIGH(pin_B5);
delay_ms(2000);
Output_HIGH(pin_B6);
break;
}
if (blanco==contador)
{
Output_low(pin_B2);
delay_ms(50);
Printf(LCD_PUTC,"\f GANADOR \n JUGADOR 2");
delay_ms(5000);
Output_HIGH(pin_B6);
delay_ms(2000);
Output_HIGH(pin_B5);
break;
}
}
while(blanco==contador||rojo==contador);
do
{
if(input(PIN_B3)==0)
{
Output_LOW(pin_B5);
}
if(input(PIN_B4)==0)
{
Output_LOW(pin_B6);
}
if(input(PIN_B5)==0&&input(PIN_B6)==0)
{
break;
}
}
while(blanco==contador||rojo==contador);
}
si me podrias ayudar a parar el parpadeo te agradeceria muchas gracias
Prueba con sacar el "lcd_init();" del do-while y lo colocas de primero luego del void main(void) y no se te olvide del #include < lcd.c >
BorrarDisculpa se puede poner una imagen .gif en un lcd o algun especie de animaci贸n?, es que me dejaron de proyecto eso pero jam谩s me explicaron si se podia realizar
ResponderBorrar