Невозможно извлечь целое число из чтения байта термометра
Днем все,
Извините, если этот вопрос имеет неправильный формат или не в том месте, если это так, пожалуйста, пометьте, и я изменю его или перенесу в другое место.
Я использую плату разработки для отправки показаний температуры на жидкокристаллическую панель, и я действительно изо всех сил пытаюсь понять, почему температура в момент запуска программы не печатается на моем ЖК-дисплее. Большая часть кода взята из данных мне фреймворков и, насколько я могу судить, верна.
Мой вопрос про эти функции:
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
переменная.