Autor Tema: Muchas dudas sobre LCD  (Leído 8113 veces)

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

Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Muchas dudas sobre LCD
« en: 02 de Agosto de 2010, 11:50:03 »
Hola a todos antes que nada felicitarlos por todo el material que hay en esta web
Mis inquietudes son las siguientes:

Me compré una placa entrenadora: tiene un LCD 16x2 y está conectado de esta manera:

D4   PORTD,4
D5   PORTD,5
D6   PORTD,6
D7   PORTD,7
E     PORTE,2
RS   PORTE,1
R/W  GND

Bueno no e conseguido imprimir nada en él, no se como configurar la libreria lcd.c ya que tengo el bus datos y de control en distintos puertos

Alguien tiene idea como se debería hacer esto?



Dejo un código con el que he probado:
Código: [Seleccionar]
#include <18F4620.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES NOPROTECT                //Code not protected from reading
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES BORV21                   //Brownout reset at 2.1V
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES LVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES MCLR                     //Master Clear pin enabled

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)


#define LCD_ENABLE_PIN PIN_E2
#define LCD_RS_PIN PIN_E1
#define LCD_RW_PIN PIN_E0
#define LCD_DATA_PORT PORTD
#define LCD_TYPE 2
#define LCD_TRIS_LOCATION TRISD
#include <lcd.c>

#use fast_io (a)
#use fast_io (b)
#use fast_io (c)
#use fast_io (d)

void main()
{
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF|ADC_TAD_MUL_0);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_oscillator(False);
   delay_ms(500);
   

   lcd_init();
   delay_ms(500);
   lcd_putc("\fPRUEBA\n");
   delay_ms(500);



}

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Muchas dudas sobre LCD
« Respuesta #1 en: 02 de Agosto de 2010, 12:03:49 »
Deberias poner el codigo de la libreria lcd.c que usas, ya que hay varias versiones, incluso las ultimas estan preparadas para otros tipos de pics.

Ademas creo que hay algun problema cuando declaras el pin R/W en Pin_E0.
Si realmente ese pin no esta conectado tendrias un problema que puede ser el causante de que el LCD no funcione...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Re: Muchas dudas sobre LCD
« Respuesta #2 en: 02 de Agosto de 2010, 12:07:18 »
Muchas gracias por tu rapidez!!!

aquí te dejo la librería:

Código: [Seleccionar]

///////////////////////////////////////////////////////////////////////////
////                             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[i]);
}


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);
}



Y entonces como deberia configurar el pin R/W ???



Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Re: Muchas dudas sobre LCD
« Respuesta #3 en: 02 de Agosto de 2010, 12:15:16 »
Deberias poner el codigo de la libreria lcd.c que usas, ya que hay varias versiones, incluso las ultimas estan preparadas para otros tipos de pics.

Ademas creo que hay algun problema cuando declaras el pin R/W en Pin_E0.
Si realmente ese pin no esta conectado tendrias un problema que puede ser el causante de que el LCD no funcione...

En el post de arriba pogué el LCD.C, tengo un 16f877 también para probar pero no he conseguido mostrar nada en el LCD...
Vos decís que el problema puede estar en el pin R/W ?

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Muchas dudas sobre LCD
« Respuesta #4 en: 02 de Agosto de 2010, 16:04:36 »
Esa libreria no te permite utilizar los pines de dos puertos distintos.
Prueba poner todo en PortD o en PortB, asi ves si funciona tu codigo.
Hay una libreria de lcd que si permite usar pines de puertos distintos, se llama flexlcd.c

Buscala en el foro que esta en diferentes lugares colgada por los foristas, la verdad es que no se si viene incluida en el CCS.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: Muchas dudas sobre LCD
« Respuesta #5 en: 02 de Agosto de 2010, 16:09:18 »
Te recomiendo el 'flexible LCD Driver' de los foros de CCS:
http://www.ccsinfo.com/forum/viewtopic.php?t=24661

Un saludo

Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Re: Muchas dudas sobre LCD
« Respuesta #6 en: 02 de Agosto de 2010, 22:29:29 »
Esa libreria no te permite utilizar los pines de dos puertos distintos.
Prueba poner todo en PortD o en PortB, asi ves si funciona tu codigo.
Hay una libreria de lcd que si permite usar pines de puertos distintos, se llama flexlcd.c

Buscala en el foro que esta en diferentes lugares colgada por los foristas, la verdad es que no se si viene incluida en el CCS.

Hola, estas seguro que no te permite conectar por dos puertos??? Yo quiero usar los bits de datos por el mismo puerto... y los de control (E RS y RW) por otro... esto no se puedo???

Gracias!!!

Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Re: Muchas dudas sobre LCD
« Respuesta #7 en: 02 de Agosto de 2010, 23:06:31 »
Te recomiendo el 'flexible LCD Driver' de los foros de CCS:
http://www.ccsinfo.com/forum/viewtopic.php?t=24661

Un saludo
Muchas Gracias con esta librería si pude... !!!

Desconectado ZAROD2010

  • PIC10
  • *
  • Mensajes: 3
tipo de LCD
« Respuesta #8 en: 31 de Agosto de 2010, 01:07:18 »
Hola, tengo un LCD color azul de 32 pines, 16 por lado (lado arriba y lado abajo) (1 línea = 16 pines), no sé que tipo es, en la placa dice 1620A-17, usando una línea (la de arriba) me sale bien, puedo mostrar mensajes, aunque no se ilumina el LCD. Mi pregunta es, para qué sirve la línea 2 (línea de abajo) de 16 pines, será para configurar la iluminación y el constraste?. Espero que alguien me ayude.

Rómulo

Desconectado berlanga

  • PIC10
  • *
  • Mensajes: 5
Re: tipo de LCD
« Respuesta #9 en: 31 de Agosto de 2010, 08:22:01 »
Hola, tengo un LCD color azul de 32 pines, 16 por lado (lado arriba y lado abajo) (1 línea = 16 pines), no sé que tipo es, en la placa dice 1620A-17, usando una línea (la de arriba) me sale bien, puedo mostrar mensajes, aunque no se ilumina el LCD. Mi pregunta es, para qué sirve la línea 2 (línea de abajo) de 16 pines, será para configurar la iluminación y el constraste?. Espero que alguien me ayude.

Rómulo

sabes el fabricante? porque tirando de google no veo nada que nos solucione la papeleta... (tampoco he tenido mucho tiempo)la retroiluminación suele ir en un lateral... y el contraste en la misma fila de pines que los datos...

Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 666
Re: Muchas dudas sobre LCD
« Respuesta #10 en: 31 de Agosto de 2010, 09:35:17 »
Esa libreria no te permite utilizar los pines de dos puertos distintos.
Prueba poner todo en PortD o en PortB, asi ves si funciona tu codigo.
Hay una libreria de lcd que si permite usar pines de puertos distintos, se llama flexlcd.c

Buscala en el foro que esta en diferentes lugares colgada por los foristas, la verdad es que no se si viene incluida en el CCS.

Hola, estas seguro que no te permite conectar por dos puertos??? Yo quiero usar los bits de datos por el mismo puerto... y los de control (E RS y RW) por otro... esto no se puedo???

Gracias!!!

Hola buenos dias me permites un rato en este post segun lo que te comento el colega es que con la libreria que estas usando no puedes manejar el lcd dos dos puertos del pic pero que si existen otras libreria que te puedes ayudar para tu proposito el mensiono hasta el nombre flexlcd algo asi yo no te doy muchos detaller porque ahorita estoy un poco retirado de c pero recuerdo haberla usado y si funciona para declarar la lcd en dos puertos; ojo: el bus de data de la lcd siempre tiene que estar en un mismo puerto sino no te funcionara.

saludos y espero me entiendas.
Atten.
Alexander Santana.
Barcelona-Venezuela.
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE

Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 666
Re: tipo de LCD
« Respuesta #11 en: 31 de Agosto de 2010, 09:43:13 »
Hola, tengo un LCD color azul de 32 pines, 16 por lado (lado arriba y lado abajo) (1 línea = 16 pines), no sé que tipo es, en la placa dice 1620A-17, usando una línea (la de arriba) me sale bien, puedo mostrar mensajes, aunque no se ilumina el LCD. Mi pregunta es, para qué sirve la línea 2 (línea de abajo) de 16 pines, será para configurar la iluminación y el constraste?. Espero que alguien me ayude.

Rómulo

Hola buenos dias, oye primero que todo amigo te recomiendo que leas sobre las lcd para que aclares un poco las dudas ya que veo que tienes un poco de confuncion en el tema la lcd a la cual haces referencia es una lcd de 2fila 16 columnas eso quieres decir que en ambas lineas puedes escribir mensajes, ahora el que no te ilumine en sus pines de contacto tiene unos que son para ilimunar la lcd se llaman anodo y cadoto pero para eso lo mejor es buena la hoja de datos de tu lcd y asi puedes saber para que es cada cosa.

Saludos y disculpa mi manera pero es sin animos a ofenderte es otro aclarandote tu dudas.
Atten.
Alexander Santana
Barcelona Venezuela.
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE

Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 666
Re: Muchas dudas sobre LCD
« Respuesta #12 en: 31 de Agosto de 2010, 09:48:21 »
Te recomiendo el 'flexible LCD Driver' de los foros de CCS:
http://www.ccsinfo.com/forum/viewtopic.php?t=24661

Un saludo
Muchas Gracias con esta librería si pude... !!!
Oye disculpa no habia leido este en el cual ya comentabas que si pudistes con esa otra libreria.

Saludos.
Atten.
Alexander Santana.
Barcelona-Venezuela.
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE

Desconectado flyingjoint

  • PIC10
  • *
  • Mensajes: 2
Re: Muchas dudas sobre LCD
« Respuesta #13 en: 21 de Septiembre de 2010, 15:31:26 »
buen dia:

Estoy empezando a aprender a programar PIC's en C, he leido lo suficiente pero hay varias dudas que tengo al respecto. En cuanto al LCD los links que pusieron sobre el "flex lcd.c" es para poder conectar las salidas del lcd a cualquiera de los pines del Micro, pero mi pregunta es ¿Esa libreria es para conectar el LCD a 8 líneas o sólo para 4? porque al según por lo que entendi del programa es para 4 líneas, y tengo entendido que si lo hago con 8 la comunicación es más rápida, es un LCD de 16 bits y 2 líneas con el que trabajo. Además tengo que crear la libreria y ponerla en la carpeta de drivers del compilador ¿Verdad?. Estoy usando el PIC 16F784. En realidad, mire a detalle la librerica lcd.c y tiene razón en cuanto a que todas las líneas deben de ir al mismo puerto. Espero puedan resolver mi duda. Gracias

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Muchas dudas sobre LCD
« Respuesta #14 en: 21 de Septiembre de 2010, 16:26:48 »
Es a 4 lineas. Y la diferencia de velocidad es mínima, ~1us. No creo que afecte.


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