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

我找到規(guī)律了,我發(fā)現(xiàn), 正數(shù)是沒問題的,然后負(fù)數(shù),如果這個負(fù)數(shù)是整數(shù)的話, 整數(shù)部分,就是根據(jù)補(bǔ)碼的規(guī)則去求的,取反,然后加一,
但是如果負(fù)數(shù),并且后面帶有小數(shù)的話,整數(shù)部分就是反碼, 不是補(bǔ)碼了,可能需要區(qū)分一下,我也沒手冊,我是看老師截圖,換算得到的結(jié)論,并且我驗(yàn)算了,可以實(shí)現(xiàn),總結(jié)一下,正數(shù),是本身,沒問題,負(fù)數(shù)的話,如果小數(shù)點(diǎn)后面有數(shù)字,那么整數(shù)部分,是原碼的反碼,不是補(bǔ)碼,小數(shù)點(diǎn)后面是0的話,那整數(shù)部分就是補(bǔ)碼,取反加一就可以了
//xiao是小數(shù)部分,就是區(qū)分,當(dāng)負(fù)數(shù)的情況下,補(bǔ)碼和反碼
if(xiao == 0x00)
{
zheng = ((~dat)+1) ;
}
else
{
zheng = ((~dat) ) ;
}
完整的處理函數(shù)
/處理整數(shù)部分
unsigned char chuli(int dat, unsigned char *str,int xiao)
{
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) ;
if(xiao == 0x00)
{
zheng = ((~dat)+1) ;
}
else
{
zheng = ((~dat) ) ;
}
}
//下面把整數(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;
}
