Parametrami funkcji są 2 wskaźniki: char *p_buf wskazujący na bufor ze starszym i młodszym bajtem temperatury i float *p_temp wskazujący na bufor przeznaczony na wartość otrzymaną po konwersji. Stałe TEMP_MIN i TEMP_MAX służą do sprawdzania czy otrzymany po konwersji wynik mieści się w dopuszczalnym zakresie. Jeżeli wszystko się zgadza funkcja zwraca wartość true.
char Konwersja_odczyt_temp(char *p_buf, float *p_temp)
{
uint16_t liczba;
float temp;
liczba =*p_buf <<1;
if ((*(p_buf+1) & 0x80) !=0) liczba =liczba+1;
if ((liczba & 0x100) !=0)
{
//temperatura ujemna
liczba =(~liczba &0xff)+1;
temp =liczba;
temp =0 -temp;
}
else temp =liczba;
temp =temp /2;
//sprawdzanie czy odczytana temperatura mieści się w dopuszczalnym zakresie
if (temp < TEMP_MIN || temp > TEMP_MAX) return false;
*p_temp =temp;
return true;
}
Wartość umieszczona w buforze wskazywanym przez float *p_temp zostaje zamieniona na 2 bajty temperatury w formacie dopełnienia do 2. Procedura sprawdza czy temperatura do konwersji mieści się w dopuszczalnym zakresie. Jeżeli tak, następuje zamiana temperatury na 2 bajty zapisywane w buforze char *p_buf.
char Konwersja_zapis_temp(char *p_buf, float *p_temp)
{
float temp;
char temperatura_ujemna;
uint16_t temp_16;
char ulamek_05;
temp =*p_temp;
//sprawdzanie czy temperatura do konwersji mieści się w dopuszczalnym zakresie
if (temp < TEMP_MIN || temp > TEMP_MAX) return false;
if (temp<0)
{
temperatura_ujemna =true;
temp =0 - temp;//zmiana na wartość absolutną
}
else temperatura_ujemna =false;
temp_16 =temp; //temperatura w stopniach
if ((temp-temp_16)>=0.5) ulamek_05 =true;
else ulamek_05 =false;
temp_16 =temp_16<<1;//temperatura w 0,5 stopnia
if (ulamek_05 ==true) temp_16++;
if (temperatura_ujemna ==true)
{
temp_16 =~temp_16 +1;
}
temp_16 =temp_16 & 0x1ff;
//formowanie 2 bajtów w dopełnieniu do 2
temp_16 =(temp_16<<7);
*p_buf =(temp_16>>8);//H bajt
*(p_buf+1) =0xff & temp_16;
return true;
}