'**************************************************************** '* Name : Nokia LCD Termometar * '* Author : * '* Notice : Big font version, negative temp fix * '* : * '* Date : 17.02.2012 * '* Version : 2.0 * '* Notes : Pic12F683 , Nokia3310 Lcd & DS18B20 * '* e-mail : * '* url : * '**************************************************************** Define NO_CLRWDT 1 D_C var GPIO.0 rst var GPIO.1 DQ var GPIO.2 Mode var GPIO.3 SDIN var GPIO.4 SCK var GPIO.5 temp1 Var Word temp2 var word count_remain Var Byte count_per_c Var Byte TempH var byte TempL var byte Bit_ var byte 'bit Segno var Bit_.0 'segno Scala var byte[4] Minus var Byte fract var byte LcdReg var byte x var byte y var byte z var byte Offset var byte Char var byte a var byte colonna VAR BYTE '------------------------------------------------------------------------------- CMCON0 = 7 ANSEL=0 'digital IO " solo per il 12F675 " TrisIO = 0 GPIO = 0 '------------------------------------------------------------------------------- DATA @0,$FC,$FE,$07,$03,$07,$FE,$FC,_ ';// 0 \ $00,$00,$04,$FF,$FF,$00,$00,_ ';// 1 | $0C,$0E,$87,$C3,$E7,$7E,$3C,_ ';// 2 | $0C,$0E,$07,$43,$E7,$FE,$BC,_ ';// 3 | $C0,$F0,$3C,$FF,$FF,$00,$00,_ ';// 4 | $3F,$3F,$33,$33,$73,$E3,$C3,_ ';// 5 | $F8,$FC,$EE,$67,$E3,$C3,$80,_ ';// 6 > metà alta $03,$03,$83,$E3,$FB,$3F,$0F,_ ';// 7 | $BC,$FE,$F7,$63,$F7,$FE,$BC ';// 8 | DATA @63,$3C,$7E,$E7,$C3,$E7,$FE,$FC,_ ';// 9 | $00,$C0,$C0,$F0,$F0,$C0,$C0,_ ';// + | $00,$C0,$C0,$C0,$C0,$C0,$C0,_ ';// - / $00,$00,$00,$00,$00,$00,$00,_ ';// . \ $07,$0F,$1C,$18,$1C,$0F,$07,_ ';// 0 | $00,$00,$18,$1F,$1F,$18,$00,_ ';// 1 | $1E,$1F,$1B,$19,$18,$18,$18,_ ';// 2 | $06,$0E,$1C,$18,$1C,$0F,$07,_ ';// 3 | $07,$07,$06,$06,$1F,$1F,$06,_ ';// 4 | $06,$0E,$1C,$18,$1C,$0F,$07,_ ';// 5 | $07,$0F,$1C,$18,$1C,$0F,$07,_ ';// 6 > metà bassa $00,$00,$1F,$1F,$00,$00,$00,_ ';// 7 | $07,$0F,$1C,$18,$1C,$0F,$07,_ ';// 8 | $00,$18,$18,$1C,$0E,$07,$03,_ ';// 9 | $00,$00,$00,$03,$03,$00,$00,_ ';// + | $00,$00,$00,$00,$00,$00,$00,_ ';// - | $18,$18,$00,$00,$00,$00,$00 ';// . / data @182,$FF,$01,$01,$E1,$11,$09,$89,$49,$49,$89,$09,$09,$09,$89,$49,$49,_ 'prima parte dell'immagine $89,$09,$11,$E1,$01,$19,$19,$19,$F9,$F9,$F9,$19,$19,$19,$81,$C1,_ $E1,$21,$E1,$E1,$C1,$01,$E1,$E1,$E1,$41,$E1,$E1,$C1,$61,$E1,$E1,_ $C1,$01,$E1,$E1,$E1,$41,$E1,$E1,$C1,$01,$01,$01,$01,$01,$01 '------------------------------------------------------------------------------- RST = 0 nap 1 RST = 1 LcdReg = %00100001 'LCD Extended Commands. call PrintCtrlLcd LcdReg = %10101001 'Set LCD Vop (Contrast). call PrintCtrlLcd LcdReg = %00000110 'Set Temp coefficent. call PrintCtrlLcd LcdReg = %00010011 'LCD bias mode 1:48. call PrintCtrlLcd LcdReg = %00100000 'LCD Standard Commands, Horizontal addressing mode. call PrintCtrlLcd call CursorHome Call TableTemp Main: LcdReg = %00001100 'LCD in normal mode. - dipende dalla posizione dei ponticelli if Mode = 1 then LcdReg = %00001101 'LCD in inverse mode. call PrintCtrlLcd OWOut DQ, 1, [$CC, $BE] ' Lettura temperatura da DS1820 OWIn DQ, 0, [temp1, temp2, Skip 4, count_remain, count_per_c] Segno = 0 Temp1 = temp1 >> 1 '-----------------calcolo decimali------------------------ fract = 28 - count_remain if fract > 15 then fract = fract - 16 else temp1 = Temp1 - 1 endif fract = fract * 10 fract = fract / 16 if temp2 = $ff then ' se temp. negativa segno = 1 ' segno - temp1 = temp1 ^ $7f ' complement if fract > 0 then fract = 10 - fract else Temp1 = Temp1 + 1 endif endif if temp1= $ff then Segno = 1 temp1=0 fract = 10-fract endif '------------------------fine------------------------ OWOut DQ, 1, [$CC, $44] ' inizio conversione temperatura ( 12 bit.- durata circa 700ms ) LcdReg = %10000000 + 12 ' cursore a colonna 12 call PrintCtrlLcd LcdReg = %01000011 ' cursore a riga 3 call PrintCtrlLcd if Temp1 > 99 then ' se temp. maggiore di 99'C, visualizza "1" colonna = 7 Char = 1 ' centunaia call PrintChar else COLONNA = 7 Char = 10 ' + più if Segno = 1 then Char = 11 ' - meno call PrintChar endif Char = (temp1 dig 1) ' decine colonna = 15 call PrintChar Char = (temp1 dig 0) ' unità colonna = 23 call PrintChar colonna = 31 Char = 12 ' punto call PrintChar colonna = 36 Char = (fract dig 0) ' decimale Call PrintChar call ScalaNegativa ' se la temperatura è negativa, disegna scala negativa scala[0] = $ff scala[1] = $ff scala[2] = $ff scala[3] = $ff if temp1 > 32 then goto PrintScala temp1 = 32 - temp1 for y = 1 to temp1 scala[0] = scala[0] << 1 next y for y = 9 to temp1 scala[1] = scala[1] << 1 next y for y = 17 to temp1 scala[2] = scala[2] << 1 next y for y = 25 to temp1 scala[3] = scala[3] << 1 next y PrintScala: for y = 0 to 3 call SetCursor LcdReg = scala[y] call PrintDataLcd next y nap 6 ' sleep 1,152 sec. Goto main SetCursor: LcdReg = %10000000 + 76 ' cursor X call PrintCtrlLcd LcdReg = %01000001 + y ' cursor Y call PrintCtrlLcd return '------------------------------------------------------------------------------- ScalaNegativa: minus = 0 if Segno = 1 then Minus = $04 LcdReg = %10000000 + 61 ' cursor X call PrintCtrlLcd LcdReg = %01000000 + 3 ' cursor Y meno 10 call PrintCtrlLcd LcdReg = Minus call PrintDataLcd LcdReg = Minus call PrintDataLcd if Segno = 1 then Minus = $01 LcdReg = %10000000 + 61 ' cursor X meno 20 call PrintCtrlLcd LcdReg = %01000000 + 2 ' cursor Y call PrintCtrlLcd LcdReg = Minus call PrintDataLcd LcdReg = Minus call PrintDataLcd Minus = $01 if Segno = 1 then Minus = $41 LcdReg = %10000000 + 61 ' cursor X meno 30 call PrintCtrlLcd LcdReg = %01000000 + 0 ' cursor Y call PrintCtrlLcd LcdReg = Minus call PrintDataLcd LcdReg = Minus call PrintDataLcd return '------------------------------------------------------------------------------- CursorHome: LcdReg = %10000000 ' cursor Home call PrintCtrlLcd LcdReg = %01000000 ' cursor Home call PrintCtrlLcd return PrintChar: offset = Char * 7 LcdReg = %01000011 ' riga 3 call PrintCtrlLcd LcdReg = %10000000 + colonna ' COLONNA call PrintCtrlLcd for a = 1 to 7 read offset, LcdReg call PrintDataLcd offset = offset + 1 next a LcdReg = 0 call PrintDataLcd LcdReg = %01000100 ' riga 4 call PrintCtrlLcd LcdReg = %10000000 + colonna ' colonna 63 meno 30 call PrintCtrlLcd offset = Char * 7 + 91 for a = 1 to 7 read offset, LcdReg call PrintDataLcd offset = offset + 1 next a LcdReg = 0 call PrintDataLcd return TableTemp: for y = 182 to 244 read y, LcdReg call PrintDataLcd next y for y = 0 to 194 ' seconda parte dell'immagine LOokup y, [$01,$A1,$11,$51,$A1,$01,$E1,$11,$11,$E1,$01,$81,$41,$41,$41,$81,$01,_ $01,$01,$01,$FF,$FF,$00,$00,$FF,$00,$40,$58,$54,$52,$51,$40,$50,_ $40,$4F,$50,$50,$4F,$40,$80,$FF,$00,$00,$00,$00,$0F,$0F,$0F,$00,_ $00,$00,$03,$07,$0F,$0D,$0D,$0D,$05,$00,$0F,$0F,$0F,$00,$0F,$0F,_ $0F,$00,$0F,$0F,$0F,$00,$3F,$3F,$3F,$04,$0F,$0F,$07,$00,$0C,$0C,_ $00,$00,$00,$04,$84,$45,$45,$84,$04,$84,$45,$45,$84,$00,$FF,$00,_ $00,$00,$FF,$00,$84,$04,$00,$FF,$FF,$00,$00,$00,$E1,$F2,$12,$12,_ $12,$12,$12,$12,$12,$12,$12,$12,$12,$13,$13,$13,$10,$10,$08,$04,_ $02,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,_ $01,$01,$01,$01,$01,$01,$81,$81,$81,$01,$01,$01,$01,$01,$01,$01,_ $01,$01,$01,$FE,$00,$00,$00,$10,$14,$16,$15,$14,$10,$13,$14,$14,_ $13,$00,$FF,$00,$00,$00,$FF,$00,$10,$10,$00,$FF,$FF,$00,$00,$00,_ $FF,$FF] ,LcdReg call PrintDataLcd next y LcdReg = 0 for y = 1 to 40 call PrintDataLcd next y for y = 0 to 205 ' terza parte dell'immagine LOokup y, [$03,$02,$03,$00,$00,$3E,_ $41,$41,$41,$23,$00,$00,$00,$FF,$00,$00,$00,$40,$40,$41,$5F,$40,_ $40,$4E,$51,$51,$4E,$00,$FF,$00,$00,$00,$FF,$00,$42,$40,$00,$FF,_ $FF,$00,$00,$00,$FF,$FF,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,_ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,_ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,_ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FF,$00,$00,$00,$00,_ $00,$00,$00,$00,$00,$38,$44,$44,$38,$00,$FF,$00,$00,$00,$FF,$00,_ $08,$00,$00,$FF,$FF,$80,$80,$80,$83,$83,$83,$83,$83,$83,$83,$83,_ $83,$83,$83,$83,$83,$83,$83,$83,$83,$83,$83,$83,$83,$83,$83,$83,_ $83,$83,$83,$83,$83,$83,$83,$83,$83,$83,$83,$83,$83,$83,$83,$83,_ $83,$83,$83,$83,$83,$83,$83,$83,$83,$83,$83,$83,$83,$83,$83,$81,_ $80,$80,$80,$81,$81,$81,$81,$81,$81,$81,$81,$81,$81,$9E,$BF,$BF,_ $BF,$BF,$BF,$9E,$81,$81,$80,$FF] ,LcdReg call PrintDataLcd next y return PrintCtrlLcd: D_C = 0 PrintDataLcd: for x = 1 to 8 ' visualizza su lcd SDIN = LcdReg.7 LcdReg = LcdReg << 1 SCK = 1 SCK = 0 next x D_C = 1 return end