Many display problems are not caused by software or wiring mistakes, but by incorrect voltage levels. Modern microcontrollers and displays often use 3.3V logic, while older modules and Arduino boards use 5V.
This article explains when level shifting is required, which methods work reliably and which solutions should be avoided.
Why Level Shifting Is Important
Digital signals must stay within safe voltage limits.
- 3.3V devices may be damaged by 5V signals
- 5V devices may not reliably detect 3.3V signals
- Unstable communication can occur even if nothing is damaged
Even if a system “seems to work”, incorrect voltage levels can cause intermittent failures.
Typical Voltage Scenarios
In most display projects, one of these situations occurs:
- 3.3V microcontroller → 3.3V display (no level shifting needed)
- 5V microcontroller → 5V display (no level shifting needed)
- 5V microcontroller → 3.3V display (level shifting required)
- 3.3V microcontroller → 5V display (sometimes optional)
The most critical case is when a 5V system drives a 3.3V display.
Which Displays Require Level Shifting?
Usually 3.3V Devices
These should not be directly connected to 5V logic without checking the module design.
Often 5V Devices
- Character LCDs (HD44780)
- Some 7-segment modules
These usually work directly with 5V systems.
I2C Level Shifting
I2C is an open-drain bus, which makes level shifting relatively simple.
- Uses pull-up resistors to define voltage levels
- Can be shifted using MOSFET-based circuits
BSS138-based level shifters are widely used and reliable for I2C.
SPI Level Shifting
SPI is more demanding than I2C.
- Uses push-pull signals
- Requires fast signal edges
- More sensitive to signal distortion
Not all level shifters work reliably with SPI, especially at higher speeds.
Why Automatic Level Shifters Can Fail
Many automatic bidirectional level shifters (such as TXS0108E-based modules) are often used in hobby projects.
In practice, they can cause problems:
- Unstable signals at higher speeds
- Issues with SPI communication
- Problems on I2C buses with strong pull-ups
These issues are not always obvious and can lead to difficult-to-debug behavior.
Discrete MOSFET Level Shifters (BSS138)
A more reliable approach uses discrete MOSFET-based level shifters.
- Based on simple and well-understood circuits
- Works reliably for I2C
- Predictable behavior
For this reason, CANADUINO uses a dedicated level shifter module based on multiple discrete BSS138G transistors instead of automatic solutions.
Level Shifting for SPI Displays
For SPI, different approaches may be used:
- Voltage dividers (simple but not ideal for high speed)
- Unidirectional level shifters (preferred)
- Carefully selected buffer ICs
In many cases:
- 3.3V signals are accepted by 5V devices
- But 5V signals must not be applied to 3.3V inputs
This often means only shifting signals in one direction.
When Level Shifting Is NOT Needed
Level shifting is not always required.
- When both devices use the same voltage
- When modules include onboard level shifting
- When 3.3V logic is sufficient for a 5V input
Always check the module documentation before deciding.
Common Problems Caused by Wrong Levels
- Display not responding
- Random flickering or glitches
- Communication errors
- Permanent damage to display or microcontroller
These problems are often misdiagnosed as software issues.
Practical Guidelines
- Always check logic voltage of both devices
- Use proper level shifting for 5V → 3.3V signals
- Avoid automatic level shifters for SPI
- Use MOSFET-based solutions for I2C
- Keep wiring short for high-speed signals
Conclusion
Level shifting is a critical part of reliable display integration. While some combinations work without it, incorrect voltage levels can lead to unstable behavior or permanent damage.
For reliable designs, especially with modern 3.3V displays, using proper level shifting solutions such as discrete MOSFET-based circuits ensures stable communication and long-term reliability.
