Code and schematic for the LCD thermometer built with PICAXE 28X1.

Click on the schematic to get big picture, or click here for the pdf.
To copy the code, hover over the code and you’ll see four icons on top right. First icon opens new window with the code only, second icon copies the code to the clipboard, third icon prints the code (be careful with that, prints more than 5 pages, so don’t kill the trees).
; =================================================================
; filename: lcd-temp-0.7.bas
; description: Measures the temperature with DS18B20 temp. sensor
; and shows on the 2x16 char LCD display,
; also sends to the serial terminal, and
; checks against the limits and sets the output accordingly:
; high if temp. is lower then higher limit,
; low if temp. is higher then lower limit.
; Confusing, eh? Not really!
; =================================================================
; 16-bit measured temperature
; 16-bit lower temp. limit
; 16-bit higher temp. limit
; status of the output pin
eeprom 0,("GPtronics 2010Thermometer")
decimal part of the temp reading
; two decimal digits rounding
; eeprom 32,("00061219253137445056626975818794")
; four decimal digits - not rounded
eeprom 32,("0000062512501875250031253750437550005625625068757500812587509375")
; =================================================================
main: ; executed at the beginning
gosub taketemp ; first measuring to determine initial status of the output relay
gosub lcdinit ; initialization of the lcd display
gosub hello ; greeting message - just for fun :)
gosub taketemp ; temperature measuring
gosub checklimits ; checks measured temp. against limits and sets output accordingly
gosub sendtemp ; sends data to rs-232
gosub showtemp ; converts numbers and shows them on lcd
; =================================================================
TLhi = 22 ; lower temperature limit
THhi = 24 ; higher temperature limit
if temp12 <= TH then : gosub ledon : else : gosub ledoff : endif
; =================================================================
; =================================================================
; =================================================================
; =================================================================
; =================================================================
sertxd("Temp= ",#temp12hi," and ",#temp12lo,"/16 C",13,10)
sertxd("TH= ",#THhi," and ",#THlo,"/16 C",13,10)
sertxd("TL= ",#TLhi," and ",#TLlo,"/16 C",13,10)
sertxd("Temp= ",#temp12,13,10)
; =================================================================
if lcdchar = 0 then leadzero
position = temp12lo * 4 + 32 + counter
; =================================================================
if LED = 1 and temp12 > TH then gosub ledoff
if LED = 0 and temp12 < TL then gosub ledon
; =================================================================
; =================================================================
; =================================================================
; author: Goran Poprzen
; filename: lcd-temp-0.7.bas
; target: picaxe28x1
; date: Jan 5, 2009
; version: 0.7
; description: Measures the temperature with DS18B20 temp. sensor
; and shows on the 2x16 char LCD display,
; also sends to the serial terminal, and
; checks against the limits and sets the output accordingly:
; high if temp. is lower then higher limit,
; low if temp. is higher then lower limit.
; Confusing, eh? Not really!
; =================================================================
; picaxe28x1 variables
; bit0-31, b0-27, w0-13
; variables used here:
symbol lcdchar = b4
symbol lcdtmp = b5
symbol counter = b6
symbol position = b7
symbol tenths = b8
symbol ones = b9
; 16-bit measured temperature
symbol temp12 = w5
symbol temp12lo = b10
symbol temp12hi = b11
; 16-bit lower temp. limit
symbol TL = w6
symbol TLlo = b12
symbol TLhi = b13
; 16-bit higher temp. limit
symbol TH = w7
symbol THlo = b14
symbol THhi = b15
; status of the output pin
symbol LED = bit0
; greetings message
eeprom 0,("GPtronics 2010Thermometer")
#rem
here is the table for
decimal part of the temp reading
0 / 16 = 0.0000 ==> 00
1 / 16 = 0.0625 ==> 06
2 / 16 = 0.1250 ==> 12
3 / 16 = 0.1875 ==> 19
4 / 16 = 0.2500 ==> 25
5 / 16 = 0.3125 ==> 31
6 / 16 = 0.3750 ==> 37
7 / 16 = 0.4375 ==> 44
8 / 16 = 0.5000 ==> 50
9 / 16 = 0.5625 ==> 56
10 / 16 = 0.6250 ==> 62
11 / 16 = 0.6875 ==> 69
12 / 16 = 0.7500 ==> 75
13 / 16 = 0.8125 ==> 81
14 / 16 = 0.8750 ==> 87
15 / 16 = 0.9375 ==> 94
#endrem
; two decimal digits rounding
; eeprom 32,("00061219253137445056626975818794")
; four decimal digits - not rounded
eeprom 32,("0000062512501875250031253750437550005625625068757500812587509375")
; =================================================================
main: ; executed at the beginning
gosub taketemp ; first measuring to determine initial status of the output relay
gosub init
gosub lcdinit ; initialization of the lcd display
gosub hello ; greeting message - just for fun :)
main2: ; loop
gosub taketemp ; temperature measuring
gosub checklimits ; checks measured temp. against limits and sets output accordingly
gosub sendtemp ; sends data to rs-232
gosub showtemp ; converts numbers and shows them on lcd
goto main2 ; loop again
; =================================================================
init:
counter = 0
TLhi = 22 ; lower temperature limit
TLlo = 0
THhi = 24 ; higher temperature limit
THlo = 0
if temp12 <= TH then : gosub ledon : else : gosub ledoff : endif
return
; =================================================================
lcdinit:
pins = 0
pause 200
pins = 48
gosub pulsing
gosub pulsing
gosub pulsing
pins = 32
gosub pulsing
gosub pulsing
pins = 128
gosub pulsing
lcdchar = 14
gosub wrins
lcdchar = 12
gosub wrins
return
pulsing:
pulsout 3,3
pause 10
return
; =================================================================
wrchr:
pins = lcdchar & 240
high 2
pulsout 3,1
lcdtmp = lcdchar * 16
pins = lcdtmp & 240
high 2
pulsout 3,1
return
wrins:
pins = lcdchar & 240
pulsout 3,1
lcdtmp = lcdchar *16
pins = lcdtmp & 240
pulsout 3,1
high 2
return
; =================================================================
hello:
lcdchar = 1
gosub wrins
lcdchar = 12
gosub wrins
for counter = 0 to 13
read counter, lcdchar
gosub wrchr
next counter
lcdchar = 192
gosub wrins
for counter = 14 to 24
read counter, lcdchar
gosub wrchr
next counter
pause 1000
lcdchar = 1
gosub wrins
return
; =================================================================
taketemp:
readtemp12 7, temp12
temp12 = temp12 * 16
temp12lo = temp12lo / 16
return
; =================================================================
sendtemp:
#rem
sertxd("Temp= ",#temp12hi," and ",#temp12lo,"/16 C",13,10)
sertxd("TH= ",#THhi," and ",#THlo,"/16 C",13,10)
sertxd("TL= ",#TLhi," and ",#TLlo,"/16 C",13,10)
return
#endrem
sertxd("Temp= ",#temp12,13,10)
sertxd("TH= ",#TH,13,10)
sertxd("TL= ",#TL,13,10)
return
; =================================================================
showtemp:
lcdchar = 2
gosub wrins
lcdchar = temp12hi / 100
if lcdchar = 0 then leadzero
lcdchar = lcdchar + 48
goto nonleadzero
leadzero:
lcdchar = lcdchar + 32
nonleadzero:
tenths = temp12hi // 100
gosub wrchr ; write 100s
lcdchar = tenths / 10
lcdchar = lcdchar + 48
ones = tenths // 10
gosub wrchr ; write 10s
lcdchar = ones
lcdchar = lcdchar + 48
gosub wrchr ; write 1s
lcdchar = "."
gosub wrchr
for counter = 0 to 3
position = temp12lo * 4 + 32 + counter
read position, lcdchar
gosub wrchr
next counter
lcdchar = 178
gosub wrchr
lcdchar = "C"
gosub wrchr
return
; =================================================================
checklimits:
if LED = 1 and temp12 > TH then gosub ledoff
if LED = 0 and temp12 < TL then gosub ledon
return
; =================================================================
ledoff:
low portc 1
LED = 0
return
ledon:
high portc 1
LED = 1
return
; =================================================================
[/sourcecode]
; =================================================================
; author: Goran Poprzen
; filename: lcd-temp-0.7.bas
; target: picaxe28x1
; date: Jan 5, 2009
; version: 0.7
; description: Measures the temperature with DS18B20 temp. sensor
; and shows on the 2x16 char LCD display,
; also sends to the serial terminal, and
; checks against the limits and sets the output accordingly:
; high if temp. is lower then higher limit,
; low if temp. is higher then lower limit.
; Confusing, eh? Not really!
; =================================================================
; picaxe28x1 variables
; bit0-31, b0-27, w0-13
; variables used here:
symbol lcdchar = b4
symbol lcdtmp = b5
symbol counter = b6
symbol position = b7
symbol tenths = b8
symbol ones = b9
; 16-bit measured temperature
symbol temp12 = w5
symbol temp12lo = b10
symbol temp12hi = b11
; 16-bit lower temp. limit
symbol TL = w6
symbol TLlo = b12
symbol TLhi = b13
; 16-bit higher temp. limit
symbol TH = w7
symbol THlo = b14
symbol THhi = b15
; status of the output pin
symbol LED = bit0
; greetings message
eeprom 0,("GPtronics 2010Thermometer")
#rem
here is the table for
decimal part of the temp reading
0 / 16 = 0.0000 ==> 00
1 / 16 = 0.0625 ==> 06
2 / 16 = 0.1250 ==> 12
3 / 16 = 0.1875 ==> 19
4 / 16 = 0.2500 ==> 25
5 / 16 = 0.3125 ==> 31
6 / 16 = 0.3750 ==> 37
7 / 16 = 0.4375 ==> 44
8 / 16 = 0.5000 ==> 50
9 / 16 = 0.5625 ==> 56
10 / 16 = 0.6250 ==> 62
11 / 16 = 0.6875 ==> 69
12 / 16 = 0.7500 ==> 75
13 / 16 = 0.8125 ==> 81
14 / 16 = 0.8750 ==> 87
15 / 16 = 0.9375 ==> 94
#endrem
; two decimal digits rounding
; eeprom 32,("00061219253137445056626975818794")
; four decimal digits - not rounded
eeprom 32,("0000062512501875250031253750437550005625625068757500812587509375")
; =================================================================
main: ; executed at the beginning
gosub taketemp ; first measuring to determine initial status of the output relay
gosub init
gosub lcdinit ; initialization of the lcd display
gosub hello ; greeting message - just for fun :)
main2: ; loop
gosub taketemp ; temperature measuring
gosub checklimits ; checks measured temp. against limits and sets output accordingly
gosub sendtemp ; sends data to rs-232
gosub showtemp ; converts numbers and shows them on lcd
goto main2 ; loop again
; =================================================================
init:
counter = 0
TLhi = 22 ; lower temperature limit
TLlo = 0
THhi = 24 ; higher temperature limit
THlo = 0
if temp12 <= TH then : gosub ledon : else : gosub ledoff : endif
return
; =================================================================
lcdinit:
pins = 0
pause 200
pins = 48
gosub pulsing
gosub pulsing
gosub pulsing
pins = 32
gosub pulsing
gosub pulsing
pins = 128
gosub pulsing
lcdchar = 14
gosub wrins
lcdchar = 12
gosub wrins
return
pulsing:
pulsout 3,3
pause 10
return
; =================================================================
wrchr:
pins = lcdchar & 240
high 2
pulsout 3,1
lcdtmp = lcdchar * 16
pins = lcdtmp & 240
high 2
pulsout 3,1
return
wrins:
pins = lcdchar & 240
pulsout 3,1
lcdtmp = lcdchar *16
pins = lcdtmp & 240
pulsout 3,1
high 2
return
; =================================================================
hello:
lcdchar = 1
gosub wrins
lcdchar = 12
gosub wrins
for counter = 0 to 13
read counter, lcdchar
gosub wrchr
next counter
lcdchar = 192
gosub wrins
for counter = 14 to 24
read counter, lcdchar
gosub wrchr
next counter
pause 1000
lcdchar = 1
gosub wrins
return
; =================================================================
taketemp:
readtemp12 7, temp12
temp12 = temp12 * 16
temp12lo = temp12lo / 16
return
; =================================================================
sendtemp:
#rem
sertxd("Temp= ",#temp12hi," and ",#temp12lo,"/16 C",13,10)
sertxd("TH= ",#THhi," and ",#THlo,"/16 C",13,10)
sertxd("TL= ",#TLhi," and ",#TLlo,"/16 C",13,10)
return
#endrem
sertxd("Temp= ",#temp12,13,10)
sertxd("TH= ",#TH,13,10)
sertxd("TL= ",#TL,13,10)
return
; =================================================================
showtemp:
lcdchar = 2
gosub wrins
lcdchar = temp12hi / 100
if lcdchar = 0 then leadzero
lcdchar = lcdchar + 48
goto nonleadzero
leadzero:
lcdchar = lcdchar + 32
nonleadzero:
tenths = temp12hi // 100
gosub wrchr ; write 100s
lcdchar = tenths / 10
lcdchar = lcdchar + 48
ones = tenths // 10
gosub wrchr ; write 10s
lcdchar = ones
lcdchar = lcdchar + 48
gosub wrchr ; write 1s
lcdchar = "."
gosub wrchr
for counter = 0 to 3
position = temp12lo * 4 + 32 + counter
read position, lcdchar
gosub wrchr
next counter
lcdchar = 178
gosub wrchr
lcdchar = "C"
gosub wrchr
return
; =================================================================
checklimits:
if LED = 1 and temp12 > TH then gosub ledoff
if LED = 0 and temp12 < TL then gosub ledon
return
; =================================================================
ledoff:
low portc 1
LED = 0
return
ledon:
high portc 1
LED = 1
return
; =================================================================
[/sourcecode]
That’s it. In the next episode, I’ll break-up the code and try to explain each subroutine.