DS18B20自动量程显示
来源:互联网 发布:煲耳机软件app 编辑:程序博客网 时间:2024/04/27 14:34
#define STRING_LENGTH 5 // 显示5位 -12.2 -0.01 0.000 1.000 12.50 125.0 const char *TempValueToString(uint16_t tempValue){ static char tempValueString[10] = {0}; uint8_t isMinus = 0; // 负数标志 负数为1 uint16_t shortData = 0; // 整数部分 (前12位 其实只有8位有效) uint16_t floatData = 0; // 小数部分 (后4位) uint8_t i; if(tempValue & 0x8000) // 如果是负数 { isMinus = 1; tempValue = ~tempValue +1; // 转成正数 tempValueString[0] = '-'; } shortData = (tempValue >> 4) & 0x00FF; // 整数部分 floatData = (tempValue & 0xF) * 625; // 小数部分 tempValueString[1] = shortData / 100 + '0'; tempValueString[2] = shortData % 100 / 10 + '0'; tempValueString[3] = shortData % 10 + '0'; tempValueString[4] = '.'; tempValueString[5] = floatData / 1000 + '0'; tempValueString[6] = floatData % 1000 / 100 + '0'; tempValueString[7] = floatData % 100 / 10 + '0'; tempValueString[8] = floatData % 10 + '0'; tempValueString[9] = '\0'; for(i = 1; i < 4; i++) { if((tempValueString[i] != '0') || (i == 3)) // (i==3) 能够确保函数在该循环内退出函数 { if(isMinus) // 是负数 加上负号之后返回字符串地址 { tempValueString[i - 1] = '-'; tempValueString[i - 1 + STRING_LENGTH] = '\0'; // 后面的部分丢掉 return &tempValueString[i - 1]; } else // 是正数 直接返回字符串地址 { tempValueString[i + STRING_LENGTH] = '\0'; // 后面的部分丢掉 return &tempValueString[i]; } } } return &tempValueString[9]; // 不应该执行到的地方}
输入DS18B20的温度寄存器数据
返回一个包含5个字符的字符串。
这样在LCD1602上显示的时候只占用固定的5个字符的空间。
还能保证最佳的精度。
自动量程与一般的显示效果对比