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