Autor Tema: LCD para 4 líneas (4*16 ó 4*20)  (Leído 2832 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
LCD para 4 líneas (4*16 ó 4*20)
« en: 27 de Diciembre de 2003, 08:55:00 »
Ejemplo de prueba:

//****************************************************
//                     LCD para 4 líneas (4*16 o 4*20)
//                                con
//    3 bits de control en PORTA y 8 bits de datos en PORTB
//****************************************************


#include <16f84.h>

#use delay(clock=4000000)

#include <lcd_4lin.c>// Microsystems Engineering retocada para 4 líneas

#use fast_io(A)
#use fast_io(B)

main()
{

    lcd_init();      // Comandos de inicialización del LCD.

    lcd_gotoxy(5,1);    
    lcd_putc("LINEA 1";
    lcd_gotoxy(5,2);    
    lcd_putc("LINEA 2";
    lcd_gotoxy(5,3);    
    lcd_putc("LINEA 3";
    lcd_gotoxy(5,4);    
    lcd_putc("LINEA 4";        
   
}


*****************************************************
*****************************************************

Librería:


//            lcd_4lin.c

// Funciones para la gestion del display LCD de la MicroPIC Trainer.

//  lcd_init()   Debe ser llamada antes que las otras funciones.
//
//  lcd_putc(c)  Visualiza c en la siguiente posición del display.
//               Caracteres especiales de control:
//                      f  Borrar display
//                      
  Saltar a la segunda linea
//                        Retroceder una posición.
//
//  lcd_gotoxy(x,y) Selecciona la nueva posicion de escritura en el display.
//                  (la esquina superior izquierda es 1,1)
//
//  lcd_getc(x,y)   Devuelve el caracter de la posicion x,y del display.


#bit  lcd_enable = 5.2
#bit  lcd_rw     = 5.1
#bit  lcd_rs     = 5.0
#byte lcd_a = 5
#byte lcd_b = 6

//Para una LCD de 4*16
/*
#define LCD_LINEA2 0x40    // Direccion de memoria para la segunda linea
#define lcd_LINEA3 0x10 // LCD RAM address for the 3th line
#define lcd_LINEA4 0x50 // LCD RAM address for the 4th line
*/
//Para una LCD de 4*20

#define LCD_LINEA2 0x40
#define LCD_LINEA3 0x14
#define LCD_LINEA4 0x54

#define LCD_DATO    1
#define LCD_COMANDO 0

#define LCD_CLEAR     0x01
#define LCD_HOME   0x02

#define LCD_DISPLAY_OFF  0x08
#define LCD_DISPLAY_ON   0x0C
#define LCD_CURSOR_ON    0x0E
#define LCD_CURSOR_BLINK 0x0F

#define LCD_CURSOR_SHIFT_RIGHT  0x10
#define LCD_CURSOR_SHIFT_LEFT   0x14
#define LCD_DISPLAY_SHIFT_RIGHT 0x18
#define LCD_DISPLAY_SHIFT_LEFT  0x1C


int lcd_leer()
{
  int valor;

  set_tris_a(0x18);
  set_tris_b(0xFF);

  lcd_rw = 1;
  delay_cycles(1);
  lcd_enable = 1;
  delay_cycles(1);
  valor = lcd_b;
  lcd_enable = 0;
  delay_us(40);

  set_tris_b(0x00);
  return valor;
}


void lcd_enviar(int dir, int valor)
{
  set_tris_a(0x00);
  set_tris_b(0x00);

  lcd_rs = 0;
  while( bit_test(lcd_leer(),7) );
  lcd_rs = dir;
  delay_cycles(1);

  lcd_rw = 0;
  delay_cycles(1);
  lcd_enable = 0;
  lcd_b = valor;
  delay_cycles(1);
  lcd_enable = 1;
  delay_us(2);
  lcd_enable = 0;
  delay_us(40);
}


void lcd_init()
{
  int i;

  set_tris_a(0x18);
  set_tris_b(0x00);

  lcd_enable = 0;
  lcd_rw = 0;
  lcd_rs = 0;
  delay_ms(15);

  for(i=0; i<3; i++)
  {
    lcd_enviar(LCD_COMANDO,0x38);
    delay_ms(5);
  }
  lcd_enviar(LCD_COMANDO,LCD_DISPLAY_ON);
  lcd_enviar(LCD_COMANDO,0x06);
  lcd_enviar(LCD_COMANDO,LCD_CLEAR);
  lcd_enviar(LCD_COMANDO,LCD_HOME);
}


void lcd_gotoxy( byte x, byte y)
{
   byte dir;

   switch(y)
   {
   case 1 :
      dir=0;
      dir+=x-1;
      break;
   case 2 :
      dir=LCD_LINEA2;
      dir+=x-1;
      break;
   case 3 :
      dir=LCD_LINEA3;
      dir+=x-1;
      break;
   case 4 :
      dir=LCD_LINEA4;
      dir+=x-1;
      break;
   }
         
   lcd_enviar(LCD_COMANDO,0x80|dir);
}


void lcd_putc( char c)
{
   switch (c)
   {
     case "f"   : lcd_enviar(LCD_COMANDO,0x01);
                   delay_ms(2);
                   break;
     case "
"   : lcd_gotoxy(1,2);               break;
     case ""   : lcd_enviar(LCD_COMANDO,0x10);  break;
     default     : lcd_enviar(LCD_DATO,c);        break;
   }
}


   char lcd_getc( int x, int y) {
   char valor;

    lcd_gotoxy(x,y);

    lcd_rs = 1;
    valor = lcd_leer();
    lcd_rs = 0;

    return valor;
}




Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1700
    • winpic800
RE: LCD para 4 líneas (4*16 ó 4*20)
« Respuesta #1 en: 27 de Diciembre de 2003, 12:03:00 »
Todas las direcciones de cada linea en todos los modelos
http://miarroba.com/foros/ver.php?foroid=132071&temaid=1355382