Ola, e probado con el 18F4550 y va bien, el problema es con el 18F2550 y creo q el problema viene por la libreria LCD (lcd.c), almenos eso creo. Alguien me puede ayudar? nose si tengo q cambiar algo en esa libreria, ya sea ahi o en el proyecto

Si de algo sirve uso un cristal de 4mhz y todo lo hago en el PICDEM 2 PLUS DEMO BOARD de MICROCHiP, compilado con CCS 4.023; los puertos RB4,5,6,7 del LCD van en los puertos RB0,1,2,3 del socket de 40 pines; entonces conecto esos pines del socket a sus pines del puerto RC0,1,2,3 para q se conecte con el socket de 28 pines y asi con el PIC, una imagen:

Para el PIC18F452 modifique el lcd.c desde hace mucho para q funcionara y recien hoy me doy cuenta q funciona tb con el 4550; y ahora tuve q modificar esa libreria ya modificada para q funcionara con el 2550, lo q hice ahora es esto:
//// LCD_F452.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:
// PUERTO LCD_DATO PUERTO DATO
// C0 D4 A0 --
// C1 D5 A1 E
// C2 D6 A2 R/W
// C3 D7 A3 RS
// C4 --
// C5 --
// C6 --
// C7 --
// LCD pins D0-D3 are not used and PIC D3 is not used.
// Un-comment the following define to use port B
// #define use_porta_lcd TRUE
struct lcd_pin_map { // This structure is overlayed
BOOLEAN unused; // low order up. ENABLE will
BOOLEAN enable; // on to an I/O port to gain
BOOLEAN rw; // access to the LCD pins.
BOOLEAN rs; // The bits are allocated from
int data : 4; // be pin A0.
int data_b : 8; // define puerto B
int data_c : 8; // define puerto C
// int data_d : 8; // define puerto D
} 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:PORTA") // This puts the entire structure over the port
#define set_tris_lcd(x) set_tris_a(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 = {1,1,1,1,0}; // For read mode data pins are in
BYTE lcd_read_byte() {
BYTE low,high; // Define 2 registros.
set_tris_c(LCD_READ); // Define D0 - D3 como estradas.
lcd.rw = 1; // RW=1, le decimos al LCD que estamos
delay_us(1);// delay_cycles(1); // en modo lectura.
lcd.enable = 1; // E=1, para leer el dato del LCD hay que
delay_us(1);// delay_cycles(1); // generar un CK de flanco positivo.
high = (lcd.data_c & 0x0f); // Leemos los 4 bit's MSB del LCD a traves
// del puerto "D" (D4-D0) limpiando
// el MSB y lo guardamos en "high"
lcd.enable = 0; // E=0, terminamos el pulso de CK.
delay_us(1);// delay_cycles(1); // Generamos un delay de 1 ciclo de inst.
lcd.enable = 1; // E=1, le decimos al LCD que nos envie
delay_us(1); // los 4 bit's LSB de datos. generando
// un retardo de 1us.
low = (lcd.data_c & 0x0f); // Leemos los 4 bit's LSB del LCD a traves
// del puerto "D" (D4-D0) limpiando
// el MSB y lo guardamos en "high"
lcd.enable = 0; // E=0, terminamos el pulso de CK.
set_tris_c(LCD_WRITE); // Define D0 - D3 como salidas.
return( (high<<4) | low); // retornamos de la sub-rutina con una
// constante = "high-low"
}
void lcd_send_nibble( BYTE n ) { // mandamos los datos al LCD.
lcd.data_c = n;
delay_us(1);// 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_us(1);// delay_cycles(1);
lcd.rw = 0;
delay_us(1);// delay_cycles(1);
lcd.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
void lcd_init() { // Proceso de inicialización del LCD.
BYTE i; // Definimos un registro llamado "i".
set_tris_lcd(LCD_WRITE); // Definimos el A1, A2, A3 como salidas.
set_tris_c(LCD_WRITE); // Definimos D0, D1, D2, D3 como salidas.
lcd.rs = 0; // RS = A3, ponemos el puerto 0 lógico
lcd.rw = 0; // RW = A2, ponemos el puerto 0 lógico
lcd.enable = 0; // E = A1, ponemos el puerto 0 lógico
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) { // Sub-rutina de ubicación del cursor
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); // clear display
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2); break; // Go to start of second line
case '\i' : lcd_gotoxy(1,1); break; //
case '\b' : lcd_send_byte(0,0x10); break; // move back one position
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);
}
*/
Nose pero creo q el problema venga de ahi o quiza de las conexiones, haber si se dan un tiempito porfa

Ah y el codigo para hacer funcionar el lcd es algo tan simple como prender un led:
#include <18f2550.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#include <LCD_f2550.c>
void main(void)
{
lcd_init();
lcd_putc("HOLA");
}
Probando con el PIC18F452 y 4550 (cambiando los includes y eso claro) este codigo va bien. Gracias de antemano

salu2
