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个字符的空间。
还能保证最佳的精度。
自动量程与一般的显示效果对比



 

 

原创粉丝点击