TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Chenao 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
-
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
-
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
-
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:
#include "LCDD.C"
Con esto, el compilador busca primero el archivo en el directorio donde esta el programa principal.
La estructura es la siguiente:
struct lcd_pin_map {
BOOLEAN enable;
BOOLEAN rs;
BOOLEAN rw;
BOOLEAN unused;
int data : 4;
} lcd;
El orden de los pines del puerto es desde D0.
Saludos
-
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.
-
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
-
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?
-
Con la Flex_LCD (http://picmania.garcia-cuervo.net/PICC.php#FLEXLCD) 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:
// Datos
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
// Control
#define LCD_RS PIN_C0
#define LCD_RW PIN_C1
#define LCD_E PIN_C2
-
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
-
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.
-
Con tantas librerias que hay!!!! creo que es facil confundirse amigo Cryn :mrgreen: :mrgreen:
Saludos
-
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
-
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.
-
:oops: :oops: :oops:
Toca seguir aprendiendo, esa es la consigna, aprendiendo para compartir.
Saludos
-
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
-
te aconsejo que uses las etiquetas [ code ] [ / code ]
Que están en el editor cuando escribes la respuesta, su icono es un numeral. Se ve mejor y no existen caritas de por medio que se metan, como aparece una por ahí y además hace que cursiva y otros efectos también no funcionen, para que el código se vea correctamente.
edita tu mensaje para que se pueda ver bien el código
muchas gracias por colocarlo acá, si que servirá