User Tools

Site Tools


mmbasic:drive_hd44780_via_i2c

Drive Hd44780 Via I2c

Straightforward way to drive HD44780 from PicoMite via pcf8574 and level converter. This one is actually useful because it displays a string variable.

'chips primitive LCD driver
' pcf8574 pins in order: D7,D6,D5,D4,BL,E,RW,RS
'from the the HD44780 data sheet
'hardware HD44780, pcf8574, 3 to 5 volt level converter

screen$ = "ABCD 1234"

setpin gp2,gp3,i2c2 'where the sigs come out
i2c2 open 100,100 '100 KHz wait 100 mS
pause 100 ' for power to come up

i2c2 write &h27,0,1,&b00100000 :pause 1 'function set e lo
i2c2 write &h27,0,1,&b00100100 :pause 1 ' flip e hi
i2c2 write &h27,0,1,&b00100000 :pause 1 'e trailing edge sends data

i2c2 write &h27,0,1,&b00100000 :pause 1 'function set e lo
i2c2 write &h27,0,1,&b00100100 :pause 1 ' flip e hi
i2c2 write &h27,0,1,&b00100000 :pause 1 'e trailing edge sends data


i2c2 write &h27,0,1,&b00000000 :pause 1 'second function set
i2c2 write &h27,0,1,&b00000100 :pause 1 'flip e hi
i2c2 write &h27,0,1,&b00000000 :pause 1 'e back lo

i2c2 write &h27,0,1,&b00000000 :pause 1 'third function set
i2c2 write &h27,0,1,&b00000100 :pause 1 'flip e hi
i2c2 write &h27,0,1,&b00000000 :pause 1 'e back lo


i2c2 write &h27,0,1,&b11100000 :pause 1 'display on off
i2c2 write &h27,0,1,&b11100100 :pause 1 'flip e hi
i2c2 write &h27,0,1,&b11100000 :pause 1 'e back lo

i2c2 write &h27,0,1,&b00000000 :pause 1 'entry mode set
i2c2 write &h27,0,1,&b00000100 :pause 1 ' flip e hi
i2c2 write &h27,0,1,&b00000000 :pause 1 ' e down to send data

i2c2 write &h27,0,1,&b01100000 :pause 1 'more entry mode set
i2c2 write &h27,0,1,&b01100100 :pause 1 ' flip e hi
i2c2 write &h27,0,1,&b01100000 :pause 1 'e back lo

'now write a character LSB hi is character, not control.
'necessary to declare these variables integer so bitwise ops work right

For i% = 1 to len(screen$)
  letter$ = mid$(screen$,i%,1)
  number% = asc(letter$)
  hinibble% = number% >> 4
  lonibble% = number% AND &b00001111
  hinibbleasbyte% = (hinibble%*16) OR &b0001
  hinibbleflipped% = (hinibble%*16) or &b0101
  lonibbleasbyte% = (lonibble%*16) or &b0001
  lonibbleflipped%= (lonibble%*16) or &b0101
  i2c2 write &h27,0,1,hinibbleasbyte% :pause 1
  i2c2 write &h27,0,1,hinibbleflipped% :pause 1
  i2c2 write &h27,0,1,hinibbleasbyte% : pause 1
  i2c2 write &h27,0,1,lonibbleasbyte% : pause 1
  i2c2 write &h27,0,1,lonibbleflipped% :pause 1
  i2c2 write &h27,0,1,lonibbleasbyte% : pause 1
next i%

'turn on backlight
i2c2 close
setpin gp2, gp3, i2c2
i2c2 open 100,100 '100 KHz, wait 100 ms
i2c2 write &h27,0,1,&b0001000
i2c2 close
mmbasic/drive_hd44780_via_i2c.txt · Last modified: 2025/01/17 21:38 by gerry