Laboratorio 16: Proyecto Pastillero - Parte B

Laboratorio 06: Manejo de Pantalla LCD

CURSO DE PROGRAMACIÓN DE MICROCONTROLADORES PIC
PARTE A: Programación de Microcontroladores PIC de MICROCHIP.
MANEJO DE PANTALLA LCD
 
CAPACIDAD TERMINAL
  • Utilizar al microcontrolador en aplicaciones de control electrónico.
  • Desarrollar y ejecutar programas en un microcontrolador PIC.
  • Programar y configurar interfaces básicas del microcontrolador.
COMPETENCIA ESPECIFICA DE LA SESION
  • Conocer el Display LCD y su funcionamiento
  • Programar eficientemente el LCD
CONTENIDOS A TRATAR
  • Pantalla LCD
  • Envío de datos y variables a una pantalla LCD
RESULTADOS
  • Diseñan y optimizan sistemas y procesos para cumplir con las condiciones establecidas y gestionando adecuadamente los recursos materiales y humanos.
MATERIALES Y EQUIPO
  • CCS Compiler instalado.
  • Entrenador de PICS
  • PIC16F877A
  • Guía de Laboratorio. El trabajo se desarrolla de manera GRUPAL.
  • PC con Software de simulación.
DIAGRAMA ESQUEMÁTICO:


CÓDIGO 01 DE PROGRAMACIÓN EN PIC C COMPILER

// NOMBRE: JHOJAN ANDRES LERMA ACHOMA
#INCLUDE <16F877A.H>
#USE DELAY(CLOCK=4000000) //Cristal externo 4MHz
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#INCLUDE <lcd.c>

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
}


CÓDIGO 02 DE PROGRAMACIÓN EN PIC C COMPILER

// NOMBRE: JHOJAN ANDRES LERMA ACHOMA
#INCLUDE <16F877A.H>
#USE DELAY(CLOCK=4000000) //Cristal externo 4MHz
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#INCLUDE <lcd.c>

int16 dato=0;

void main ()
{
   lcd_init (); // Inicializamos pantalla LCD
   dato = 50; // Damos valor inicial para empezar la cuenta
   printf (lcd_putc, " CONTADOR") ; // Mandamos mensaje por única vez
   lcd_gotoxy (1, 2) ;
   printf (lcd_putc, "Valor: %4lu", dato) ;

   WHILE (true)
   {
      IF (!input (PIN_A0)) // Rutina para INCREMENTAR dato
      {
         dato++;
         lcd_gotoxy (1, 2) ;

         WHILE (!input (PIN_A0)) // Rutina ANTIRREBOTE por software
         {}
      }

      IF (!input (PIN_A1))
      {
         dato--;
         lcd_gotoxy (1, 2) ;

         WHILE (!input (PIN_A1)) // Rutina ANTIRREBOTE por software
         {}
      }

      lcd_gotoxy (1, 2) ;
      printf (lcd_putc, "Valor: %4lu", dato) ;
   }
}


VÍDEO EXPLICATIVO


IMÁGENES DE FUNCIONAMIENTO

Aplicando el Código 01
Aplicando el Código 02

RETO DE LA SEMANA

Se dispone de una pantalla LCD. Elaborar un programa que INCREMENTE un número en 150 unidades cada vez que se presione un pulsador y DECREMENTE dicho número en 25 unidades cada vez que se presione otro pulsador.
Si el valor del número supera 1000 unidades, mostrar en la pantalla LCD en la primera línea: “FULL”. Si el valor llega a ser menor o igual a 10, mostrar “VALOR MINIMO”. En ambos casos el valor del número no debe incrementarse ni decrementarse.

CÓDIGO DEL RETO

// NOMBRE: JHOJAN ANDRES LERMA ACHOMA
#INCLUDE <16F877A.H>
#USE DELAY(CLOCK=4000000) //Cristal externo 4MHz
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#INCLUDE <lcd.c>

int16 dato=0;

void main ()
{
   lcd_init (); // Inicializamos pantalla LCD
   dato = 50; // Damos valor inicial para empezar la cuenta
   printf (lcd_putc, "    CONTADOR") ; // Mandamos mensaje por única vez
   lcd_gotoxy (1, 2) ;
   printf (lcd_putc, "Valor: %4lu", dato) ;

   WHILE (true)
   {
      IF (!input (PIN_A0)) // Rutina para INCREMENTAR dato
      {
         dato = dato + 150;
         lcd_gotoxy (1, 2) ;
         printf (lcd_putc, "Valor: %4lu", dato) ;

         WHILE (!input (PIN_A0)) // Rutina ANTIRREBOTE por software
         {}
      }

      IF (!input (PIN_A1)) // Rutina para DECREMENTAR dato
      {
         dato = dato - 25;
         lcd_gotoxy (1, 2) ;
printf (lcd_putc, "Valor: %4lu", dato) ;
WHILE (!input (PIN_A0)) // Rutina ANTIRREBOTE por software {} } IF (dato > 1000) // Rutina para PARAR dato si este supera 1000 { lcd_gotoxy (1, 1) ;
printf (lcd_putc, " FULL ") ; WHILE (dato > 1000) // Rutina de BLOQUEO de pulsadores
{} } IF (dato <= 10) // Rutina para PARAR dato si este es menor o igual a 10 { lcd_gotoxy (1, 1) ;
printf (lcd_putc, " VALOR MINIMO") ; WHILE (dato <= 10) // Rutina de BLOQUEO de pulsadores {} } } }


VÍDEO DEL RETO


OBSERVACIONES
  • Al valor asignado del dato se le esta indicando que va variar, va a tener 4 espacios extra y solo va a ser positivo al colocar "%4lu".
  • En algunas ocasiones se puede reducir el código ya que se ve repeticiones que se pueden obviar.
  • Es necesario usar un reset para poder hacer pruebas continuas en el software Proteus.
  • Se ha agregado algunos espacios en el código para una mejor apreciación de lo mostrado en el LCD.
  • Estos son los terminales del LCD LM016L: VSS (Tierra del circuito), VDD (Alimentación a 5V), VEE (Ajuste de contraste), RS (Selección del registro de control - datos), R/W (Lectura o escritura), E (Habilitación) y D1-D7 (Bit de dato).
CONCLUSIONES
  • Comprendí el funcionamiento y diversas características del Display LCD.
  • Logré programar en el LCD las tareas asignadas de este laboratorio.
  • Concluyo que se puede realizar una gran cantidad de aplicaciones con el LCD ya que la capacidad de mostrar diversa información le da varias posibilidades de usos.

Comentarios