无法从温度计字节读数中提取整数

Can't extract an integer from a thermometer byte reading

大家下午好,

抱歉,如果这个问题格式错误或位置错误,如果是这种情况,请标记,我会更改它或转移到其他地方。

我正在使用开发板向 LCD 面板发送温度读数,我真的很难理解为什么程序 运行 时的温度没有被打印到我的液晶显示器很多代码来自给我的框架,据我所知是正确的。

我的问题源于这些函数:

uch get_temp()
{
    int i;
    DQ_HIGH();
    reset();                              //reset,wait for  18b20 responsion
    write_byte(0XCC);                     //ignore ROM matching
    write_byte(0X44);                     //send  temperature convert command
    for(i=20;i>0;i--)
        {

            //display();                    //call some display function,insure the time of convert temperature
        }
    reset();                              //reset again,wait for 18b20 responsion
    write_byte(0XCC);                     //ignore ROM matching
    write_byte(0XBE);                     //send read temperature command
    TLV=read_byte();                      //read temperature low byte
    THV=read_byte();                      //read temperature high byte
    DQ_HIGH();                            //release general line
    TZ=(TLV>>4)|(THV<<4)&0X3f;            //temperature integer
    TX=TLV<<4;  //temperature decimal

    if(TZ>100) 
    {
        TZ/100; 
    }                   //not display hundred bit

    ge=TZ%10;                     //integer Entries bit
    shi=TZ/10;                    //integer ten bit
    wd=0;

if (TX & 0x80) 
    wd=wd+5000;

if (TX & 0x40) 
    wd=wd+2500;

if (TX & 0x20) 
    wd=wd+1250;

if (TX & 0x10)
    wd=wd+625;                //hereinbefore four instructions are turn  decimal into BCD code

    shifen=wd/1000;                          //ten cent bit
    baifen=(wd%1000)/100;                    //hundred cent bit
    qianfen=(wd%100)/10;                     //thousand cent bit
    wanfen=wd%10;                            //myriad cent bit
    NOP();
    return TZ;
}

我已经修改了这个函数,所以它应该 return 温度整数(unsigned char TZ)

然后在此处调用此函数:

void Init_lcd(void)
{
    ADCON1 = 0x07; //required setting of analog to digital

    uch Temp;

    TRISD = 0x00;
    TRISA1 = 0;
    TRISA2 = 0;
    TRISA3 = 0;

    writeCommand(0x0f);
    writeCommand(0x38); //set to two line mode
    clearDisplay();

    writeString("MAIN MENU");
    Temp = get_temp();
    writeString(Temp);
    writeCommand(0xC0); //change cursor line

}

它在 "MAIN MENU" 之后没有打印任何东西,这显然意味着我做错了什么。我可以根据要求提供更多 clarification/code。

我应该提一下,我不仅仅是在寻找 "paste this in and it'll work" 的答案。非常感谢任何我理解我的错误以及如何解决它的反馈。

提前致谢!

编辑:

有些人问我的写作功能,所以为了进一步说明,我将它们粘贴在这里:

void writeChar(unsigned char ch)
{
    lcd = ch;
    RS = 1;
    RW =0;
    E = 1;
    lcdDelay();
    E=0;
}

void writeString(char *stringToLcd)
{
    while(*stringToLcd > 0)
    {
        writeChar(*stringToLcd++);
    }
}

Temp 是一个 unsigned char

uch Temp;
//...
Temp = get_temp();
writeString(Temp);

因此,使用 writeString() 将产生未定义的结果。

您应该改用 write()(取决于您使用的库)。

但您可能想先将 get_temp() 的 return 值转换为 ASCII 字符串,然后使用 writeString().

显示它

更新:

void writeString(char *stringToLcd)

此函数需要 char*,因此您无法提供单个 uch

您需要先将Temp转换为字符串,例如使用itoa()

我可以建议你实现一个新功能

void writeUCH(uch value)
{
    unsigned char test = (value >= 100) ? 100 : (value >= 10) ? 10 : 1;

    while(test > 0)
    {
        writeChar((value/test)+'0');

        value = value%test;
        test /= 10;
    }
}

这一行:

TZ/100;

不会导致 TZ 发生任何变化

你真正想要的是:

TZ = TZ%100;

get_temp() 返回的值是一个整数,而不是 ascii 字符串。我希望 LCD 需要 ascii 字符,而不是 int 变量字节的二进制值。