Hola....
Aquí termómetro con picaxe 18x, DS18B20, Nokia glcd 3310.
Les soy muy sincero, a veces me falla la simulación, pero creo que es por
la carga al cpu, (sobrecargado)....
Sr. Chavaquiah and Sr. Westaust55 me ayudaron mucho con esto.
Son dos ejemplos, con programación un tanto diferentes, pero mismo objetivo...
; Picaxe Forum member - Anobium
;
; http://www.picaxeforum.co.uk/showthread.php?t=10014
; initial version svn 1.02
;
; Set the number of GoSubs to 256 en el PicAxe Program Editor.
;
#picaxe 18x
' Display pin 1 Vcc+ 3.2v
SYMBOL SCLK = 0 '''Display pin 2 to PICAXE out 0 (junction 6)
SYMBOL SDA = 1 '''Display pin 3 to PICAXE out 5 (junction 7)
SYMBOL DC = 2 '''Display pin 4 to PICAXE out 2 (junction 8)
SYMBOL CS = 3 '''Display pin 5 to PICAXE out 3 (junction 9)
SYMBOL RES = 4 '''Display pin 8 to PICAXE out 6 (junction 10)
' Display pin 6 gnd
' Display pin 7 Cap to Gnd 4.7uf electrolic
SYMBOL value = b0
SYMBOL width = b1
SYMBOL pointer = b2
SYMBOL X = b4
SYMBOL Y = b5
SYMBOL blinkstatus = b3
SYMBOL eeprom_addr = b8
SYMBOL GraphicData = b9
SYMBOL Loop1 = b10
SYMBOL loop3 = b12
SYMBOL SDA_PIN = outpin1
'Pause 5000 '''
Main:
SETFREQ m8
GOSUB InitLCD
'''===================================================
; *****************************************************************
;Main body
REM ; Clear line 1
REM Y=0
REM GOSUB GotoXY
REM FOR pointer = 0 TO 20
REM LookUp pointer,(" "),value
REM GOSUB ValueToLCD
REM NEXT
; Display message
X=0
Y=1
GOSUB GotoXY
FOR pointer = 0 TO 14 '''Debe tener 15 caracteres
LookUp pointer,(" PICAXE THERMO "),value
GOSUB ValueToLCD
NEXT
; Some delay code
Pause 2000 '5000
X=0
Y=3
GOSUB GotoXY
FOR pointer = 0 TO 7
LookUp pointer,(" TEMP "),value
GOSUB ValueToLCD
NEXT
Repeat:
GoSub Postemps
GoTo Repeat
'''===============================================
Postemps:
Setfreq m4
pause 500
X = 42 '40
Y = 3 '4
GOSUB GotoXY
readtemp 0,b6
if b6 > 127 then Negtemps
sertxd("Temp is: ", #b6, " C", 13, 10)
Bintoascii b6, b11, b12, b13
if b6 > 99 then
Value = b11
GoSub ValueToLCD
endif
if b6 > 9 then
Value = b12
GoSub ValueToLCD
endif
Value = b13 '''More raight number
GoSub ValueToLCD
For pointer = 0 to 2
LookUp pointer,(" C "),value
GoSub ValueToLCD
Next
REM Value = " "
REM GoSub CharToLCD
REM Value = "C"
REM GoSub CharToLCD
'setfreq m8 ''''
Return
'''===============================================
Negtemps:
X = 42
Y = 3
GoSub GotoXY
let b6 = b6 - 128
'''Serial output via the serout programming pin (baud 4800, 8 data, no parity, 1 stop). Inverted
sertxd("Temp is: ", "-", #b6, " C" ,13, 10)
Value = "-"
GoSub ValueToLCD 'CharToLCD
Bintoascii b6, b11, b12, b13
if b6 > 99 then
Value = b11
GoSub ValueToLCD
endif
if b6 > 9 then
Value = b12
GoSub ValueToLCD
endif
Value = b13 '''
GoSub ValueToLCD
For pointer = 0 to 2
LookUp pointer,(" C "),value
GoSub ValueToLCD
Next
'setfreq m8 ''''
Return
; end of main body
; *****************************************************************
'''====================================================
fin:
SETFREQ m4
STOP
END
'''===============================================
; version 1.01
;==========================================
; SUBROUTINES - Do not change. Refer to author
;---------------------------------------------------------------------
InitLCD:
LOW SCLK
LOW SDA
LOW DC
LOW CS
LOW RES
PAUSE 50
HIGH RES
HIGH CS
Value=$21 ; $21 ==> H=1 and function set = chip active, horiz addressing & extended instruction set
GOSUB CommandToLCD ; transmit To serial LCD module
Value=$08 ; Set HV multiplier = x 2. For $09 = x3 set Vop at ~$C6 otherwise gives black screen
GOSUB CommandToLCD ; transmit To serial LCD module
Value=$F0 ; set Vop with (PRS = 0 Vlcd = 2.94V TO 6.75V) If HV multiplier = $08 then use ~$C6
; $E0=5.28V, $F0=6.3V, $FF = 6.72V NOTE max allowed is 9V
GOSUB CommandToLCD ; transmit To serial LCD module
Value=$16 ; set bias: $16 ==> n=1 FOR mux rate 1:18 or 1:16 NOTE: n = 2 and n=5 DO NOT work
GOSUB CommandToLCD ; transmit To serial LCD module
Value=$06 ; set temperature coefficient = 2
GOSUB CommandToLCD ; transmit To serial LCD module
Value=$20 ; $20 ==> H=0 and function set = FOR basic instruction set
GOSUB CommandToLCD ; transmit To serial LCD module
Value=$0C ; display config = display non-inverted
GOSUB CommandToLCD ; transmit To serial LCD module
GOSUB GoToHome
GOSUB ClearFast
GOSUB GoToHome
GOSUB Normal
RETURN
'''===============================================
Invert:
Value = 13 ; invert the display light chars on dark background
GOSUB CommandToLCD
RETURN
'''===============================================
Normal:
Value = 12
GOSUB CommandToLCD
RETURN
'''===============================================
Blank:
Value = 8
GOSUB CommandToLCD
RETURN
'''===============================================
Allon:
Value = 9
GOSUB CommandToLCD
RETURN
'''===============================================
GoToHome:
X = 0
Y = 0
GotoXY:
Value = X + 128 ; 128 part = X address command
GOSUB CommandToLCD
Value = Y + 64 ; 64 part = Y address command
GOSUB CommandToLCD
RETURN
'''===============================================
CommandToLCD:
low DC 'Command mode
DataMode1:
low CS
SDA_PIN = bit7
PulsOut SCLK,1
SDA_PIN = bit6
PulsOut SCLK,1
SDA_PIN = bit5
PulsOut SCLK,1
SDA_PIN = bit4
PulsOut SCLK,1
SDA_PIN = bit3
PulsOut SCLK,1
SDA_PIN = bit2
PulsOut SCLK,1
SDA_PIN = bit1
PulsOut SCLK,1
SDA_PIN = bit0
PulsOut SCLK,1
high CS
Return
'''===============================================
DataToLCD:
high DC 'Data mode
DataMode2:
low CS
SDA_PIN = bit7
PulsOut SCLK,1
SDA_PIN = bit6
PulsOut SCLK,1
SDA_PIN = bit5
PulsOut SCLK,1
SDA_PIN = bit4
PulsOut SCLK,1
SDA_PIN = bit3
PulsOut SCLK,1
SDA_PIN = bit2
PulsOut SCLK,1
SDA_PIN = bit1
PulsOut SCLK,1
SDA_PIN = bit0
PulsOut SCLK,1
high CS
return
;
'''===============================================
ValueToLCD:
eeprom_addr=0
IF Value>32 and Value <58 then
eeprom_addr=Value-33
eeprom_addr=eeprom_addr*5+130
ELSEIF Value>64 and Value <91 then
eeprom_addr=Value-65
eeprom_addr=eeprom_addr*5
ELSEIF Value=32 then
Value = 0
GOSUB DataToLCD
GOSUB DataToLCD
GOSUB DataToLCD
GOSUB DataToLCD
ENDIF
IF Value=0 then
RETURN
ENDIF
width = 4
read eeprom_addr, Value
IF value = 0 then ; found a narrow character
width = 2
inc eeprom_addr
ENDIF
FOR Loop1 = 0 TO width
read eeprom_addr, Value
inc eeprom_addr
GOSUB DataToLCD
NEXT Loop1
value = 0
GOSUB DataToLCD ; put a 1 bit space after each character for clarity
BaleOut: RETURN
'''===============================================
ClearFast:
Gosub Blank
low SDA
high DC
low CS
For Loop1 = 1 To 48
For loop3 = 1 To 84
low SCLK
high SCLK
Next loop3
Next Loop1
high CS
Gosub Normal
Return
'''===============================================
eeprom 0,(0x7E, 0x11, 0x11, 0x11, 0x7E) ;A
eeprom (0x7F, 0x49, 0x49, 0x49, 0x36) ; B
eeprom (0x3E, 0x41, 0x41, 0x41, 0x22) ; C
eeprom (0x7F, 0x41, 0x41, 0x22, 0x1C) ; D
eeprom (0x7F, 0x49, 0x49, 0x49, 0x41) ; E
eeprom (0x7F, 0x09, 0x09, 0x09, 0x01) ; F
eeprom (0x3E, 0x41, 0x49, 0x49, 0x7A) ; G
eeprom (0x7F, 0x08, 0x08, 0x08, 0x7F) ; H
eeprom (0x00, 0x41, 0x7F, 0x41, 0x00) ; I
eeprom (0x20, 0x40, 0x41, 0x3F, 0x01) ; J
eeprom (0x7F, 0x08, 0x14, 0x22, 0x41) ; K
eeprom (0x7F, 0x40, 0x40, 0x40, 0x40) ; L
eeprom (0x7F, 0x02, 0x0C, 0x02, 0x7F) ; M
eeprom (0x7F, 0x04, 0x08, 0x10, 0x7F) ; N
eeprom (0x3E, 0x41, 0x41, 0x41, 0x3E) ; O
eeprom (0x7F, 0x09, 0x09, 0x09, 0x06) ; P
eeprom (0x3E, 0x41, 0x51, 0x21, 0x5E) ; Q
eeprom (0x7F, 0x09, 0x19, 0x29, 0x46) ; R
eeprom (0x46, 0x49, 0x49, 0x49, 0x31) ; S
eeprom (0x01, 0x01, 0x7F, 0x01, 0x01) ; T
eeprom (0x3F, 0x40, 0x40, 0x40, 0x3F) ; U
eeprom (0x1F, 0x20, 0x40, 0x20, 0x1F) ; V
eeprom (0x3F, 0x40, 0x38, 0x40, 0x3F) ; W
eeprom (0x63, 0x14, 0x08, 0x14, 0x63) ; X
eeprom (0x07, 0x08, 0x70, 0x08, 0x07) ; Y
eeprom (0x61, 0x51, 0x49, 0x45, 0x43) ; Z
eeprom (0x00, 0x00, 0x2f, 0x00, 0x00) ; !
eeprom (0x00, 0x07, 0x00, 0x07, 0x00) ; "
eeprom (0x14, 0x7f, 0x14, 0x7f, 0x14) ; #
eeprom (0x24, 0x2a, 0x7f, 0x2a, 0x12) ; $
eeprom (0x23, 0x13, 0x08, 0x64, 0x62) ; % - THIS HAS BEEN FIXED HERE was back to front and too low
eeprom (0x36, 0x49, 0x55, 0x22, 0x50) ; &
eeprom (0x00, 0x05, 0x03, 0x00, 0x00) ; '
eeprom (0x00, 0x1c, 0x22, 0x41, 0x00) ; (
eeprom (0x00, 0x41, 0x22, 0x1c, 0x00) ; )
eeprom (0x14, 0x08, 0x3E, 0x08, 0x14) ; *
eeprom (0x08, 0x08, 0x3E, 0x08, 0x08) ; +
eeprom (0x00, 0x00, 0x50, 0x30, 0x00) ; ,
eeprom (0x08, 0x08, 0x08, 0x08, 0x08) ; - - raised 1 pixel (looks better)
eeprom (0x00, 0x60, 0x60, 0x00, 0x00) ; .
eeprom (0x20, 0x10, 0x08, 0x04, 0x02) ; /
eeprom (0x3E, 0x51, 0x49, 0x45, 0x3E) ; 0
eeprom (0x00, 0x42, 0x7F, 0x40, 0x00) ; 1
eeprom (0x42, 0x61, 0x51, 0x49, 0x46) ; 2
eeprom (0x21, 0x41, 0x45, 0x4B, 0x31) ; 3
eeprom (0x18, 0x14, 0x12, 0x7F, 0x10) ; 4
eeprom (0x27, 0x45, 0x45, 0x45, 0x39) ; 5
eeprom (0x3C, 0x4A, 0x49, 0x49, 0x30) ; 6
eeprom (0x01, 0x71, 0x09, 0x05, 0x03) ; 7
eeprom (0x36, 0x49, 0x49, 0x49, 0x36) ; 8
eeprom (0x06, 0x49, 0x49, 0x29, 0x1E) ; 9
Segundo Ejemplo
; Nokia LCD driver
'''Modified Tue 01 07 08, from Texy's original code 18X
'''Eclectic modified to 28x1
'''Me modified to 18X Nov/07/10
#picaxe 18X
symbol SCLK = 0 '''Display pin 2 to PICAXE out 0
symbol SDA = 1 '''Display pin 3 to PICAXE out 1
symbol DC = 2 '''Display pin 4 to PICAXE out 2
symbol CS = 3 '''Display pin 5 to PICAXE out 3
symbol RES = 4 '''Display pin 8 to PICAXE out 4
symbol Value = b0
symbol X = b3
symbol Y = b4
symbol eeprom_address = b5
symbol Loop1 = b10
symbol Loop3 = b11 'b12
symbol SDA_PIN = outpin1 '''outpin5 ************
'''====================================================
''' **** INICIALIZACION ****
'''====================================================
setfreq m8 '''' or em16 is even better!
GoSub InitLCD
'''====================================================
''' **** PROGRAMA PRINCIPAL ****
'''====================================================
X = 0
Y = 0
GoSub GotoXY
for b12 = 0 to 18 'b13
lookup b12,(" PICAXE ") ,b13
Value=b13
gosub CharToLCD
next b12
X = 0
Y = 2
GoSub GotoXY
for b12 = 0 to 9
lookup b12,(" TEMP * ") ,b13
Value=b13
gosub CharToLCD
next b12
Repeat:
GoSub Postemps
GoTo Repeat
'''====================================================
'GoSub Invert **********
'GoSub Normal ************
setfreq m4
End
'''===============================================
''' Read DS18B20 with readtemp command.
'''===============================================
Postemps:
Setfreq m4
Pause 500
X = 42
Y = 3
GoSub GotoXY
''''*** w3 = b7 : b6
readtemp 0,b6
'''Serial output via the serout programming pin (baud 4800, 8 data, no parity, 1 stop). Inverted
If b6 > 128 then Negtemps '''
sertxd("Temp is: ", #b6, " C", 13, 10)
Bintoascii b6, b11, b12, b13
if b6 > 99 then
Value = b11
GoSub CharToLCD
endif
if b6 > 9 then
Value = b12
GoSub CharToLCD
endif
Value = b13 '''More raight number
for b12 = 0 to 2 'b13
lookup b12,(" C ") ,b13
Value=b13
gosub CharToLCD
next b12
REM Value = " "
REM GoSub CharToLCD
REM Value = "C"
REM GoSub CharToLCD
'setfreq m8 '''' Me da un error en la escritura de negativos pero con el gosub del If b6 > 128 then gosub
Return
'''===============================================
Negtemps:
X = 42
Y = 3
GoSub GotoXY
let b6 = b6 - 128
'''Serial output via the serout programming pin (baud 4800, 8 data, no parity, 1 stop). Inverted
sertxd("Temp is: ", "-", #b6, " C" ,13, 10)
Value = "-"
GoSub CharToLCD
Bintoascii b6, b11, b12, b13
if b6 > 99 then
Value = b11
GoSub CharToLCD
endif
if b6 > 9 then
Value = b12
GoSub CharToLCD
endif
Value = b13 '''More raight number
GoSub CharToLCD
for b12 = 0 to 2 'b13
lookup b12,(" C ") ,b13
Value=b13
gosub CharToLCD
next b12
'setfreq m8 ''''
Return
'''====================================================
InitLCD:
low SCLK
low SDA
low DC
low CS
low RES
pause 50
high RES
high CS
Value = $21
GoSub CommandToLCD '''` transmit to serial LCD module
Value = $C9
GoSub CommandToLCD '''` transmit to serial LCD module
Value = $13
GoSub CommandToLCD '''` transmit to serial LCD module
Value = $20
GoSub CommandToLCD '''` transmit to serial LCD module
Value = $09
GoSub CommandToLCD '''` transmit to serial LCD module
Value = $08
GoSub CommandToLCD '''` transmit to serial LCD module
X = 0
Y = 0
GoSub GotoXY
GoSub ClearFast '''******** REMOVED ''''Lo eliminaron pero yo lo puse....
GoSub Normal
return
'''====================================================
CharToLCD:
eeprom_address = 0
if Value > 32 and Value < 58 then
eeprom_address = Value - 33
eeprom_address = eeprom_address * 5 + 130
elseif Value > 64 and Value < 91 then
eeprom_address = Value - 65
eeprom_address = eeprom_address * 5
elseif Value = 32 then
Value = 0
GoSub DataToLCD
GoSub DataToLCD
GoSub DataToLCD
GoSub DataToLCD
GoSub DataToLCD
end if
if Value = 0 then
return
end if
For Loop1 = 0 To 4
read eeprom_address, Value
inc eeprom_address
GoSub DataToLCD
Next Loop1
Return
'''====================================================
CommandToLCD:
low DC 'Command mode
DataMode1:
low CS
SDA_PIN = bit7
PulsOut SCLK,1
SDA_PIN = bit6
PulsOut SCLK,1
SDA_PIN = bit5
PulsOut SCLK,1
SDA_PIN = bit4
PulsOut SCLK,1
SDA_PIN = bit3
PulsOut SCLK,1
SDA_PIN = bit2
PulsOut SCLK,1
SDA_PIN = bit1
PulsOut SCLK,1
SDA_PIN = bit0
PulsOut SCLK,1
high CS
Return
'''====================================================
DataToLCD:
high DC 'Data mode
DataMode2:
low CS
SDA_PIN = bit7
PulsOut SCLK,1
SDA_PIN = bit6
PulsOut SCLK,1
SDA_PIN = bit5
PulsOut SCLK,1
SDA_PIN = bit4
PulsOut SCLK,1
SDA_PIN = bit3
PulsOut SCLK,1
SDA_PIN = bit2
PulsOut SCLK,1
SDA_PIN = bit1
PulsOut SCLK,1
SDA_PIN = bit0
PulsOut SCLK,1
high CS
Return
'''====================================================
'#REM **********REMOVED
ClearFast:
low SDA
high DC
low CS
For Loop1 = 1 To 48
For Loop3 = 1 To 84
low SCLK
high SCLK
'pulsout SCLK ,1
Next Loop3
Next Loop1
Return
'#ENDREM *** REMOVED
'''====================================================
GotoXY:
Value = X + 128
GoSub CommandToLCD
Value = Y + 64
GoSub CommandToLCD
Return
'''====================================================
Invert:
Value = 13
GoSub CommandToLCD
Return
'''====================================================
Normal:
Value = 12
GoSub CommandToLCD
Return
'''====================================================
eeprom 0,(0x7E, 0x11, 0x11, 0x11, 0x7E) ; A
eeprom (0x7F, 0x49, 0x49, 0x49, 0x36) ; B
eeprom (0x3E, 0x41, 0x41, 0x41, 0x22) ; C
eeprom (0x7F, 0x41, 0x41, 0x22, 0x1C) ; D
eeprom (0x7F, 0x49, 0x49, 0x49, 0x41) ; E
eeprom (0x7F, 0x09, 0x09, 0x09, 0x01) ; F
eeprom (0x3E, 0x41, 0x49, 0x49, 0x7A) ; G
eeprom (0x7F, 0x08, 0x08, 0x08, 0x7F) ; H
eeprom (0x00, 0x41, 0x7F, 0x41, 0x00) ; I
eeprom (0x20, 0x40, 0x41, 0x3F, 0x01) ; J
eeprom (0x7F, 0x08, 0x14, 0x22, 0x41) ; K
eeprom (0x7F, 0x40, 0x40, 0x40, 0x40) ; L
eeprom (0x7F, 0x02, 0x0C, 0x02, 0x7F) ; M
eeprom (0x7F, 0x04, 0x08, 0x10, 0x7F) ; N
eeprom (0x3E, 0x41, 0x41, 0x41, 0x3E) ; O
eeprom (0x7F, 0x09, 0x09, 0x09, 0x06) ; P
eeprom (0x3E, 0x41, 0x51, 0x21, 0x5E) ; Q
eeprom (0x7F, 0x09, 0x19, 0x29, 0x46) ; R
eeprom (0x46, 0x49, 0x49, 0x49, 0x31) ; S
eeprom (0x01, 0x01, 0x7F, 0x01, 0x01) ; T
eeprom (0x3F, 0x40, 0x40, 0x40, 0x3F) ; U
eeprom (0x1F, 0x20, 0x40, 0x20, 0x1F) ; V
eeprom (0x3F, 0x40, 0x38, 0x40, 0x3F) ; W
eeprom (0x63, 0x14, 0x08, 0x14, 0x63) ; X
eeprom (0x07, 0x08, 0x70, 0x08, 0x07) ; Y
eeprom (0x61, 0x51, 0x49, 0x45, 0x43) ; Z
eeprom (0x00, 0x00, 0x2f, 0x00, 0x00) ; !
eeprom (0x00, 0x07, 0x00, 0x07, 0x00) ; "
eeprom (0x14, 0x7f, 0x14, 0x7f, 0x14) ; #
eeprom (0x24, 0x2a, 0x7f, 0x2a, 0x12) ; $
eeprom (0xc4, 0xc8, 0x10, 0x26, 0x46) ; %
eeprom (0x36, 0x49, 0x55, 0x22, 0x50) ; &
eeprom (0x00, 0x05, 0x03, 0x00, 0x00) ; '
eeprom (0x00, 0x1c, 0x22, 0x41, 0x00) ; (
eeprom (0x00, 0x41, 0x22, 0x1c, 0x00) ; )
eeprom (0x14, 0x08, 0x3E, 0x08, 0x14) ; *
eeprom (0x08, 0x08, 0x3E, 0x08, 0x08) ; +
eeprom (0x00, 0x00, 0x50, 0x30, 0x00) ; ,
eeprom (0x10, 0x10, 0x10, 0x10, 0x10) ; -
eeprom (0x00, 0x60, 0x60, 0x00, 0x00) ; .
eeprom (0x20, 0x10, 0x08, 0x04, 0x02) ; /
eeprom (0x3E, 0x51, 0x49, 0x45, 0x3E) ; 0
eeprom (0x00, 0x42, 0x7F, 0x40, 0x00) ; 1
eeprom (0x42, 0x61, 0x51, 0x49, 0x46) ; 2
eeprom (0x21, 0x41, 0x45, 0x4B, 0x31) ; 3
eeprom (0x18, 0x14, 0x12, 0x7F, 0x10) ; 4
eeprom (0x27, 0x45, 0x45, 0x45, 0x39) ; 5
eeprom (0x3C, 0x4A, 0x49, 0x49, 0x30) ; 6
eeprom (0x01, 0x71, 0x09, 0x05, 0x03) ; 7
eeprom (0x36, 0x49, 0x49, 0x49, 0x36) ; 8
eeprom (0x06, 0x49, 0x49, 0x29, 0x1E) ; 9
Espero les agrade...
Esquemático aquí abajo....