8 November 2026 · Soldr

SH1106 vs SSD1306: why your 1.3 inch OLED shows garbage

Short answer: most 0.96 inch OLEDs use an SSD1306 controller; many 1.3 inch ones use an SH1106. They share I2C addresses (0x3C or 0x3D) and look identical on the bus, but the SH1106 has 132 columns of memory instead of 128. Drive an SH1106 with SSD1306 code and you get a shifted image, a stripe of noise down one edge, or a scrambled screen. Use a library or driver made for the SH1106.

It's one of the most common "my screen doesn't work" questions, and the wiring is usually fine. The board found the display, the display took the commands, and the picture still came out wrong. The cause is in the controller datasheets, which we've cited on our reference pages for the SSD1306 and the SH1106.

What's the same

What's different: 128 vs 132 columns

The SSD1306 drives a 128 × 64 panel with matching memory. The SH1106 datasheet gives an embedded 132 × 64 bit display RAM, for panels up to 132 dots wide.

SH1106 spec table on soldr.ai: logic supply VDD1 1.65 to 3.5 V, maximum panel size 132 x 64 dots with embedded 132 x 64 bit SRAM, I2C address 0111100 or 0111101 selected by SA0, absolute maximum VDD1 3.6 V, each row citing the datasheet page

A 1.3 inch module usually has a 128-pixel-wide glass panel on that 132-column memory. So the visible pixels sit inside the memory with a few spare columns. Code written for the SSD1306 assumes the first column of memory is the first pixel on screen. On an SH1106 it isn't, and the two controllers also handle addressing modes differently, so SSD1306 code can leave the picture offset, wrapped, or broken into stripes.

How far to offset isn't in the SH1106 datasheet, because it depends on how the module maker placed the panel. Our reference page lists that under Not covered by the official source. In practice, SH1106 drivers handle it with a small column offset; if your image sits a couple of pixels off one edge, that offset is the setting to adjust.

Wiring either one over I2C

The 4-pin I2C modules wire the same way whichever controller they carry:

Two OLEDs on one bus need different addresses, one at 0x3C and one at 0x3D, set with the SA0 option on the module if it has one. Otherwise, a multiplexer keeps them apart.

How to tell which one you have

If the screen stays blank

That's a different problem from a garbled picture. Work through it in order:

  1. Is it found? Run an I2C scanner. No reply at 0x3C or 0x3D means wiring or power. See I2C address conflicts for a scanner sketch.
  2. Is the address right in the code? Some modules are set to 0x3D. The SA0 setting decides it.
  3. Is it powered correctly? Follow the module's own label for VCC; the chip itself is a 3.3 V part.
  4. Is it the right controller in the code? SSD1306 code on an SH1106 often shows something, but not always.

A self-test at startup turns most of these into one line. The sketches Soldr writes print, for example, [INIT] SSD1306 OLED: FAIL (no ACK at 0x3C) with a fix line naming the wires, the power pin and the address to check. More on those lines.

Which to choose

When you describe a build on Soldr, name the controller as well as the size ("a 1.3 inch SH1106 OLED"), so the build doesn't have to guess. Then check the #include lines at the top of the sketch: they show which display library the code uses. If you're unsure which controller you have, ask first: "is a 1.3 inch OLED usually SH1106?"

Describe your build on app.soldr.ai. Sign in and get 100 credits free.