'I2c LCD testing program code with PCF8574 I/O expander
'the LCD display is a 16X2
#picaxe 20M2
#NO_DATA
'#terminal 38400
setfreq M32
Symbol bitRS = bit8
Symbol bitWR = bit9
Symbol bitE = bit10
Symbol bcklght = bit11
Symbol bitD4 = bit12
Symbol bitD5 = bit13
Symbol bitD6 = bit14
Symbol bitD7 = bit15
symbol lastTime = s_w1
bcklght = 1 ' back light 1= on / 0= off
Initialisation:
HI2cSetup I2CMASTER, %01111110, I2CSLOW, I2CBYTE
gosub Int : pause 2
MainProgram: '================== Main Program ===========================
do ' one loop per second
Inc W4 ' add 1 to w4
bintoascii w4,b7,b6,b5,b4,b3
b7 = b7 - 48 :b6 = b6 - 48:b5 = b5 - 48:b4 = b4 - 48:b3 = b3 - 48
lookup b7,("0","1","2","3","4","5","6","7","8","9"),B7
lookup b6,("0","1","2","3","4","5","6","7","8","9"),B6
lookup b5,("0","1","2","3","4","5","6","7","8","9"),B5
lookup b4,("0","1","2","3","4","5","6","7","8","9"),B4
lookup b3,("0","1","2","3","4","5","6","7","8","9"),B3
If b7 = 48 then : b7 = 32 : endif
If b6 = 48 and b7 = 32 then : b6 = 32 : endif
If b5 = 48 and b6 = 32 then : b5 = 32 : endif
If b4 = 48 and b5 = 32 then : b4 = 32 : endif
b0 = $80 : Gosub SendB0AsCommandByte
b0 = "L" : Gosub SendB0AsDataByte '1st line digit 1
b0 = "C" : Gosub SendB0AsDataByte '1st line digit 2
b0 = "D" : Gosub SendB0AsDataByte '1st line digit 3
b0 = " " : Gosub SendB0AsDataByte '1st line digit 4
b0 = "1" : Gosub SendB0AsDataByte '1st line digit 5
b0 = "6" : Gosub SendB0AsDataByte '1st line digit 6
b0 = "x" : Gosub SendB0AsDataByte '1st line digit 7
b0 = "2" : Gosub SendB0AsDataByte '1st line digit 8
b0 = " " : Gosub SendB0AsDataByte '1st line digit 9
b0 = "W" : Gosub SendB0AsDataByte '1st line digit 10
b0 = " " : Gosub SendB0AsDataByte '1st line digit 11
b0 = "E" : Gosub SendB0AsDataByte '1st line digit 12
b0 = "x" : Gosub SendB0AsDataByte '1st line digit 13
b0 = "p" : Gosub SendB0AsDataByte '1st line digit 14
b0 = "d" : Gosub SendB0AsDataByte '1st line digit 15
b0 = "r" : Gosub SendB0AsDataByte '1st line digit 16
b0 = $AA : Gosub SendB0AsCommandByte
b0 = "C" : Gosub SendB0AsDataByte '2nd line digit 1
b0 = "o" : Gosub SendB0AsDataByte '2nd line digit 2
b0 = "u" : Gosub SendB0AsDataByte '2nd line digit 3
b0 = "n" : Gosub SendB0AsDataByte '2nd line digit 4
b0 = "t" : Gosub SendB0AsDataByte '2nd line digit 5
b0 = " " : Gosub SendB0AsDataByte '2nd line digit 6
b0 = "t" : Gosub SendB0AsDataByte '2nd line digit 7
b0 = "e" : Gosub SendB0AsDataByte '2nd line digit 8
b0 = "s" : Gosub SendB0AsDataByte '2nd line digit 9
b0 = "t" : Gosub SendB0AsDataByte '2nd line digit 10
b0 = " " : Gosub SendB0AsDataByte '2nd line digit 11
b0 = b7 : Gosub SendB0AsDataByte '2nd line digit 12
b0 = b6 : Gosub SendB0AsDataByte '2nd line digit 13
b0 = b5 : Gosub SendB0AsDataByte '2nd line digit 14
b0 = b4 : Gosub SendB0AsDataByte '2nd line digit 15
b0 = b3 : Gosub SendB0AsDataByte '2nd line digit 16
do while lastTime = time : loop
lastTime = time
loop
Int:
b0 = $33 : Gosub SendB0AsInitByte
b0 = $33 : Gosub SendB0AsInitByte
b0 = $32 : Gosub SendB0AsInitByte
b0 = $28 : Gosub SendB0AsCommandByte
b0 = $0C : Gosub SendB0AsCommandByte
b0 = $06 : Gosub SendB0AsCommandByte
b0 = $01 : Gosub SendB0AsCommandByte
return
SendB0AsInitByte:
Pause 15
bitWR = 0 ; Keep WR signal low
SendB0AsCommandByte:
bitRS = 0 ; Send byte as a command
SendB0AsDataByte:
bitD4 = bit4 ; Send msb first
bitD5 = bit5
bitD6 = bit6
bitD7 = bit7
bitE = 1
b2 = b1 ; b2 holds msb with E set
bitE = 0 ; b1 holds msb with E clear
HI2cOut b1, ( b2, b1 )
bitD4 = bit0 ; Send lsb second
bitD5 = bit1
bitD6 = bit2
bitD7 = bit3
bitE = 1
b2 = b1 ; b2 holds lsb with E set
bitE = 0 ; b1 holds lsb with E clear
HI2cOut b1, ( b2, b1 )
bitRS = 1 ; Send data byte next time
Return