Buenas
Yo tambien me he pasado al c18. Visto lo efectivo de las librerias de c18 (ni xlcd.h ni adc.h acaban de convencerme), os pongo una modificacion de xlcd.h, basandome en otras libs:
**No olvideis definir en el programa principal las funciones de retardo, que segun la frecuencia, pueden variar:
void Delay1u();
void Delayms(char n);
**
#define lcd_type 2
#define lcd_line_two 0x40
#define tris_write 0x00
#define tris_read 0xF0
//Interfaz 4 bits, datos en nibble superior.
#define LCD_E PORTDbits.RD0
#define LCD_RS PORTDbits.RD1
#define LCD_RW PORTDbits.RD2
#define LCD_TRIS TRISD
#define LCD_PORT PORTD
char const INIT[4]={0x20|(lcd_type<<2),0x0c,1,6};
extern void Delay1u();
extern void Delayms(char n);
char lcd_read_byte();
void lcd_send_nibble(char n);
void lcd_CmdData(char opt,char n);
void lcd_init();
void lcd_gotoxy(char x,char y);
void lcd_putc(char c);
char lcd_read_byte()
{
char lo,hi;
LCD_TRIS=tris_read;
LCD_RW=1;
Nop();
LCD_E=1;
Nop();
hi=LCD_PORT&0xF0;
LCD_E=0;
Nop();
LCD_E=1;
Delay1u();
Delay1u();
lo=(LCD_PORT>>4)&0x0F;
LCD_E=0;
LCD_TRIS=tris_write;
return(hi|lo);
}
void lcd_send_nibble(char n)
{
LCD_PORT&=0x0F;
LCD_PORT|=((n&0x0F)<<4);
Nop();
Delay1u();
LCD_E=1;
Delay1u();
LCD_E=0;
}
void lcd_CmdData(char opt,char n)
{
LCD_RS=0;
while((lcd_read_byte()|0x7F)==0xFF);
LCD_RS=opt;
Nop();
LCD_RW=0;
Delay1u();
LCD_E=0;
lcd_send_nibble(n>>4);
lcd_send_nibble(n);
}
void lcd_init()
{
char i;
LCD_TRIS=tris_write;
LCD_RS=0;
LCD_RW=0;
LCD_E=0;
Delayms(5);
for(i=1;i<=3;++i)
{
lcd_send_nibble(3);
Delayms(5);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_CmdData(0,INIT[i]);
}
void lcd_gotoxy(char x,char y)
{
char addr;
if(y==1)
{
addr=0x00;
}
else
{
addr=0x40;
}
addr+=x-1;
lcd_CmdData(0,0x80|addr);
}
void lcd_putc(char c)
{
switch (c){
case '\f' :lcd_CmdData(0,1);
Delayms(2);
break;
case '\n' :lcd_gotoxy(1,2);
break;
case '\b' :lcd_CmdData(0,0x10);
break;
default :lcd_CmdData(1,c);
}
}
Recordar tambien, que mediante la funcion fprintf (stdio.h) podemos printefear un string con formato.
Para ello, definiremos una funcion
void _user_putc(char c)
{
lcd_putc(c);
}
y luego invocaremos fprintf, de la forma fprintf(_H_USER,"Mi texto %d %d",num1,num2);
Espero que sirva de algo el aporte.