單片機(jī)應(yīng)用實踐篇之單總線上單個DS18B20的溫度讀取顯示編程(基于LCD...

處理整數(shù)部分,老師前面講了,就是高五位是符號,所以我認(rèn)為需要單獨拿出來判斷一下,因為這會影響整數(shù)部分(中間的七位),是負(fù)數(shù),這幾位數(shù)就是補(bǔ)碼了,就需要取反,然后加一了,整數(shù)就沒關(guān)系,所以我單獨寫了一個函數(shù)來處理這個,大家可以直接用,
我把老師main 函數(shù)里這個換了
len = chuli(int Temp,str);
//處理整數(shù)部分
unsigned char chuli(int dat, unsigned char *str)
{
unsigned char i = 0;
unsigned char len = 0;
unsigned char buf[7];
//提取符號
unsigned char sign;
unsigned char zheng;
sign = dat >> 7; //將整數(shù)部分移走,此時sign代表符號位
//然后開始提取整數(shù)部分
zheng = dat & 0x007F; //消除了符號位
//此時zheng 有可能是負(fù)數(shù)(補(bǔ)碼),也有可能是整數(shù),所以需要判斷
if(sign > 0)
{
*str++ = '-';
len++;
//如果是負(fù)數(shù), 說明是補(bǔ)碼, 所以需要還原成源碼
//現(xiàn)在我們只需要 整數(shù)取反, 并且保留七位整數(shù),然后加一即可
zheng = ((~dat) & 0x07F )+ 1 ;
}
//下面把整數(shù)填進(jìn)數(shù)組
do
{
buf[i++] = zheng %10 + '0'; //dat%10 + 0x30; buf[0] = '8' buf[1] = '7'
zheng /= 10;
}while(zheng > 0); //每取到一位數(shù), 就截取掉
len += i;
while(i-- > 0)
{
*str++ = buf[i];
}
*str = '\0';
return len;
}