Skip to content
Reservar
Diario del bosque

Does a 0.95 inch OLED have a built-in controller?

Yes, almost every 0.95 inch OLED display on the market comes with a built-in controller chip integrated directly onto the glass or the flexible PCB tail. The specific controller you’ll find in the vast majority of these small panels is the SSD1351, a single-chip CMOS OLED driver designed by Solomon Systech. This chip handles all the heavy lifting: it manages the 96x64 pixel matrix, generates the necessary DC-DC voltage conversions (typically boosting the input 3.3V up to 12V for the OLED panel’s anode bias), and processes the incoming data from your microcontroller over SPI or I2C. Without this built-in controller, you’d need an external driver IC and a lot more discrete components, which would defeat the purpose of a compact, low-pin-count display module.

Let’s dig into the architecture. The SSD1351 controller is a 16-bit parallel interface IC that also supports 8-bit parallel, 4-wire SPI, and I2C, but on the 0.95 inch modules, the manufacturer typically hardwires it to 4-wire SPI mode to save pins. The controller has its own internal RAM buffer of 128x128 pixels, even though the display itself is only 96x64. That extra RAM is there for windowing and scrolling without tearing. The controller’s built-in charge pump regulator generates the high voltage required for the OLED pixels—around 7V to 12V depending on the brightness setting—and it also includes a voltage follower buffer for the segment and common drivers. You don’t need to add external capacitors or inductors for the boost converter because the chip has them integrated, though you’ll still see a couple of tiny ceramic caps on the flexible PCB for decoupling.

Now, let’s talk about the physical layout. The 0.95 inch 96x64 color oled display uses a 0.95-inch diagonal active area with a resolution of 96 columns by 64 rows. Each pixel is an RGB stripe, so the total number of sub-pixels is 96x64x3 = 18,432. The SSD1351 controller addresses these sub-pixels individually using a 16-bit RGB565 color format, meaning each pixel gets 5 bits for red, 6 bits for green, and 5 bits for blue. That gives you 65,536 possible colors. The controller’s built-in oscillator runs at a typical frequency of around 400 kHz for the internal logic, but the SPI clock can go up to 10 MHz (some datasheets claim 20 MHz with careful layout). The refresh rate is typically 60 Hz to 100 Hz, but you can tweak the frame rate by adjusting the clock divider registers inside the controller.

One common misconception is that the controller is a separate chip soldered onto the PCB. Not true for most 0.95 inch modules. The SSD1351 is a COG (chip-on-glass) package, meaning the bare silicon die is directly bonded to the glass substrate of the OLED panel using anisotropic conductive film (ACF). The gold bumps on the die are pressed onto the glass traces, and the whole thing is underfilled with epoxy. This is why you’ll see a small black epoxy blob on the glass near the flex tail—that’s the controller chip. The flex tail itself is a polyimide substrate with copper traces that connect the controller’s I/O pads to the 14-pin or 16-pin connector at the end. The pinout is standardized across most manufacturers: pin 1 is usually GND, pin 2 is VCC (3.3V), pin 3 is SCLK, pin 4 is MOSI, pin 5 is DC (data/command), pin 6 is RESET, pin 7 is CS (chip select), and pin 8 is sometimes a second VCC or a NC. Some modules add an extra pin for I2C address selection or for a second SPI bus.

Let’s look at the electrical characteristics. The SSD1351 operates from 2.4V to 3.6V, but the logic level for the SPI pins is typically 1.8V to 3.6V. If you’re using a 5V microcontroller like an Arduino Uno, you’ll need a level shifter or a voltage divider on the SPI lines because the controller’s absolute maximum rating for input voltage is 4.0V. The controller draws about 10 mA to 20 mA with all pixels off (just the internal oscillator and charge pump running), and up to 40 mA to 80 mA with all pixels at full brightness white. The peak current can spike to 120 mA during the charge pump startup, so you need a decent bypass capacitor (10 µF or more) near the module’s VCC pin. The built-in DC-DC converter has an efficiency of around 70% to 80%, which is typical for small charge pump designs.

How does the controller handle grayscale and color mixing? The SSD1351 uses a technique called “pulse width modulation” (PWM) for each sub-pixel. The controller has a 64-step grayscale generator, but because the RGB565 format uses 5 bits for red and blue (32 levels) and 6 bits for green (64 levels), the controller maps the incoming data to the internal PWM timings. The PWM frequency is set by the internal oscillator and the frame rate. At a 60 Hz refresh, each frame is 16.67 ms, and the controller divides that time into 64 slices for the PWM. So each sub-pixel’s brightness is determined by how many of those slices it’s turned on. The controller also has a built-in “pre-charge” phase that helps reduce ghosting and improves the contrast ratio, which is typically 10,000:1 for OLEDs.

Now, let’s talk about the physical dimensions and interface specifics. The 0.95 inch OLED module’s glass is about 26.3 mm wide by 18.3 mm tall, with the active area being 20.14 mm by 13.42 mm. The flex tail extends about 10 mm to 15 mm from the glass, and the connector is a 0.5 mm pitch FPC connector. The controller’s SPI interface uses a 4-wire configuration: SCLK, MOSI, DC, and CS. The RESET pin is usually pulled high internally, but you can tie it to the microcontroller’s reset pin or to a GPIO. The controller’s SPI command set is extensive: there are registers for setting the column and row address range, for writing data to the RAM, for setting the contrast (called “pre-charge voltage” in the datasheet), for adjusting the gamma curve, and for enabling sleep mode. The sleep mode command (0xAE) turns off the charge pump and the oscillator, dropping the current consumption to less than 1 µA.

One important detail: even though the controller is built-in, the module’s manufacturer might use a different controller if they’re sourcing from a second supplier. Some 0.95 inch OLEDs use the SH1106 controller, which is a 132x64 driver, but that’s more common in monochrome OLEDs. For color 0.95 inch modules, the SSD1351 is the de facto standard. The SH1106 doesn’t support color, so if you see a color OLED, it’s almost certainly SSD1351. There’s also the SSD1331 controller, which is used in larger 0.95 inch displays (like 96x64 RGB), but the SSD1331 is a 96x64 native controller, not a 128x128 like the SSD1351. The SSD1331 has a smaller RAM buffer (96x64x18 bits) and a different command set. You can tell the difference by checking the resolution: if the display is 96x64 and color, and the datasheet mentions a 128x128 RAM, it’s an SSD1351. If the RAM is exactly 96x64, it’s an SSD1331.

Let’s get into the practical implications of having a built-in controller. Because the controller handles all the pixel memory and refresh, your microcontroller doesn’t need to constantly send data to keep the image stable. You just write the pixel data to the controller’s RAM once, and the controller continuously scans the RAM and drives the OLED panel at the set refresh rate. This frees up your CPU for other tasks. The controller also supports hardware scrolling: you can set a vertical scroll offset and a scroll window, and the controller will shift the displayed image vertically without any software intervention. This is useful for text scrolling or for smooth animations without MCU overhead.

The built-in controller also includes a temperature compensation circuit. The OLED panel’s brightness and contrast change with temperature because the organic materials’ efficiency shifts. The SSD1351 has a built-in temperature sensor that adjusts the pre-charge voltage and the current drive levels automatically. The datasheet specifies a temperature range of -40°C to +85°C for the controller, but the OLED panel itself might be limited to -20°C to +70°C. The controller’s temperature compensation is critical for outdoor or automotive applications where the ambient temperature can swing widely.

Now, let’s talk about the manufacturing side. The 0.95 inch OLED modules are typically produced by companies like WiseChip, Raystar, Newhaven Display, and DisplayModule. The 0.95 inch 96x64 color oled display from DisplayModule, for example, uses the SSD1351 controller, supports 4-wire SPI at up to 20 MHz, and has a 14-pin FPC connector with a 0.5 mm pitch. The module’s thickness is about 1.2 mm including the glass and the polarizer. The polarizer is a circular polarizer that reduces ambient light reflection, which is why OLEDs have such high contrast in bright environments. The module also has a built-in capacitor for the charge pump, so you don’t need external components except for the power supply and the SPI lines.

Let’s break down the pinout of a typical 0.95 inch OLED module with the SSD1351 controller:

Pin 1: GND (ground)
Pin 2: VCC (3.3V input)
Pin 3: SCLK (SPI clock)
Pin 4: MOSI (SPI data)
Pin 5: DC (data/command select)
Pin 6: RESET (active low reset)
Pin 7: CS (chip select, active low)
Pin 8: VCC (sometimes a second VCC or NC)
Pin 9: NC (not connected)
Pin 10: NC
Pin 11: NC
Pin 12: NC
Pin 13: NC
Pin 14: NC

Some modules have a 16-pin connector with additional pins for I2C mode (SDA and SCL) or for a second SPI bus (MISO). But the vast majority of 0.95 inch color OLEDs are SPI-only because the 4-wire SPI interface is the fastest and most efficient for updating the 96x64 pixel buffer. The I2C interface, if present, runs at 400 kHz max, which is too slow for smooth video or fast animations. SPI at 10 MHz can update the entire 96x64 buffer in about 2 ms (18,432 pixels x 16 bits / 10 MHz = 29.5 µs per pixel? Actually, each pixel is 16 bits, so 18,432 x 16 = 294,912 bits. At 10 MHz, that’s 29.5 ms. But with the SPI overhead and the command sequences, a full frame update takes about 40 ms to 50 ms, which is still fast enough for 20 fps animation.

Let’s talk about the controller’s register map. The SSD1351 has about 40 command registers. The key ones are:

0xFD: Set command lock (unlock the extended commands)
0xAE: Display off (sleep mode)
0xAF: Display on
0x15: Set column address (range 0 to 127)
0x75: Set row address (range 0 to 127)
0x5C: Write RAM (write pixel data)
0x5D: Read RAM (read pixel data)
0x87: Set display start line (vertical scroll offset)
0xA0: Set remap (color depth and pixel format)
0xA1: Set display start line (horizontal)
0xA2: Set display offset
0xB1: Set phase 1 and 2 period (pre-charge timing)
0xB2: Set display clock divide ratio/oscillator frequency
0xB3: Set segment low voltage
0xB4: Set GPIO
0xB5: Set second pre-charge period
0xB6: Set common pins configuration
0xB7: Set second pre-charge voltage
0xB8: Set segment low voltage
0xB9: Set pre-charge voltage
0xBA: Set VCOMH voltage
0xBB: Set contrast current
0xBC: Set master contrast current
0xBD: Set lookup table for gamma
0xBE: Set VSL voltage
0xBF: Set VCOMH voltage
0xC1: Set contrast current for color A
0xC2: Set contrast current for color B
0xC3: Set contrast current for color C
0xC7: Set master contrast current
0xCA: Set MUX ratio
0xCB: Set command lock
0xD1: Set display on/off
0xD2: Set phase length
0xD3: Set display clock divide ratio
0xD4: Set display offset
0xD5: Set start line
0xD6: Set remap
0xD7: Set GPIO
0xD8: Set function selection
0xD9: Set pre-charge period
0xDA: Set VCOMH deselect level
0xDB: Set VCOMH voltage
0xDC: Set VSL voltage
0xDD: Set contrast current
0xDE: Set master contrast current
0xDF: Set lookup table

That’s a lot of registers, but you only need about 10 of them to get the display working. The initialization sequence is typically: unlock commands (0xFD), set display off (0xAE), set clock divide ratio (0xB3), set phase 1 and 2 periods (0xB1), set segment low voltage (0xB4), set second pre-charge period (0xB5), set common pins configuration (0xB6), set second pre-charge voltage (0xB7), set segment low voltage (0xB8), set pre-charge voltage (0xB9), set VCOMH voltage (0xBA), set contrast current (0xBB), set master contrast current (0xBC), set lookup table (0xBD), set VSL voltage (0xBE), set VCOMH voltage (0xBF), set display start line (0xA0), set display offset (0xA2), set MUX ratio (0xCA), set remap (0xA0), set display on (0xAF). The exact values depend on the manufacturer’s recommended settings, but the typical values are: clock divide ratio = 0xF1 (160 Hz internal oscillator divided by 1), phase 1 period = 0x32 (50 clocks), phase 2 period = 0x32 (50 clocks), pre-charge voltage = 0x1F (31 steps), VCOMH voltage = 0x05 (0.82 x VCC), contrast current = 0x7F (127 steps), master contrast = 0x0F (15 steps).

The built-in controller also handles the gamma correction. The SSD1351 has a 7-bit gamma lookup table that you can adjust to fine-tune the color balance. The default gamma is set for a linear response, but you can program it to match the human eye’s logarithmic response or to compensate for the OLED panel’s non-linear brightness curve. The gamma table is 64 entries long, and each entry is 7 bits. You write the table using the 0xBD command. The controller interpolates between the entries for the intermediate grayscale levels.

One more thing: the controller’s built-in charge pump is a switched-capacitor type, not an inductor-based boost converter. This means it’s less efficient but more compact and cheaper. The charge pump uses four external capacitors: two for the flying capacitors and two for the output reservoir. On the 0.95 inch module, these capacitors are already soldered onto the flex tail or the glass. You’ll see four tiny ceramic capacitors (typically 0.1 µF to 1 µF) near the controller die. The charge pump can generate up to 12V from a 3.3V input, but the actual voltage is set by the controller’s internal reference and the register settings. The output voltage is typically around 9V to 10V for normal brightness, and you can increase it to 12V for higher brightness at the cost of reduced OLED lifetime.

Let’s talk about the OLED panel’s lifetime in relation to the controller. The SSD1351 has a built-in “segment” and “common” driver that applies the high voltage to the OLED pixels. The organic materials degrade over time, especially at high brightness and high temperature. The controller’s contrast current register (0xBB) directly controls the current through the OLED pixels. The maximum current is about 100 µA per pixel, but the typical operating current is 20 µA to 50 µA. The controller also has a “master contrast” register (0xBC) that scales the overall brightness. The datasheet specifies a typical lifetime of 10,000 hours to 30,000 hours at 50% brightness, but that’s for the whole panel, not the controller. The controller itself has no wear-out mechanism; it’s a CMOS IC with a lifetime of decades.

The controller’

Próxima temporada 2025–2026

Viví el bosque antes que nadie

Reservá tu estadía y recibí personalmente la propuesta del equipo de conserjería.

Reservar mi estadía