Gente muchas gracias igualmente pero ya lo solucione modificando la libreria LCD2.h.
Les paso una version nueva de la LCD2.h para trabajar con Displays de 4x20 ( solo le agregue un Switch-Case.
Espero que les sea de utilidad
#use fast_io(
#use fast_io(D)
#define LCD_LINEA2 0xC0 // Direccion de memoria para la segunda linea
#define LCD_LINEA3 0x94 // Direccion de memoria para la tercera linea
#define LCD_LINEA4 0xD4 // Direccion de memoria para la cuarta linea
#define LCD_DATO 1
#define LCD_COMANDO 0
#define LCD_CLEAR 0x01
#define LCD_HOME 0x02
#define LCD_MOVCURSO 0x06
#define LCD_DISPLAY_OFF 0x08
#define LCD_DISPLAY_ON 0x0C
#define LCD_CURSOR_ON 0x0E
#define LCD_CURSOR_BLINK 0x0F
#define LCD_CURSOR_SHIFT_RIGHT 0x10
#define LCD_CURSOR_SHIFT_LEFT 0x14
#define LCD_DISPLAY_SHIFT_RIGHT 0x18
#define LCD_DISPLAY_SHIFT_LEFT 0x1C
int lcd_leer()
{
int valor;
set_tris_b(0x00);
set_tris_d(0xFF);
output_high(PIN_B0); // ( R/W )
delay_cycles(1);
output_high(PIN_B1); // ( E )
delay_cycles(1);
valor = input_d();
output_low(PIN_B1);
delay_us(40);
set_tris_b(0x00);
set_tris_d(0x00);
return valor;
}
void lcd_enviar(int dir,int valor)
{
set_tris_b(0x00);
set_tris_d(0x00);
output_low(PIN_B1);
delay_ms (1);
output_low(PIN_B2);
output_bit(PIN_B2, dir);
delay_ms (1);
output_d(valor);
delay_ms (1);
output_high(PIN_B1);
delay_cycles(1);
output_low(PIN_B1);
delay_ms (1);
}
void lcd_init()
{
int i;
set_tris_b(0x00);
set_tris_d(0x00);
output_low(PIN_B1);
output_low(PIN_B0);
output_low(PIN_B2);
delay_ms(15);
for(i=0; i<3; i++)
{
lcd_enviar(LCD_COMANDO,0x38);
delay_ms(5);
}
lcd_enviar(LCD_COMANDO,LCD_DISPLAY_ON);
delay_ms(5);
lcd_enviar(LCD_COMANDO,LCD_CLEAR);
delay_ms(5);
lcd_enviar(LCD_COMANDO,LCD_MOVCURSO);
delay_ms(5);
lcd_enviar(LCD_COMANDO,LCD_HOME);
}
/* void lcd_gotoxy( byte x, byte y) {
byte dir;
if(y!=1)
dir=LCD_LINEA2;
else
dir=0;
dir+=x-1;
lcd_enviar(LCD_COMANDO,0x80|dir);
}
*/
void lcd_gotoxy( byte x, byte y) {
byte dir;
dir=0;
Switch (y) {
case 1 : dir=0x80; break;
case 2 : dir=0xc0; break;
case 3 : dir=0x94; break;
case 4 : dir=0xd4; break;
}
dir+=x-1;
lcd_enviar(LCD_COMANDO,0x80|dir);
}
void lcd_putc( char c) {
switch © {
case '\f' : lcd_enviar(LCD_COMANDO,0x80);
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2); break;
case '\b' : lcd_enviar(LCD_COMANDO,0x10); break;
default : lcd_enviar(LCD_DATO,c); break;
}
}
char lcd_getc( int x, int y) {
char valor;
lcd_gotoxy(x,y);
output_high(PIN_B2);
valor = lcd_leer();
output_low(PIN_B2);
return valor;
}