无法从温度计字节读数中提取整数
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
变量字节的二进制值。
大家下午好,
抱歉,如果这个问题格式错误或位置错误,如果是这种情况,请标记,我会更改它或转移到其他地方。
我正在使用开发板向 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
变量字节的二进制值。