Невозможно извлечь целое число из чтения байта термометра

Днем все,

Извините, если этот вопрос имеет неправильный формат или не в том месте, если это так, пожалуйста, пометьте, и я изменю его или перенесу в другое место.

Я использую плату разработки для отправки показаний температуры на жидкокристаллическую панель, и я действительно изо всех сил пытаюсь понять, почему температура в момент запуска программы не печатается на моем ЖК-дисплее. Большая часть кода взята из данных мне фреймворков и, насколько я могу судить, верна.

Мой вопрос про эти функции:

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;
}

Я изменил эту функцию так, чтобы она возвращала целочисленную температуру (беззнаковый символ 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

}

После "ГЛАВНОГО МЕНЮ" ничего не печатается, что, очевидно, означает, что я делаю что-то не так. Я могу предоставить дополнительные разъяснения / код по запросу.

Вероятно, я должен упомянуть, что я не просто ищу ответ "вставьте это, и это сработает". Любая обратная связь, в которой я понимаю свою ошибку и как ее исправить, очень ценится.

Заранее спасибо!

РЕДАКТИРОВАТЬ:

Несколько человек спрашивают о моих функциях письма, поэтому для дальнейшего разъяснения я вставлю их здесь:

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++);
    }
}

3 ответа

Решение

Temp является unsigned char

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

Итак, используя writeString() будет давать неопределенные результаты.

Вы должны использовать write() вместо этого (в зависимости от используемой вами библиотеки).

Но вы, вероятно, хотите преобразовать возвращаемое значение get_temp() сначала в строку 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. Я ожидаю, что на ЖК-дисплее нужны символы ascii, а не двоичное значение байтов int переменная.

Другие вопросы по тегам