DS18B20自动量程显示

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



 

猜你喜欢

转载自kiolp.iteye.com/blog/2296746