Autor Tema: Ayuda con Configuración de LCD en C  (Leído 3214 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Ayuda con Configuración de LCD en C
« en: 16 de Septiembre de 2008, 18:52:05 »
Bueno muchachos tengo la siguiente inquietud para configurar una LCD, Cuando uno elije el puerto que va a utilizar para la LCD el compilador crea lo siguiente

Fila 1               Fila2
D0                  E
D1                  RS
D2                  RW
D3                  NADA
D4                  D4
D5                  D5
D6                  D6
D7                  D7

La pregunta es la siguiente ¿ No hay la mánera de cambiar esta configuración? es decir, E en D7, RS en D4 etc.

Espero que me puedan ayudar.

Un Saludo desde Pereira - Colombia
Un saludo desde Pereira - Colombia

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Ayuda con Configuración de LCD en C
« Respuesta #1 en: 16 de Septiembre de 2008, 20:44:34 »
Hola.

Por supuesto que si, lo unico que hay que hacer es modifcar la estructura. Tambien hay otras opciones de librerias para el manejo de la LCD como lo son la flexlcd de RedPic, la cual permite asignar cualquier pin de cualquier puerto para el manejo de la LCD.

Si lo haces con la libreria del CCS el problema es que como la estructura se asigna al puerto, solo se puede trabajar con el puerto completo.

Saludos
El papel lo aguanta todo

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Ayuda con Configuración de LCD en C
« Respuesta #2 en: 17 de Septiembre de 2008, 13:24:48 »
Un saludo MLO. Como se accede a la estructura y como se modifica "como ves apenas estoy dando los primeros paso en CCS". Gracia por la colaboración.

Un saludo
Un saludo desde Pereira - Colombia

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Ayuda con Configuración de LCD en C
« Respuesta #3 en: 17 de Septiembre de 2008, 13:29:53 »
Hola.

Eso se modifica en la libreria LCD.C del CCS. Te recomiendo sacar una copia de la original, o, como yo hago, copio el archivo a la carpeta donde tengo el programa principal y le doy otro nombre. Ya en el main linkeo la libreria de la siguiente manera:

Código: [Seleccionar]
#include "LCDD.C"
Con esto, el compilador busca primero el archivo en el directorio donde esta el programa principal.

La estructura es la siguiente:
Código: C#
  1. struct lcd_pin_map {                
  2.            BOOLEAN enable;        
  3.            BOOLEAN rs;              
  4.            BOOLEAN rw;              
  5.            BOOLEAN unused;  
  6.            int     data : 4;      
  7.         } lcd;

El orden de los pines del puerto es desde D0.

Saludos
El papel lo aguanta todo

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Ayuda con Configuración de LCD en C
« Respuesta #4 en: 17 de Septiembre de 2008, 18:10:37 »
creo que una de las mejores opciones es utilizar la librería flex_lcd.c que te mencionó MLO__, colócalo en el buscador y seguramente que la encuentras.
.

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Ayuda con Configuración de LCD en C
« Respuesta #5 en: 26 de Septiembre de 2008, 16:34:24 »
Un saludo. MLO ya me funciono lo logré configurar y me funciono a la perfección pero te tengo otra consulta no hay manera de configurar la LCD por medio de dos puertos, es decir, rw,rs,e en un puerto (a,b,c,d,e), y los demás en otro puerto.


Un saludo desde Perira-Colombia
Un saludo desde Pereira - Colombia

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Ayuda con Configuración de LCD en C
« Respuesta #6 en: 26 de Septiembre de 2008, 17:43:51 »
si que hay forma, me parece que no haz buscado la librería flex_lcd.c no?

pero igual en la libreria lcd.c que tienes puedes fijarte en los defines y darle a RS E RW las direcciones de los puertos que te convengan.

Por que no colocas los defines de esos ppines aca para que te ayudemos mejor?
.

Conectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Ayuda con Configuración de LCD en C
« Respuesta #7 en: 26 de Septiembre de 2008, 17:53:31 »
Con la Flex_LCD defines uno a uno los pines que deseas, que si son digitales y de salida puedes utilizar los que quieras en el orden que quieras de los puertos que quieras con tan solo asignar los pines físicos a los lógicos mediante los defines al inicio de la librería:

Código: C#
  1. // Datos
  2.   #define LCD_DB4 PIN_B4
  3.   #define LCD_DB5 PIN_B5
  4.   #define LCD_DB6 PIN_B6
  5.   #define LCD_DB7 PIN_B7
  6.   // Control
  7.   #define LCD_RS PIN_C0
  8.   #define LCD_RW PIN_C1
  9.   #define LCD_E  PIN_C2
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Ayuda con Configuración de LCD en C
« Respuesta #8 en: 26 de Septiembre de 2008, 18:37:35 »
pero igual en la libreria lcd.c que tienes puedes fijarte en los defines y darle a RS E RW las direcciones de los puertos que te convengan.

No se puede con la libreria LCD.C asignar cualquier pin, ya que la variable tipo estructura se pasa al registro completo de un puerto. La mejor opcion para eso es la libreria del maestro RedPic.

Saludos
El papel lo aguanta todo

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Ayuda con Configuración de LCD en C
« Respuesta #9 en: 27 de Septiembre de 2008, 11:24:15 »
cierto tienes razón MLO__ se me había olvidado que esa librería es de CCS, y que ahí si no se puede, me estaba confundiendo con la lcd2.c de un buen usuario que la hizó, funciona a 8bits y en esa libreria si se puede modificar como dije.

me equivoque de libreria :oops: ustedes disculpen pues :mrgreen:

Entonces al amigo que pregunto solo le queda utilizar el flex_lcd.c o el lcd2.c, este último a 8bits

un saludo.
.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Ayuda con Configuración de LCD en C
« Respuesta #10 en: 27 de Septiembre de 2008, 11:40:06 »
Con tantas librerias que hay!!!! creo que es facil confundirse amigo Cryn  :mrgreen: :mrgreen:

Saludos
El papel lo aguanta todo

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Ayuda con Configuración de LCD en C
« Respuesta #11 en: 05 de Octubre de 2008, 22:05:12 »
Saludos

RedPic,  MLO, CRYN. Muchas gracias por ayudame a resolver las dudas con respecto al manejo de una de una LCD. Les agradesco los trucos, la verdad el lenguaje C es nuevo para mi, en el momento lo estoy cacharreando haber si me vuelvo un teso como ustedes.

Un saludo desde Pereir - Colombia
Un saludo desde Pereira - Colombia

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Ayuda con Configuración de LCD en C
« Respuesta #12 en: 06 de Octubre de 2008, 11:55:52 »
que bueno que hayas conseguido hacer funcionar bien tu proyecto, no es necesario tanto agradcimiento, que nos sonrojas :D

nose que será teso, pero seguro que a mi tb me falta mucho para ser así, jeje, me falta mucho por aprender, y espero que todo lo que pueda aportar sirva a alguien para que el tb aprenda

y aconsejarte pues que sigas con esa perseverancia y optimismo para aprender, pues solo se necesita de eso para que puedas hacer lo que desees con estos micros. El foro siempre te ayudará, y verás que ya hay mucha info que podrá servirte en el mundo de los micros.

Un saludo amigo.
.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Ayuda con Configuración de LCD en C
« Respuesta #13 en: 06 de Octubre de 2008, 12:00:04 »
 :oops: :oops: :oops:

Toca seguir aprendiendo, esa es la consigna, aprendiendo para compartir.

Saludos
El papel lo aguanta todo

Desconectado pablofer78

  • PIC10
  • *
  • Mensajes: 20
Re: Ayuda con Configuración de LCD en C
« Respuesta #14 en: 15 de Enero de 2009, 14:33:24 »
usa la libreria FLEX_LCD.c

// flex_lcd.c

// These pins are for the Microchip PicDem2-Plus board,
// which is what I used to test the driver.  Change these
// pins to fit your own board.

//#define LCD_DB4   PIN_B4
//#define LCD_DB5   PIN_B5
//#define LCD_DB6   PIN_B6
//#define LCD_DB7   PIN_B7
//
//#define LCD_RS    PIN_C0
//#define LCD_RW    PIN_C1
//#define LCD_E     PIN_C2

// If you only want a 6-pin interface to your LCD, then
// connect the R/W pin on the LCD to ground, and comment
// out the following line.

//#define USE_LCD_RW   1

//========================================

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


int8 const LCD_INIT_STRING[4] =
{
 0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
 0xc,                    // Display on
 1,                      // Clear display
 6                       // Increment cursor
 };


//-------------------------------------
void lcd_send_nibble(int8 nibble)
{
// Note:  !! converts an integer expression
// to a boolean (1 or 0).
 output_bit(LCD_DB4, !!(nibble & 1));
 output_bit(LCD_DB5, !!(nibble & 2));
 output_bit(LCD_DB6, !!(nibble & 4));
 output_bit(LCD_DB7, !!(nibble & 8));

 delay_cycles(1);
 output_high(LCD_E);
 delay_us(2);
 output_low(LCD_E);
}

//-----------------------------------
// This sub-routine is only called by lcd_read_byte().
// It's not a stand-alone routine.  For example, the
// R/W signal is set high by lcd_read_byte() before
// this routine is called.

#ifdef USE_LCD_RW
int8 lcd_read_nibble(void)
{
int8 retval;
// Create bit variables so that we can easily set
// individual bits in the retval variable.
#bit retval_0 = retval.0
#bit retval_1 = retval.1
#bit retval_2 = retval.2
#bit retval_3 = retval.3

retval = 0;

output_high(LCD_E);
delay_cycles(1);

retval_0 = input(LCD_DB4);
retval_1 = input(LCD_DB5);
retval_2 = input(LCD_DB6);
retval_3 = input(LCD_DB7);

output_low(LCD_E);

return(retval);
}
#endif

//---------------------------------------
// Read a byte from the LCD and return it.

#ifdef USE_LCD_RW
int8 lcd_read_byte(void)
{
int8 low;
int8 high;

output_high(LCD_RW);
delay_cycles(1);

high = lcd_read_nibble();

low = lcd_read_nibble();

return( (high<<4) | low);
}
#endif

//----------------------------------------
// Send a byte to the LCD.
void lcd_send_byte(int8 address, int8 n)
{
output_low(LCD_RS);

#ifdef USE_LCD_RW
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60);
#endif

if(address)
   output_high(LCD_RS);
else
   output_low(LCD_RS);

 delay_cycles(1);

#ifdef USE_LCD_RW
output_low(LCD_RW);
delay_cycles(1);
#endif

output_low(LCD_E);

lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}

//----------------------------
void lcd_init(void)
{
int8 i;

output_low(LCD_RS);

#ifdef USE_LCD_RW
output_low(LCD_RW);
#endif

output_low(LCD_E);

delay_ms(15);

for(i=0 ;i < 3; i++)
   {
    lcd_send_nibble(0x03);
    delay_ms(5);
   }

lcd_send_nibble(0x02);

for(i=0; i < sizeof(LCD_INIT_STRING); i++)
   {
    lcd_send_byte(0, LCD_INIT_STRING);

    // If the R/W signal is not used, then
    // the busy bit can't be polled.  One of
    // the init commands takes longer than
    // the hard-coded delay of 60 us, so in
    // that case, lets just do a 5 ms delay
    // after all four of them.
    #ifndef USE_LCD_RW
    delay_ms(5);
    #endif
   }

}

//----------------------------

void lcd_gotoxy(int8 x, int8 y)
{
int8 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;
   }
}

//------------------------------
#ifdef USE_LCD_RW
char lcd_getc(int8 x, int8 y)
{
char value;

lcd_gotoxy(x,y);

// Wait until busy flag is low.
while(bit_test(lcd_read_byte(),7));

output_high(LCD_RS);
value = lcd_read_byte();
output_low(lcd_RS);

return(value);
}
#endif

void lcd_setcursor_vb(short visible, short blink) {
  lcd_send_byte(0, 0xC|(visible<<1)|blink);
}


en tu programa antes de llamar a la funcion defini los pines como quieras con esto y listo
#define LCD_DB4   PIN_B4
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6
#define LCD_DB7   PIN_B7

#define LCD_RS     PIN_C0
#define LCD_RW    PIN_C1
#define LCD_E       PIN_C2