I am currently working with an SSD1306 OLED display. I'm stack with understanding concept of the lower and upper column start addresses. I become interested in them cause I'm trying to find a way to draw specific column (8 pixels) without redrawing entire display. But I don't understand now the reason why column address split on two nibbles.

Datasheet page 31

Datasheet page 34

Source: SSD1306 Datasheet

  • 1
    \$\begingroup\$ Pavlo - Hi, To comply with the site rule on referencing, please edit the question & add the PDF / video / webpage name and its link, for the source(s) of those images. Also please remember it's your responsibility to follow that rule in future too. || As you're new here, please see the tour & help center as site rules here differ from typical forums. TY \$\endgroup\$
    – SamGibson
    Feb 3 at 19:46

1 Answer 1


That is because you don't have enough available bits in a 8-bit command set to have a single command that can have 8-bit parameter, but you have enough different values in the command set for sending enough commands with parameters that you can reserve 32 command bytes in total for updating a single 8-bit parameter.

So when making single byte commands, you need to split the bits between "opcode" and "parameter", and with 8-bit bus you can have 256 different values.

It means that depending on how you split the bits you can have e.g. 256 commands with no parameters, or, one command with 256 different parameter values, or maybe two command with 7-bit parameters, or 16 commands with 4-bit parameters.

Internally that command might be a 3-bit command to set address, with 1 bit parameter to determine if high or low nybble is set, and then 4 bits of value.

So, in short, you have 256 addresses which you must be able to select with a command. But you can't have command to select any of the 256 addresses directly.

So imagine you have a linear row of 256 pigeon holes, and you need to have one command byte to select one of the pigeon holes to use, then that is impossible. But if you arrange the 256 pigeon holes into a grid of 16 row and 16 columns, you can now see that you can have two commands, one command to select one of the 16 rows, and another command to select one of the 16 columns, so you only need 32 commands in total to select any of the 256 pigeon holes, and still have 224 command bytes left for other commands.

  • \$\begingroup\$ SSD1306 use pin (called DC) to switch between commands and data. When DC receive high signal, SSD1306 interpret each 8 bits passed through bus as column with 8 pixels. That's mean that byte contain only information about whether pixel is lit or not, without op code. Or i'm missing something, i'm newbie in embedded... Anyway thanks for trying to assist me \$\endgroup\$
    – Pavlo
    Feb 2 at 10:43
  • \$\begingroup\$ @Pavlo It simply means that wire selects if you are sending a byte of pixel data or a byte of command. You still have only 256 different commands. It does not change anything. But you have no way of sending a command with 8 bits as parameter, because all commands are single bytes. If you have 256 addresses, you can't send that large values, but if you split the 256 addresses into 16x16 grid, you can send row and column addresses separately. \$\endgroup\$
    – Justme
    Feb 2 at 10:58

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.