Autor Tema: LCD 4x20  (Leído 2693 veces)

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

Desconectado rovando

  • PIC10
  • *
  • Mensajes: 9
LCD 4x20
« en: 09 de Noviembre de 2004, 01:36:00 »
Saludos necesito la libreria para  C manejar un LCD de 4x20, uso el PCW como compilador. espero alguien me ayude o me diga como modificar la que trae el PCW por default.

Desconectado MasterD

  • PIC10
  • *
  • Mensajes: 10
RE: LCD 4x20
« Respuesta #1 en: 09 de Noviembre de 2004, 03:55:00 »
// La ventaja de este codigo es que puedes trabajar si lo quieres con pines
// dispersos es decicir no estas sujeto a la mitad de un puerto


// Registros de Puertos A & B
#define  PORTA 0x05  // Puerto A
#define  PORTB 0x06  // Registro de direccionamiento Puerto A
#define  TRISA 0x85  // Puerto B
#define  TRISB 0x86  // Registro de direccionamiento Puerto B


// Definición de Puertos Pantalla LCD 40x20 Hitachi 44780
#bit  lcd_db4        = PORTB.0
#bit  tris_lcd_db4   = TRISB.0
#bit  lcd_db5        = PORTB.1
#bit  tris_lcd_db5   = TRISB.1
#bit  lcd_db6        = PORTB.2
#bit  tris_lcd_db6   = TRISB.2
#bit  lcd_db7        = PORTB.3
#bit  tris_lcd_db7   = TRISB.3
#bit  lcd_en         = PORTA.0
#bit  tris_lcd_en    = TRISA.0
#bit  lcd_rw         = PORTA.1
#bit  tris_lcd_rw    = TRISA.1
#bit  lcd_rs         = PORTA.2
#bit  tris_lcd_rs    = TRISA.2


//  lcd_init()   Inicialización del LCD (debe utilizarse al principio,
//  antes de trabajar con el LCD).
//
//  lcd_putc(c)  Imprime un caracter en el LCD.
//
//  lcd_gotoxy(x,y) Selecciona la nueva posicion de escritura en el LCD.
//                  (la esquina superior izquierda es 1,1)
//
//  lcd_getc(x,y) Devuelve el caracter de la posicion x,y del LCD.
//
// void lcd_erase_line(x) Borra una cantidad de caracter hacia la derecha

// Conexion a la pantalla LCD 40x4
//  RB0 <---> LCD DB4
//  RB1 <---> LCD DB5
//  RB2 <---> LCD DB6
//  RB3 <---> LCD DB7
//  RA0 <---> LCD ENEABLE
//  RA1 <---> LCD R/W
//  RA2 <---> LCD RS
//

#define LCD_DATO 1
#define LCD_INST 0

#define LCD_LINEA1 0x80    // Direccion de memoria para la 1 linea
#define LCD_LINEA2 0xc0    // Direccion de memoria para la 2 linea
#define LCD_LINEA3 0x94    // Direccion de memoria para la 3 linea
#define LCD_LINEA4 0xd4    // Direccion de memoria para la 4 linea

#define chr_1      0x00
#define chr_2      0x01
#define chr_3      0x02
#define chr_4      0x03
#define chr_5      0x04
#define chr_6      0x05
#define chr_7      0x06

//                 7 6 5 4 3 2 1 0
// Function Set 0b 0 0 1 B L F 0 0
// Bus size, B:0=4 bits, B:1=8 bits
// Line Number, L:0=1 Line, L:1=2 Lines
// Font size F:0=5x8, F:1=5x10
#define LCD_FUNCTION_SET   0b00101000  // Bus=4bit, Line=2 & Font=5x8

//                   7 6 5 4 3 2 1 0
// Display/Cursor 0b 0 0 0 0 1 D U B
// Set Display on/off, D:0=off, D:1=on
// Underline cursor, U:0=off, U:1=on
// Blinking cursor, B:0=off, B:1=on
#define LCD_DISPLAY_CURSOR 0b00001100  // Display=on, Scroll=off, Blinkin=off

//               7 6 5 4 3 2 1 0
// Entry Mode 0b 0 0 0 0 0 1 M S
// Cursor direction, M:0=left, 1=right
// Display Scroll, S:0=no scroll, S:1=scroll
#define LCD_ENTRY_MODE     0b00000110  // Increment cursor, no disp shift

void lcd_set_write() {
   tris_lcd_db4 = 0;    //
   tris_lcd_db5 = 0;    //
   tris_lcd_db6 = 0;    //
   tris_lcd_db7 = 0;    //---> Set portb RB0-RB3 mode output
}

void lcd_set_read() {
   tris_lcd_db4 = 1;    //
   tris_lcd_db5 = 1;    //
   tris_lcd_db6 = 1;    //
   tris_lcd_db7 = 1;    //---> Set portb RB0-RB3 mode input
}

int8 lcd_read() {
   int8 valor=0;        // Crea e inicializa una variable de 8 Bits
   lcd_set_read();      // Prepara el puerto DB4-DB7 como entrada
   lcd_rw = 1;          // Habilita modo de lectura
   delay_cycles(1);     // nop
   lcd_en = 1;          // Habilita LCD Eneable
   delay_cycles(1);     // nop
   if (lcd_db4)         // Lectura de DB4
      bit_set(valor,4); //
   if (lcd_db5)         // Lectura de DB5
      bit_set(valor,5); //
   if (lcd_db6)         // Lectura de DB6
      bit_set(valor,6); //
   if (lcd_db7)         // Lectura de DB7
      bit_set(valor,7); //---> Recoje los datos MSB
   lcd_en = 0;          // Desabilita LCD Eneable
   delay_cycles(1);     // nop
   lcd_en = 1;          // Habilita LCD Eneable
   delay_us(2);         // Espera 2 uSeg.
   if (lcd_db4)         //
      bit_set(valor,0); //
   if (lcd_db5)         //
      bit_set(valor,1); //
   if (lcd_db6)         //
      bit_set(valor,2); //
   if (lcd_db7)         //
      bit_set(valor,3); //---> Recoje los datos LSB
   lcd_en = 0;          // Desabilita LCD Eneable
   delay_cycles(1);     // nop
   lcd_set_write();     // Prepara el puerto DB4-DB7 como salida
return (valor);
}

void lcd_send_nibble(int8 n) {
   if (bit_test(n,0))   //
      lcd_db4 = 1;      //
   else                 //
      lcd_db4 = 0;      //

   if (bit_test(n,1))   //
      lcd_db5 = 1;      //
   else                 //
      lcd_db5 = 0;      //

   if (bit_test(n,2))   //
      lcd_db6 = 1;      //
   else                 //
      lcd_db6 = 0;      //

   if (bit_test(n,3))   //
      lcd_db7 = 1;      //
   else                 //
      lcd_db7 = 0;      //---> Set data nibble
   delay_cycles(1);     // nop
   lcd_en = 1;          // Habilita LCD Eneable       __
   delay_us(2);         // Espera 2 uSeg.            |  |
   lcd_en = 0;          // Desabilita LCD Eneable  __|  |__
}

void lcd_send_byte (int1 select, int8 n) {
   lcd_rs = 0;          // Modo de instruccion
   while (bit_test(lcd_read(),7));  // Espera que la pantalla se desabilite
   lcd_rs = select;     // Escoje entre RS=0 : Instruccion & RS=1 : Data
   delay_cycles(1);     // nop
   lcd_rw = 0;          // Habilita modo de escritura
   delay_cycles(1);     // nop
   lcd_en = 0;          // Desabilita LCD Eneable
   lcd_send_nibble(n >> 4); // Envia los datos superiores MSB
   lcd_send_nibble(n);      // Envia los datos inferiores LSB
}
// Opciona por si quieres crear caracteres especiales, puedes crear hasta 8
void lcd_cgram() {
   int8 i;
   const int8 chr[56] = {0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x15,   // chr_1
                         0x15,0x00,0x10,0x10,0x10,0x10,0x00,0x15,   // chr_2
                         0x15,0x00,0x14,0x14,0x14,0x14,0x00,0x15,   // chr_3
                         0x15,0x00,0x15,0x15,0x15,0x15,0x00,0x15,   // chr_4
                         0x00,0x00,0x00,0x00,0x1F,0x0E,0x04,0x00,   // chr_5
                         0x00,0x04,0x0E,0x1F,0x04,0x04,0x04,0x00,   // chr_6
                         0x00,0x04,0x04,0x04,0x1F,0x0E,0x04,0x00};  // chr_7

   lcd_send_byte(LCD_INST, 0x40);
   for(i=0;i<=55;++i) {
      lcd_send_byte(LCD_DATO, chr);
   }
   lcd_send_byte(LCD_INST,0x01); // Clear LCD
}

void lcd_init() {
   int8 i, count=0;
   lcd_set_write();     // Prepara el puerto DB4-DB7 como salida
   tris_lcd_en  = 0;    //
   tris_lcd_rw  = 0;    //
   tris_lcd_rs  = 0;    //---> Set porta RA0, RA1 & RA2 mode output
   lcd_en       = 0;    //
   lcd_rw       = 0;    //
   lcd_rs       = 0;    //---> Clear LCD_EN, LCD_RW & LCD_RS
   delay_ms(25);
   retry:
      for(i=1; i<=3; ++i) {
         lcd_send_nibble(0b0011); // 8 bit mode 3 times
         delay_ms(5);
      }
      lcd_send_nibble(0b0010); // 4 bit mode
      while (bit_test(lcd_read(),7)) {  // Espera que la pantalla se desabilite
         delay_us(100);
         count++;
         if (count>=200) {
            count=0;
            goto retry;
         }
      }
   lcd_send_byte(LCD_INST, LCD_FUNCTION_SET); // Function Set
   lcd_send_byte(LCD_INST, LCD_DISPLAY_CURSOR); // Display Cursor
   lcd_send_byte(LCD_INST, LCD_ENTRY_MODE); // Entry Mode
}

void lcd_gotoxy(int8 x, int8 y) {
   int8 const address[4]={LCD_LINEA1,LCD_LINEA2,LCD_LINEA3,LCD_LINEA4};
   int8 pos;
   pos=address[y-1]+(x-1);
   lcd_send_byte (LCD_INST, pos);
}

char lcd_getc(int8 x, int8 y) {
   char valor;
   lcd_gotoxy(x,y);
   lcd_rs = 1;
   valor = lcd_read();
   lcd_rs = 0;
   return (valor);
}

void lcd_putc(char c) {
   lcd_send_byte(LCD_DATO,c);
}

void lcd_clear() {
   lcd_send_byte(LCD_INST,0x01);
}

void lcd_home() {
   lcd_send_byte(LCD_INST,0x02);
}

void lcd_erase_line(int8 x) {
   int8 i;
   for(i=1;i<=x;++i) {
      lcd_send_byte(LCD_DATO,32);
   }
}


Desconectado rovando

  • PIC10
  • *
  • Mensajes: 9
RE: LCD 4x20
« Respuesta #2 en: 09 de Noviembre de 2004, 09:27:00 »
Saludos gracias por tomarse la molestia de pasarme la libreria, en breve la probare, hasta pronto.