Archivo de la categoría: PIC

LCD 2×16 con 16f628A

En este post se muestra un programa básico de uso de una pantalla LCD de 2×16 (Dos líneas x Dieciséis caracteres cada una). En el esquema se puede observar el circuito básico del microcontrolador, es decir, el máster clear, con un pulsador por si se desea reiniciar, y se ha obviado el XTAL, ya que para la simulación no es relevante, pero que no se debe de olvidar a la hora de realizar el circuito físico.

 

Se usa una pantalla LCD y el microcontrolador. En dicha pantalla se muestra el texto que se indica en el programa en C. Este programa se puede considerar un ‘»¡Hola Mundo!» de una pantalla LCD.

 

Se ha utilizado un código modificado para el manejo del LCD, en concreto el que podéis encontrar en ucontrol.com.ar, el cual se diferencia en el de fabrica en que se usa directamente con el puerto B del microcontrolador en lugar del D, y en el que no se envía señal de control al R/W, pues las condiciones de trabajo solo especifica que se vaya a escribir en la pantalla y no a leer de ella.

 


 

 

 

 

El código utilizado es el que se muestra a continuación:

 

 

#include <16f628A.h>     //Se indica el ucontrolador que se va a utilizar.

#fuses XT,MCLR,NOWDT,NOPROTECT //Se indican los fuses activos/inactivos.

#use delay (clock=4000000)     //Se indica la velocidad del cristal XTAL=4MHz.

#include <lcd2.c>              //Se indica que se utilizará dicho archivo.

#use fast_io(B)                //Se declara el puerto B como de entrada salida.

 

void main ()

{

 

set_tris_B (0x00);            //Todos los pines del puerto B como salida.

 

lcd_init();                   //Se inicia comunicacion con la LCD.

 

lcd_putc(» Marqueses \nElectronics»);  //Se envía el texto a mostrar en la LCD.

}

 

Y el código de la librería de funciones del display LCD es:

 

///////////////////////////////////////////////////////////////////////////

// LCD.C modificada por uControl.com.ar                                   

///////////////////////////////////////////////////////////////////////////

//     B0  

//     B1  

//     B2  E

//     B3  RS

//     B4  D4

//     B5  D5

//     B6  D6

//     B7  D7

//   (Sin ‘RW’)

//

// Funciones soportadas:

//                         lcd_init()

//                         lcd_gotoxy( BYTE col, BYTE fila)

//                         lcd_putc( char c)

//                              \f  Clear display                             

//                              \n  Go to start of second line                

//                              \b  Move back one position

//

///////////////////////////////////////////////////////////////////////////

#define use_portb_lcd TRUE  //LCD conectado al puerto b.

//

struct lcd_pin_map {

   BOOLEAN unused1; // RB0

   BOOLEAN unused2; // RB1

   BOOLEAN enable;  // RB2

   BOOLEAN rs;      // RB3

   int data : 4;    // RB4-RB7

} lcd;

//

#byte lcd = 0xF81  // Direccion de la estructura «lcd».

#byte lcd = 6      // Direccion del puerto B.

#define set_tris_lcd(x) set_tris_b(x)

#define lcd_type 2           // Tipo de LCD: 0=5×7, 1=5×10, 2=2 lineas

#define lcd_line_two 0x40    // Dirección de la LCD RAM para la 2da. linea

//

//Defino la cadena de inicializacion del LCD.

BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};

//

//Configuro el estado de cada pin para lectura y escritura:

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // Escribir.

struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // Leer.

//

//Funciones:

BYTE lcd_read_byte() {

      BYTE low,high;

      set_tris_lcd(LCD_READ);

      delay_cycles(1);

      lcd.enable = 1;

      delay_cycles(1);

      high = lcd.data;

      lcd.enable = 0;

      delay_cycles(1);

      lcd.enable = 1;

      delay_us(1);

      low = lcd.data;

      lcd.enable = 0;

      set_tris_lcd(LCD_WRITE);

      return( (high<<4) | low);

}

//

void lcd_send_nibble( BYTE n ) {

      lcd.data = n;

      delay_cycles(1);

     lcd.enable = 1;

      delay_us(2);

      lcd.enable = 0;

}

//

void lcd_send_byte( BYTE address, BYTE n ) {

      lcd.rs = 0;

      while ( bit_test(lcd_read_byte(),7) ) ;

      lcd.rs = address;

      delay_cycles(1);

      delay_cycles(1);

      lcd.enable = 0;

      lcd_send_nibble(n >> 4);

      lcd_send_nibble(n & 0xf);

}

//

void lcd_init() {

    BYTE i;

    set_tris_lcd(LCD_WRITE);

    lcd.rs = 0;

    lcd.enable = 0;

    delay_ms(15);

    for(i=1;i<=3;++i) {

       lcd_send_nibble(3);

       delay_ms(5);

    }

    lcd_send_nibble(2);

    for(i=0;i<=3;++i)

       lcd_send_byte(0,LCD_INIT_STRING[i]);

}

//

void lcd_gotoxy( BYTE x, BYTE y) {

   BYTE address;

   if(y!=1)

     address=lcd_line_two;

   else

     address=0;

     address+=x-1;

     lcd_send_byte(0,0×80|address);

}

//

void lcd_putc( char c) {

   switch (c) {

     case ‘\f’   : lcd_send_byte(0,1);

                   delay_ms(2);

                                           break;

     case ‘\n’   : lcd_gotoxy(1,2);        break;

     case ‘\b’   : lcd_send_byte(0,0×10);  break;

     default     : lcd_send_byte(1,c);     break;

   }

}

 

 

 


 

1 comentario

Archivado bajo Electronica, Microcontrolador, PIC