Hab deinen Code mal auf CodeVision umgestrickt.
Er rechnet mit den vorgegebenen Werten richtig.
Stimmen deine vorgegebenen Konstanten ?
Code:
#include <mega8.h>


#include <stdlib.h>
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm



#include <lcd.h>

#define F_CPU = 4000000UL
#define ad_nullwert 311
#define si_multiplyer 60
#define si_const 12
#define ADSC 6
#define ADEN 7

// uint16_t readADC(uint8_t);         //Prototyp von readADC
// void display_temp(uint16_t result);      //Prototyp von display

char buffer[8];                  //Array für itoa anlegen
signed int uint16_t;
signed long int si_temp1;               //Hilfvariable für Temperaturberechnung anlegen
signed long int si_temp2;
signed long int si_temp3;
signed long int si_ones;
signed long int si_komma;

void display_temp(unsigned int uint16_t)
{
   lcd_init(16);         //LCD initialisieren
   lcd_gotoxy(0,0);            //Cursor an erste Stelle setzen
   lcd_putsf("Temp.:");            //"Temperatur" ausgeben
   lcd_gotoxy(0,1);            // Cursor in die zweite Zeile setzen
   itoa(uint16_t,buffer);         //AD-Wert umrechnen
   lcd_puts(buffer);            //AD-Wert in der zweiten Zeile ausgeben
   lcd_gotoxy(0,9);            // Cursor hinter "Temperatur:" setzen


   //Berechnung der Temperatur
   si_temp1= (uint16_t-ad_nullwert);
   si_temp2= (si_temp1*si_multiplyer);
   si_temp3= (si_temp2/si_const);
   // Die Ganzen Grade Berechnen
   si_ones=si_temp3/10;
   //Die eine Nachkommastelle Berechnen
   si_komma=si_temp3%10;
   // Die Zehnerstellen ans Display ausgeben
   itoa(si_ones,buffer);
   lcd_puts(buffer);
   lcd_putchar(',');
   itoa(si_komma,buffer);
   lcd_puts(buffer);
   lcd_putchar(0xdf);
   lcd_putchar('C');
}


int read_adc(unsigned char uc_channel)
{
      
   unsigned char uc_i=0;
   unsigned int ui_result;
   
   //Den ADC aktivieren und Teilungsfaktor auf 32 stellen
   ADCSRA = 0b10000101; //(1<<ADEN) | (1<<ADPS0) | (1<<ADPS2);

   //Kanal des Multiplexers waehlen (ADC 0)
   uc_channel &=0b00000111;
   uc_channel |=0b11000000;
      
   //interne Referenzspannung verwenden (also 2,56 V)
   
   ADMUX = uc_channel;
   
   //Den ADC initialisieren und einen sog. Dummyreadout machen
   ADCSRA |= (1<<ADSC);
   while(ADCSRA & (1<<ADSC));
   
   //Jetzt 3x die analoge Spannung and Kanal channel auslesen
   //und dann Durchschnittswert ausrechnen.
   
   for(uc_i=0; uc_i<3; uc_i++)
   {
      // Eine Wandlung
      ADCSRA |= (1<<ADSC);
      // Auf Ergebnis warten...
      while(ADCSRA & (1<<ADSC));
      
      ui_result += ADCW;
   }
   
   
   //ADC wieder deaktivieren
   ADCSRA &= ~(1<<ADEN);
   
   ui_result /= 3;
   
   return ui_result;
} 

void main(void)
{
   DDRB = 0xff;                  //PORT B als Ausgang

   
   while (1)
   {
   //Auslesen der analogen Spannungen an Pin 0, also ADC0. In result steht das Ergebnis.
   uint16_t = read_adc(0);   
                           
   display_temp(uint16_t);            //Umrechnung und Ausgabe der Temperatur auf Display und LED`s
   }
}
Auf deinem C- Compiler wird aber das vermutlich nicht passen.