En el código, le falta la inicialización del sensor para que comienze a hacer capturas continuamente, como te comenté antes. La sentencia spi_data_is_in(), solo se usa en modo esclavo, y no en modo maestro, pues es el maestro el que envía la señal de reloj.
Con el tema del formato de los datos, el sensor no los da en formato decimal sino que cuando lees el registro de temperatura te da 13 bits que son los que tenés que usar para pasarlos a grados. En realida el CCS por hardware solo permite realizar una lectura de a 8 bits, por lo tanto leyendo 2 veces y guardando los datos en dos registros de 8 bits, obtenemos 16 bits leidos del sensor. Éste solo da 13bits válidos y los otros 3 bits restantes no forman parte de la temperatura medida
Para la inicialización haría lo siguiente (según el ejemplo que trae en la hoja de datos):
output_low(CS);
spi_read(0);//leemos byte alto de temperatura, pero no lo usamos
spi_read(0);//leemos byte bajo de temperatura, pero no lo usamos
spi_write(0x00);
spi_write(0xFF); Escribimos 0xXXFF para ponerlo en shutdown, en el registro de configuración
spi_read(0);//leemos byte alto
spi_read(0);//leemos byte bajo obtenemos el Manufacturer's ID register(C15:C8), aunque no lo usamos para nada
spi_write(0x00);
spi_write(0x00);//escribimos 0x0000 para ponerlo en sensado continuo, en el registro de configuración
output_high(CS);
Cómo se pasa de los registros leidos a grados?, esto está en la hoja de datos, pero te comento más mo menos como lo haría yo
Haciendo
output_low(CS);
TempH=spi_read(0); //leo el byte mas significativo de temperatura
TempL=spi_read(0); //leo el byte menos significativo de temperatura
output_high(CS);
Temp16Bits=make16(TempH,TempL); //Con esto obtengo el registro de 16 bits con los datos de la temperatura actual
//Como el sensor nos da el valor en complemento a dos para los números negativos:
if (Temp16Bits<0){
banderanegativo=1;//asignamos una bandera para saber si el número es negativo
Temp16Bits=~Temp16Bits+9;}//si es negativo lo complementamos a 2 y le sumamos 8
else{
banderanegativo =0;}
Temp16Bits=Temp16Bits>>3; //descartamos los 3 bits menos significativos
decimales=(float)(Temp16Bits&0b0000000001111)*0.0625;//damos formato a los decimales, segun la resolucion de 0.0625grados/bit(hoja de datos)
enteros=(float)(Temp16Bits>>4); //damos formato a los enteros, solo descartando los decimales
if (banderanegativo){
Temperatura=-1*(enteros+decimales)
}
else{
Temperatura=(enteros+decimales)
}
gotoxy(1,1);
printf(lcd_putc
,"Temp=%3.4f \n",Temperatura
);
las variables enteros, decimales y Temperatura son float,
Templ, Temph son int
Temp16bits es signed int16
El esquema de proteus está correcto, solo que en las propiedades del TC77, donde dice Temperature step colocaría 0.0625 que es la resolución del sensor.