hola:
El codigo que adjunto funciona bien en proteus pero en el hardware real no. la lcd se enciende y solo me muestra la primera linea con todos los caracteres en negro en forma de cuadrado. He probado todas las combinaciones posibles de puertos y tampoco. Lo unico que no he hecho es cablear los pines 15 y 16 de la lcd pero esos creo que no se cablean.
un saludo
aitor
#include <16f876a.h>
#fuses XT,NOWDT
#use fast_io(c)
#use delay(clock=4000000)
#define CS PIN_C0
#define LCD_RS PIN_B1
#define LCD_RW PIN_B2
#define LCD_E PIN_B3
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
#include "flex_lcd.c"
int Templ=0;
int Temph=0;
signed int16 Temp16Bits=0;
float decimales=0;
float enteros=0;
int1 banderanegativo=0;
float Temperatura;
void main(){
set_tris_c(0b00010000);
setup_spi(spi_master|spi_l_to_h| spi_ss_disabled);
lcd_init();
//configuracion del sensor en modo continuo
//output_low(CS);
//spi_read(0);//leemos byte alto
//spi_read(0);//leemos byte bajo
//spi_write(0x00);
//spi_write(0xFF);
//spi_read(0);//leemos byte alto
//spi_read(0);//leemos byte bajo
//spi_write(0x00);
//spi_write(0x00);
//output_high(CS);
while(1){
output_low(CS);
Temph=spi_read(0);//obtenemos el Temp alto del registro de temperatura
Templ=spi_read(0);//obtenemos el Temp bajo del registro de temperatura
output_high(CS);
Temp16Bits=make16(Temph,Templ);//convertimos a un registro de 16Bits
banderanegativo=0;
if (Temp16Bits<0){
banderanegativo=1;
Temp16Bits=~Temp16Bits+8;
}//si es negativo lo complementamos a 2 y le sumamos 8
Temp16Bits=Temp16Bits>>3;//descartamos los 3 bits menos significativos
decimales=(float)(Temp16Bits&0b0000000000001111)*0.0625;//damos formato a los decimales
enteros=(float)(Temp16Bits>>4); //damos formato a los enteros, solo descartando los decimales
if (banderanegativo){
Temperatura=-1*(enteros+decimales);
}
else{
Temperatura=(enteros+decimales);
}
printf(lcd_putc,"\f");
lcd_gotoxy(1,2);
printf(lcd_putc,"Temp=%3.4f \n",Temperatura);
delay_ms(100);
}
}