Autor Tema: Conectar un LCd a un PIC  (Leído 3962 veces)

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

Desconectado jcogliat

  • PIC10
  • *
  • Mensajes: 1
Conectar un LCd a un PIC
« en: 04 de Noviembre de 2009, 19:05:43 »
conecté el LCD ITM-1602d-02 al pic siguiendo las especifiaciones dadas en el datasheet del ITM-1603DSTL, que fue el más cercano al modelo que encontré, pero al ejecutar el programa hecho en c solo aparece encendido la ínea de arriba completa ty nada más, les adjunto el programa y el driver porvisto por el compilador CCS. Granias y saludos.

Driver:
///////////////////////////////////////////////////////////////////////////
////                             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                            ////
////                      \n  Go to start of second line               ////
////                      \b  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:
//     D0  enable
//     D1  rs
//     D2  rw
//     D4  D4
//     D5  D5
//     D6  D6
//     D7  D7
//
//   LCD pins D0-D3 are not used and PIC D3 is not used.

// Un-comment the following define to use port B
 #define use_portb_lcd TRUE


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


#if defined use_portb_lcd
   #locate lcd = getenv("sfr:PORTB")    // This puts the entire structure over the port
   #define set_tris_lcd(x) set_tris_b(x)
#else
   #locate lcd = getenv("sfr:PORTD")    // This puts the entire structure over the port
   #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 '\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);
    while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
    lcd.rs=1;
    value = lcd_read_byte();
    lcd.rs=0;
    return(value);
}

Programa:
#include "D:\Mis documentos\Beca Robótica INTELIMEC\Desarrollos\Profundímetro\Soft\mostar.h"


#include <lcd.c>
   
//==========================
void main()
{
lcd_init();  // Always call this first.

lcd_putc("\fHello World\n");
lcd_putc("Line Number 2");

while(1);
}

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Conectar un LCd a un PIC
« Respuesta #1 en: 04 de Noviembre de 2009, 23:32:59 »
Que tal jcogliat!
Mira en el foro hay bastante informacion de como conectar una lcd y operarla con el CCS  :mrgreen:
Utiliza el buscador para ello.

Para lo que estas queriendo hacer debes utilizar el printf  :mrgreen:
Y no el lcd_putc como lo estas empleando  :?
Sino asi:

printf(lcd_putc,"\fHello World\n");
primtf(lcd_putc,"Line Number 2");

Saludos

Desconectado X

  • PIC10
  • *
  • Mensajes: 7
Re: Conectar un LCd a un PIC
« Respuesta #2 en: 05 de Noviembre de 2009, 22:43:23 »
Hola jcogliat

Mira segun lo que indicas en la libreria estas utilizando el puerto B para transmitir la informacion.
 #define use_portb_lcd TRUE
Entonces conectas de la siguiente manera:
LCD                  PIC
D4 (pata 11)      PIN_B4
D5 (pata 12)      PIN_B5
D6 (pata 13)      PIN_B6
D7 (pata 14)      PIN_B7

Luego para el resto que es el RS, RW y EN deberian estar registrado en tu archivo .c de tu proyecto o sino pones estas instrucciones:
#define LCD_ENABLE_PIN PIN_A2
#define LCD_RS_PIN PIN_A0
#define LCD_RW_PIN PIN_A1
#define LCD_DATA_PORT PORTB
#define LCD_TYPE 2
#define LCD_TRIS_LOCATION TRISB

Y modificas a que puerto y que pines queres poner estos conectores.
Tenes suerte que por lo menos te marca algo y estoy peleando con uno igual hace 1 semana y no se ve nada.
Pase desde asm a C y nada.

Saludos


 

anything