Buenas amigos.
yo tengo la placa PICDEM 2 PLUS y al final he podido hacerlos de la siguiente manera:
#include <16f877a.h>
#fuses XT,NOWDT,PUT,NOPROTECT,BROWNOUT,NOLVP,NOCPD,NOWRT
#use delay (clock = 4000000)
#define EEPROM_SDA PIN_C4
#define EEPROM_SCL PIN_C3
#use i2c(master,sda=EEPROM_SDA, scl=EEPROM_SCL,FORCE_HW,slow)
#define escribir_dispositivo 0b10011010 //direccion del sensor y Write flag
#define leer_dispositivo 0b10011011 // direccion del sensor y read flag
//--------------------------------------------------------------------------//
// CONFIGURACION LCD //
//--------------------------------------------------------------------------//
#define LCD_POWER PIN_D7
#define LCD_EN PIN_D6
#define LCD_RS PIN_D4
#define LCD_DB4 PIN_D0
#define LCD_DB5 PIN_D1
#define LCD_DB6 PIN_D2
#define LCD_DB7 PIN_D3
#define LCD_RW PIN_D5
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lineas
#define lcd_line_two 0x40 // LCD RAM direccion para la 2ª linea.
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)
{
output_bit(LCD_DB4, !!(nibble & 1));
output_bit(LCD_DB5, !!(nibble & 2));
output_bit(LCD_DB6, !!(nibble & 4));
output_bit(LCD_DB7, !!(nibble &
);
delay_cycles(1);
output_high(LCD_EN);
delay_us(2);
output_low(LCD_EN);
}
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_EN);
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_EN);
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
);
#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);
while(bit_test(lcd_read_byte(),7));
output_high(LCD_RS);
value = lcd_read_byte();
output_low(lcd_RS);
return(value);
}
#endif
//--------------------------------------------------------------------------//
// FINAL CONFIGURACION LCD //
//--------------------------------------------------------------------------//
int signo = 0xDF;
int tmp=0;
void main()
{
output_high(LCD_POWER); // Encendemos el "power" del LCD
output_low(LCD_RW); // Ponemos el pin R/W del LCD a nivel bajo
lcd_init(); // Inicializamos el LCD.
while (1)
{
i2c_start(); // Iniciamos el bus I2C.
i2c_write(escribir_dispositivo); //
i2c_write(0x00);
i2c_start();
i2c_write(leer_dispositivo);
tmp=i2c_read();
i2c_stop();
lcd_gotoxy(3,2);
printf(lcd_putc,"Temp : %2D%cC",tmp,signo);
delay_ms(50); //Actualizamos cada 50 milisegundos.
}
}
Gracias a las aportaciones de los compañeros del foro.