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

处理整数部分,老师前面讲了,就是高五位是符号,所以我认为需要单独拿出来判断一下,因为这会影响整数部分(中间的七位),是负数,这几位数就是补码了,就需要取反,然后加一了,整数就没关系,所以我单独写了一个函数来处理这个,大家可以直接用,
我把老师main 函数里这个换了
len = chuli(int Temp,str);
//处理整数部分
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; //将整数部分移走,此时sign代表符号位
//然后开始提取整数部分
zheng = dat & 0x007F; //消除了符号位
//此时zheng 有可能是负数(补码),也有可能是整数,所以需要判断
if(sign > 0)
{
*str++ = '-';
len++;
//如果是负数, 说明是补码, 所以需要还原成源码
//现在我们只需要 整数取反, 并且保留七位整数,然后加一即可
zheng = ((~dat) & 0x07F )+ 1 ;
}
//下面把整数填进数组
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;
}