单片机应用实践篇之单总线上单个DS18B20的温度读取显示编程(基于数码管...

我找到规律了,我发现, 正数是没问题的,然后负数,如果这个负数是整数的话, 整数部分,就是根据补码的规则去求的,取反,然后加一,
但是如果负数,并且后面带有小数的话,整数部分就是反码, 不是补码了,可能需要区分一下,我也没手册,我是看老师截图,换算得到的结论,并且我验算了,可以实现,总结一下,正数,是本身,没问题,负数的话,如果小数点后面有数字,那么整数部分,是原码的反码,不是补码,小数点后面是0的话,那整数部分就是补码,取反加一就可以了
//xiao是小数部分,就是区分,当负数的情况下,补码和反码
if(xiao == 0x00)
{
zheng = ((~dat)+1) ;
}
else
{
zheng = ((~dat) ) ;
}
完整的处理函数
/处理整数部分
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; //将整数部分移走,此时sign代表符号位
//然后开始提取整数部分
zheng = dat & 0x007F; //消除了符号位
//此时zheng 有可能是负数(补码),也有可能是整数,所以需要判断
if(sign > 0)
{
*str++ = '-';
len++;
//如果是负数, 说明是补码, 所以需要还原成源码
//现在我们只需要 整数取反, 并且保留七位整数,然后加一即可
// zheng = ((~dat) & 0x07F +1) ;
if(xiao == 0x00)
{
zheng = ((~dat)+1) ;
}
else
{
zheng = ((~dat) ) ;
}
}
//下面把整数填进数组
do
{
buf[i++] = zheng %10 + '0'; //dat%10 + 0x30; buf[0] = '8' buf[1] = '7'
zheng /= 10;
}while(zheng > 0); //每取到一位数, 就截取掉
len += i;
while(i-- > 0)
{
*str++ = buf[i];
}
*str = '\0';
return len;
}
