This is very true and is manufacturer dependent. Traditionally the 1602 and 2004 LCD displays were 5V displays. Then "some" manufacturers started putting out 3.3V and 5V compatible displays. This may be hard, but you need to find the datasheet for the manufacturer you have to be sure (unless they did something smart like silkscreen that info on the back of the display)Is the generic device actually a 5v device? I vaguely remember when doing some example code for one of those that if that was the case the display was very dim and almost unreadable.
You can drive a 5V LCD with 3.3, but it will be dim. The I2C backpack has a varistor on the back for adjusting contrast which you can adjust with a small flathead screwdriver to get the best contrast for your voltage setup. You can also change the size of the resistor you use powering the backlight pin. I've found using a 470 Ohm for 5V or 330 Ohm when powering at 3.3V works well.
The best solution is to drive the display at 5V, but then use a 5V - 3.3V logic level-shifter to communicate with the I2C pins at 3.3V. You can get the logic level-shifters for a dollar or two. Display brightness and the ability to control contrast are greatly improved if you have a 5V display to drive it at 5V. You can use VBUS (or VSYS) to power the display and then use 3V3(OUT) to condition the level-shifter to provide 3.3V for the I2C pins.
If you do end up going the C route, I've got a library that support the 1602 and 2004 displays that I can post if interested, along with a simple example that also shows CGRAM character generation for custom characters as well. (fun to play with)
Statistics: Posted by drankinatty — Wed Aug 20, 2025 1:50 am