Code:
DQ var portd.7
count_remain var byte
R_Temp VAR WORD ' RAW Temperature readings
TempC VAR WORD ' Temp in deg C
Float VAR WORD ' Holds remainder for + temp C display
Cold_Bit VAR R_Temp.Bit11' Sign-Bit for +/- Temp. 1 = Below 0 deg C
Real_Cold CON 1 ' Define Real_Cold = 1
Deg CON 223 ' Data to display Deg ° symbol
Sign VAR BYTE ' +/- sign for temp display
Dummy VAR BYTE ' Dummy for Div32
lcdout $fe,1
OWOut DQ, 1, [$CC,$4E, $00,$00,$3F] ;set DS18B20 at 10bit
main11: OWOut DQ, 1, [$CC, $44] ' Start temperature conversion
waitloop: OWIn DQ, 4, [count_remain] ' Check for still busy converting
IF count_remain = 0 Then waitloop
OWOut DQ, 1, [$CC, $BE] ' Read the temperature
OWIn DQ, 2, [R_temp.LOWBYTE, R_temp.HIGHBYTE]', Skip 4, count_remain, count_per_c]
gosub convert_temp
goto main11
Convert_Temp: ' +32.0 to +257 F
IF Cold_Bit = Real_Cold THEN Yikes ' If Cold_Bit = 1, it's below "0" deg C
Sign = "+"
Dummy = 625 * R_Temp ' Multiply to load internal registers with 32-bit value
TempC = DIV32 10 ' Use Div32 value to calculate precise deg C
Dummy = 1125 * R_Temp
TempC = (R_Temp & $0FF0) >> 4 ' Mask middle 8-bits, shift into lower byte
Float = ((R_Temp.Lowbyte & $0F) * 625)/100 ' Lower 4-bits of result * 625
lcdout $fe,$80, " TempC = ",Sign,DEC TempC,".",DEC2 Float,Deg,"C "
lcdout $fe,$C0, "Raw", IBIN16 R_Temp
RETURN
Yikes: ' Display full range -C to -F conversion
Sign = "-" ' Display - symbol for negative temp
Dummy = 625 * ~R_Temp+1' Multiply to load internal registers with 32-bit value
TempC = DIV32 10 ' Use Div32 value to calculate precise deg C
lcdout $fe,$80, " TempC = ",Sign,DEC TempC DIG 4,DEC TempC DIG 3,".",DEC TempC,Deg,"C "
RETURN
END
Bookmarks