Code:
Define LCD_DREG PORTD
Define LCD_DBIT 4
Define LCD_RSREG PORTE
Define LCD_RSBIT 0
Define LCD_EREG PORTE
Define LCD_EBIT 1
ADCON1 = 7 ' Set PORTD and PORTE to digital
Setpoint var word
delay VAR Byte 'Button working variable
Temp_Down Var PortB.3 'Temp down button input port
Temp_Up VAR PortB.2 'Temp up button input port
R_LED VAR PortB.0 ' Red LED output
G_LED VAR PortB.1 ' Green LED output
DQ VAR PortC.0 ' One-wire Data-Pin "DQ" on PortC.0
Busy VAR BIT ' Busy Status-Bit
Sign VAR BYTE ' +/- sign for temp display
Dummy VAR BYTE ' Dummy for Div32
R_Temp VAR WORD ' RAW Temperature readings
TempC VAR WORD ' Temp in deg C
TempF VAR WORD ' Temp in deg F
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
DS18B20_9bit CON %00011111 ' 93.75ms, 0.5°C
DS18B20_10bit CON %00111111 ' 187.5ms, 0.25°C <-- My favorite
DS18B20_11bit CON %01011111 ' 375ms, 0.125°C
DS18B20_12bit CON %01111111 ' 750ms, 0.0625°C (default)
OPTION_REG = $7f
OWOUT DQ, 1, [$CC, $4E, 0, 0, DS18B20_10bit] 'Skip ROM search and write 10bit resolution to scratch pad
LCDOut $FE 'Clear LCD
Setpoint = 20 'Default setpoint on start up
Start_Convert:
OWOUT DQ, 1, [$CC, $44] ' Skip ROM search & do temp conversion
delay = 0
Button Temp_Up, 0, 255, 0, delay, 1, Up_Loop
button Temp_Down, 0, 255, 0, delay, 1, Down_Loop
If TempC < Setpoint Then
high R_LED ' Turn on Red LED and turn off Green LED
low G_LED
Else
High G_LED ' Turn on Green LED and turn off Red LED
low R_LED
EndIf
Wait_Up:
OWIN DQ, 4, [Busy] ' Read busy-bit
IF Busy = 0 THEN Wait_Up ' Still busy..?, Wait_Up..!
OWOUT DQ, 1, [$CC, $BE] ' Skip ROM search & read scratchpad memory
OWIN DQ, 2, [R_Temp.Lowbyte, R_Temp.Highbyte]' Read two bytes / end comms
GOSUB Convert_Temp
GOTO Start_Convert
Convert_Temp: ' +32.0 to +257 F
'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
'TempF = DIV32 100
'IF TempF >6795 THEN ' Over 99.5 deg F..?
'TempF = TempF + 3200
'Lcdout $FE, 1,Sign,DEC TempF DIG 4,dec TempF Dig 3,dec TempF Dig 2,".",dec2 TempF," F"
'ELSE
'TempF = TempF + 3200
'lcdout $FE, 1,Sign,Dec TempF Dig 3,Dec TempF Dig 2,".",Dec2 TempF," F"
'ENDIF
TempC = (R_Temp & $0FF0) >> 4 ' Mask middle 8-bits, shift into lower byte
Float = ((R_Temp.Lowbyte & $0F) * 625) ' Lower 4-bits of result * 625
LCDOut $FE, 1,DEC TempC,".",dec Float," C"
lcdout $fe, $c0, "Setpoint = ", Setpoint
RETURN
Up_Loop:
If Temp_Up = 0 Then
Setpoint = Setpoint + 1
lcdout $fe, 1, "Setpoint = ", Setpoint
Pause 1000
Else
Goto Start_Convert
Endif
Goto Up_Loop
Down_Loop:
If Temp_Down = 0 Then
Setpoint = Setpoint - 1
lcdout $fe, 1, "Setpoint = ", Setpoint
Pause 1000
Else
Goto Start_Convert
Endif
Goto Down_Loop
END
Bookmarks