For a hobby project, I am trying to make some sort of little game with an ATtiny85 and an SSD1306 OLED display, mostly to see how much I can do with the least hardware possible. Something like Captain Rectangle rescues the Circle Princess from the Evil Triangles.

I have been seeing what I can do with an SSD1306 (datasheet), specifically horizontal scrolling. It has a feature to scroll the display horizontally (left or right) at a certain rate, i.e. 1 pixel per given number of frames. This is achieved by issuing three commands:

  1. The first command sets up the scroll.
  2. The second command starts the scroll.
  3. The third command stops the scroll.

While letting the display unit take care of scrolling all by itself sure takes a load off the minimalist MCU, what I really want is to just scroll 1 pixel right away (OK if it takes the display milliseconds to do this). Is there a reliable way to do that?

Some things I have tried:

  • Draw a column of pixels, setup and start the scroll, stop the scroll right away, delay 10ms, repeat. The screen does not do much scrolling--I think it only scrolls every x number of attempts, depending on the timing of when the OLED wants to do scrolling vs. when I tell it to stop.
  • Stop scrolling, draw a column of pixels, setup and start the scroll, delay 10ms. In a preliminary demo, this appears to mostly work, but obviously I will have to read more about the timing of the scrolling to really know, and besides this is a fragile solution--if the OLED scrolls 1 too many or too few pixels, then the MCU program's understanding of what should be on the screen will not line up with that of the display.
  • I also looked at the "Set Column Address" command, which specifies column start address and end address of the display data RAM, but that has no effect on data already displayed--it does not move visibly on the screen, but only affects subsequent writes--where the address pointer points, and what columns it may point to.

BTW, I am using vertical memory address mode, i.e. I send data one column of pixels at a time, since that is what would have to be drawn when scrolling horizontally 1 pixel.

I see there are more options to try with vertical scrolling, though my screen size (128x64) is not conducive to that.

I could also try re-writing everything on the display every 10ms, but first, did I overlook anything in the datasheet?

  • If someone with privileges could please add an SSD1306 tag, that would be great. BTW, I'm using Arduino IDE and a Trinket, but I think that's immaterial.
    – jyoungdev
    Apr 2, 2018 at 21:22
  • are you not able to add the tag yourself?
    – jsotola
    Apr 3, 2018 at 1:39
  • the SSD1306 datasheet that you posted ... search for the word "vertical" in the datasheet
    – jsotola
    Apr 3, 2018 at 1:42


Your Answer

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

Browse other questions tagged or ask your own question.