Autor Tema: MODIFICACION DE RUTINA DE LCD DE 2 LINEAS PARA LCD DE 4 LINEAS  (Leído 2809 veces)

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

Desconectado javprogramador

  • PIC10
  • *
  • Mensajes: 3
MODIFICACION DE RUTINA DE LCD DE 2 LINEAS PARA LCD DE 4 LINEAS
« en: 08 de Marzo de 2010, 15:23:06 »
Muy buenas tengo un pequeño problema a ver si me podriais ayudar. Estoy tratando de hacer funcionar un lcd de 4 lineas pero mi rutina es para uno de 2 lineas ¿Alguien sabria decirme que cambios realizar? Gracias de antemano

////                Driver para LCDs basados en HD44780                ////
////                                                                   ////
////   Basado en el driver 'LCD.C' incluido con el compilador C de CCS ////
////  versión 3.234.                                                   ////
////                                                                   ////
////   Válido para ser utilizado con la nueva versión de las tarjetas  ////
//// PICDEM2 PLUS de Microchip (las verdes).                           ////
////                                                                   ////
////   Modificaciones efectuadas por Miguel Ángel José Prieto          ////
////                                                                   ////
//// ----------------------------------------------------------------- ////
////                                                                   ////
////  FUNCIONES DEFINIDAS                                              ////
////  ===================                                              ////
////                                                                   ////
////  lcd_init()      Debe llamarse antes que cualquier otra función   ////
////                                                                   ////
////  lcd_putc(c)     Muestra 'c' en la siguiente posición del LCD     ////
////                        Caracteres con significado especial        ////
////                         \f  Borra display                         ////
////                         \n  Va al inicio de la segunda línea      ////
////                         \b  Retrocede una posición                ////
////                                                                   ////
////  lcd_gotoxy(x,y) Fija la posición del LCD donde escribir          ////
////                                                                   ////
////  lcd_getc(x,y)   Devuelve el carácter en la posición x,y del LCD  ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////                                                                   ////
//// v. 01  * Se pasan las líneas de datos del LCD a los cuatro bits   ////
////        más bajos del puerto.                                      ////
////        * Se traducen los comentarios al español.                  ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////

// Los pines a conectar se definen en una estructura como sigue:
//     X0  D4
//     X1  D5
//     X2  D6
//     X3  D7
//     X4  rs
//     X5  rw
//     X6  enable
//     X7  Control de la alimentación del LCD
//
// X puede ser el puerto D o el puerto B en este fichero.
// No se usan los pines D0-D3 del LCD (4 líneas de datos).
 

// Quitar el siguiente comentario para usar PORTB en vez de PORTD.
// #define use_portb_lcd TRUE

struct lcd_pin_map
       {                           // Esta estructura se mapea
           int      data : 4;      // en un puerto de E/S para
           BOOLEAN   rs;            // acceder a los pines del LCD.
           BOOLEAN   rw;            // Los bits se definen empezando
           BOOLEAN   enable;        // por el más bajo.  ENABLE es
           BOOLEAN


           Vcc;           // el bit X6 del PIC.
        } lcd;


#if defined(__PCH__)               // Aquí se mapea la estructura
#if defined use_portb_lcd
   #byte lcd = 0xF81               // en el puerto B (dirección F81h)
#else
   #byte lcd = 0xF83               // o en el D (dirección F83h)
#endif
#else
#if defined use_portb_lcd
   #byte lcd = 6                   // en el puerto B (dirección 6)
#else
   #byte lcd = 8                   // o en el D (dirección 8)
#endif
#endif


#if defined use_portb_lcd
   #define set_tris_lcd(x) set_tris_b(x)
#else
   #define set_tris_lcd(x) set_tris_d(x)
#endif


#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 líneas
#define lcd_line_two 0x40    // Dirección RAM del LCD para la segunda línea


// Estos bytes se mandan al LCD para inicializarlo.
BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};


// Estas constantes se usan para configurar los puertos de E/S.
// En modo escritura, todos los pines son salidas.
// En modo lectura, los pines de datos son entradas.
struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0};
struct lcd_pin_map const LCD_READ = {15,0,0,0,0};



 
///////////////////////////////////////////////////////////////////////////
BYTE lcd_read_byte()
{
      BYTE low,high;

      set_tris_lcd(LCD_READ);
      lcd.rw = 1;
      delay_cycles(2);
      lcd.enable = 1;
      delay_cycles(4);
      high = lcd.data;
      lcd.enable = 0;
      delay_cycles(8);
      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(3);
      lcd.enable = 1;
      delay_us(4);
      lcd.enable = 0;
}




///////////////////////////////////////////////////////////////////////////
void lcd_send_byte(BYTE address,BYTE n)
{
      lcd.rs = 0;
      delay_ms(3);                 // Espera por LCD desocupado.
      lcd.rs = address;
      delay_cycles(3);
      lcd.rw = 0;
      delay_cycles(3);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}




///////////////////////////////////////////////////////////////////////////
void lcd_init()
{
      BYTE i;

      set_tris_lcd(LCD_WRITE);
      lcd.Vcc = 1;                 // Asegura que el LCD esté alimentado.
      lcd.rs = 0;
      lcd.rw = 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);
}




///////////////////////////////////////////////////////////////////////////
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,0x80|address);
}




///////////////////////////////////////////////////////////////////////////
void lcd_putc(char c)
{
      switch (c)
      {
        case '\f':  lcd_send_byte(0,1);
                    delay_ms(5);
                    break;

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

        case '\b':  lcd_send_byte(0,0x10);
                    break;

        default  :  lcd_send_byte(1,c);
                    break;
      }
}




///////////////////////////////////////////////////////////////////////////
char lcd_getc(BYTE x, BYTE y)
{
      char value;

      lcd_gotoxy(x,y);
      delay_ms(3);                 // Espera por LCD desocupado.
      lcd.rs=1;
      value = lcd_read_byte();
      lcd.rs=0;
      return(value);
}
« Última modificación: 08 de Marzo de 2010, 20:37:49 por un Moderador »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: AYUDA!!! MODIFICACION DE RUTINA DE LCD DE 2 LINEAS PARA LCD DE 4 LINEAS
« Respuesta #1 en: 08 de Marzo de 2010, 18:03:52 »
CCS tiene libreria para LCD de 4 lineas, buscala en la carpeta de drivers. Sino hay otra en el foro de CCS.

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado javprogramador

  • PIC10
  • *
  • Mensajes: 3
Re: MODIFICACION DE RUTINA DE LCD DE 2 LINEAS PARA LCD DE 4 LINEAS
« Respuesta #2 en: 09 de Marzo de 2010, 14:03:28 »
Ya lo he resuelto gracias de todos modos