Autor Tema: LCD 2 líneas: RC0=RS,RC1=RW,RC2=E RC4..RC7=D4..D7  (Leído 3028 veces)

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

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
LCD 2 líneas: RC0=RS,RC1=RW,RC2=E RC4..RC7=D4..D7
« en: 28 de Febrero de 2004, 13:39:00 »
//                        lcd_c.c

//*************************************************************************

//               LCD para 2 líneas (2*16)
//   Rutina de CCS original lcd.c retocada con los bits de control en:
//   PORTC: RC0=RS,RC1=RW,RC2=E    RC4=D4,RC5=D5,RC6=D6,RC7=D7
//              ó bien:
//   PORTD: RD0=RS,RD1=RW,RD2=E    RD4=D4,RD5=D5,RD6=D6,RD7=D7


//*************************************************************************

///////////////////////////////////////////////////////////////////////////
////                             LCDD.C                                ////
////                 Driver for common LCD modules                     ////
////                                                                   ////
////  lcd_init()   Must be called before any other function.           ////
////                                                                   ////
////  lcd_putc(c)  Will display c on the next position of the LCD.     ////
////                     The following have special meaning:           ////
////                      f  Clear display                            ////
////                      
  Go to start of second line               ////
////                        Move back one position                   ////
////                                                                   ////
////  lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1)    ////
////                                                                   ////
////  lcd_getc(x,y)   Returns character at position x,y on LCD         ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services           ////
//// This source code may only be used by licensed users of the CCS C  ////
//// compiler.  This source code may only be distributed to other      ////
//// licensed users of the CCS C compiler.  No other use, reproduction ////
//// or distribution is permitted without written permission.          ////
//// Derivative programs created using this software in object code    ////
//// form are not restricted in any way.                               ////
///////////////////////////////////////////////////////////////////////////

// As defined in the following structure the pin connection is as follows:
//
//        lcd.c
//     ------------
//      PIC    LCD
//     -----  -----
//     D0(B0) enable
//     D1(B1)   rs
//     D2(B2)   rw
//     D4(B4)   D4
//     D5(B5)   D5
//     D6(B6)   D6
//     D7(B7)   D7

//
//   LCD pins D0-D3 are not used and PIC D3(B3) is not used (En la original de CCS)

#define use_portc_lcd true   //Deshabilitando esta línea: LCD en PORTD   

struct lcd_pin_map {                        // This structure is overlayed
           boolean rs;        //enable en CCS // on to an I/O port to gain
           boolean rw;      //rs en CCS     // access to the LCD pins.
           boolean enable;  //rw en CCS     // The bits are allocated from
           boolean unused;                  // low order up.  ENABLE will
           int     data : 4;                // be pin B0.
        } lcd;


#ifdef(__PCH__)
      #ifdef use_portc_lcd
         #byte lcd = 0xF82
      #else   
            #byte lcd = 0xF83         // This puts the entire structure
         #endif   
#else
      #ifdef use_portc_lcd
         #byte lcd = 7
      #else   
            #byte lcd = 8                 // on to port D (at address 8)
      #endif
#endif   


#ifdef use_portc_lcd
     #define set_tris_lcd(x) set_tris_c(x)
#else
      #define set_tris_lcd(x) set_tris_d(x)
#endif   


#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40    // LCD RAM address for the second line


byte CONST LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
                             // These bytes need to be sent to the LCD
                             // to start it up.


                             // The following are used for setting
                             // the I/O port direction register.

STRUCT lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
STRUCT lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in




byte lcd_read_byte() {
      byte low,high;
      set_tris_lcd(LCD_READ);
      lcd.rw = 1;
      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);
      lcd.rw = 0;
      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.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(2);
                                           break;
     case "
"   : lcd_gotoxy(1,2);        break;
     case ""   : 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);
    lcd.rs=1;
    value = lcd_read_byte();
    lcd.rs=0;
    return(value);
}