The cheap 0.96-inch OLED display you see on countless DIY projects is built around a chip called the SSD1306. It's a tiny full-fledged display controller: 128×64 pixels, an internal framebuffer in its own RAM, a command set for drawing primitives, and an I²C (or SPI) interface. For about three dollars, you get a complete graphics subsystem.

I²C in three sentences

I²C is a two-wire bus designed for chip-to-chip communication on the same PCB or short cable. SDA carries data; SCL carries the clock. Every device on the bus has a 7-bit address; the master (the Arduino) initiates each transaction by sending the address it wants to talk to. The SSD1306 by default lives at address 0x3C — burn this number into your memory because every OLED tutorial uses it.

How the SSD1306 thinks

The chip's RAM is organised as 8 pages × 128 columns. Each page is a horizontal stripe 8 pixels tall — so the full 64-pixel-high display is 8 stacked pages. To draw a pixel, you address the right page + column, then write a byte whose bits are the pixel column (LSB = top row of that page, bit 7 = bottom). It's a weird memory layout that maps directly to how the LCD driver electronics scan rows.

You don't usually think about this layout because the Adafruit_SSD1306 library hides it. You call display.setCursor(0,0); display.print("Hello");, the library rasterises text into its in-memory framebuffer (a 1024-byte mirror of the chip's RAM), then calls display.display() which pushes the whole buffer over I²C to the chip.

The cost of a frame

Pushing 1024 bytes over I²C at 100 kHz takes about 80 ms. At 400 kHz "fast mode" it drops to 20 ms — usable but not animation-smooth. This is why high-FPS animation on an OLED requires partial updates (only redraw the bytes that changed) or moving to SPI which can run at megahertz.

The library's display.display() redraws the entire screen unconditionally — fine for static UIs, painful for anything that updates more than ~10 Hz. If your project feels sluggish, the bottleneck is almost always the I²C transmission, not the Arduino's drawing logic.

Why this stack matters

The SSD1306 is your introduction to driving displays. The pattern — frame buffer in chip RAM, push updates over a serial bus, library hides the byte layout — repeats with the larger SSD1351 (128×128 colour OLED), the bigger SH1107 (128×128 mono), and ultimately the ILI9341 (320×240 colour LCD). Master the SSD1306's mental model and the others are just bigger buffers.