tinygo-org / drivers

TinyGo drivers for sensors, displays, wireless adaptors, and other devices that use I2C, SPI, GPIO, ADC, and UART interfaces.
https://tinygo.org
BSD 3-Clause "New" or "Revised" License
607 stars 192 forks source link

HD44780: Can't understand how `CreateCharacter` works #618

Open quentin7b opened 10 months ago

quentin7b commented 10 months ago

Hello there,

Thanks for this awesome library, I have a project for using an HD44780 LCD display with my pico and it fits perfectly.

For the need of my project, I need to display 4 custom characters to the first 2x2 LCD matrix

So (0,0), (1,0), (0,1) and (1,1).

I've defined my custom characters to be like this

lcd.CreateCharacter(0x0, []byte{0x00, 0x07, 0x07, 0x18, 0x18, 0x18, 0x18, 0x19})
lcd.CreateCharacter(0x1, []byte{0x00, 0x1C, 0x1C, 0x03, 0x03, 0x0F, 0x0F, 0x13})
lcd.CreateCharacter(0x2, []byte{0x19, 0x1E, 0x1E, 0x18, 0x18, 0x07, 0x07, 0x00})
lcd.CreateCharacter(0x3, []byte{0x13, 0x03, 0x03, 0x03, 0x03, 0x1C, 0x1C, 0x00})

and I print them doing

lcd.SetCursor(0, 0)
lcd.Write([]byte{0x0})
lcd.Display()

lcd.SetCursor(1, 0)
lcd.Write([]byte{0x1})
lcd.Display()

lcd.SetCursor(0, 1)
lcd.Write([]byte{0x2})
lcd.Display()

lcd.SetCursor(1, 1)
lcd.Write([]byte{0x3})
lcd.Display()

And when I run it, it show some weird stuff, like all the "custom" chars are merged or something.

I can't figure how it is possible, it seems like when I try to add offset to custom chars the result changes...

I think I might does not understand how it works.

Note that If i do

lcd.CreateCharacter(0x0, []byte{0x00, 0x07, 0x07, 0x18, 0x18, 0x18, 0x18, 0x19})
lcd.Write([]byte{0x0})
lcd.Display()

it works fine.

But using this (so the exact same character but in 0x1 memory place)

lcd.CreateCharacter(0x1, []byte{0x00, 0x07, 0x07, 0x18, 0x18, 0x18, 0x18, 0x19})
lcd.Write([]byte{0x1})
lcd.Display()

then the character is broken...

If anyone could explain to me how it's meant to be used it will be very nice 🙏