A buffered display driver for the SSD1306 OLED controller. Please note that this is a work-in-progress; only very rudimentary drawing support is provided.

Dependents:   Projetv0 greenhouse_proj ProjetLong_Serre_V3 ProjetLong_Serre_V3_1 ... more

Example of use:

#include "mbed.h"

#include "ssd1306.h"
#include "standard_font.h"
#include "bold_font.h"

SSD1306 oled(p8 /* cs */, p9 /* reset */, p14 /* dc */,
             p13 /* clock */, p11 /* data */);

int main()
{
    oled.initialise();
    oled.clear();
    oled.set_contrast(255); // max contrast

    oled.set_font(bold_font, 8);
    oled.printf("Heading\r\n");

    oled.set_font(standard_font, 6);
    oled.printf("Hello World!\r\n");
    oled.printf("Some more text here...");

    oled.update();

    while (1)
    {
        wait(2);
        oled.scroll_up();
        oled.update();
    }
}
Revision:
1:1d58d378221c
Parent:
0:21cb91208386
Child:
2:e479b0296757
--- a/ssd1306.cpp	Tue Feb 05 09:46:58 2013 +0000
+++ b/ssd1306.cpp	Tue Feb 05 17:18:23 2013 +0000
@@ -3,7 +3,10 @@
 #include "ssd1306.h"
 
 SSD1306::SSD1306(PinName cs, PinName rs, PinName dc, PinName clk, PinName data)
-    : _spi(data, NC, clk), _cs(cs), _reset(rs), _dc(dc)
+    : _spi(data, NC, clk), 
+      _cs(cs), 
+      _reset(rs), 
+      _dc(dc)
 {
 }
 
@@ -32,22 +35,62 @@
     _send_command(SSD1306_DISPLAYON);
 }
 
-void SSD1306::invert(int i)
+void SSD1306::sleep()
+{
+    _send_command(0xAE);
+}
+
+void SSD1306::wake()
 {
-    _send_command(i ? 
-        SSD1306_INVERTDISPLAY :
-        SSD1306_NORMALDISPLAY);
+    _send_command(0xAF);
+}
+
+void SSD1306::set_inverse(unsigned char value)
+{
+    _send_command(value ? 0xA7 : 0xA6);
+}
+
+void SSD1306::set_display_offset(unsigned char value)
+{
+    _send_command(0xD3);
+    _send_command(value); 
 }
 
-void SSD1306::set_display_offset(int v)
+void SSD1306::set_contrast(unsigned char value) 
+{
+    _send_command(0x81);
+    _send_command(value);
+}
+
+void SSD1306::set_display_start_line(unsigned char value)
+{
+    _send_command(0x40 | value);
+}
+
+void SSD1306::set_horizontal_flip(unsigned char value)
 {
-    _send_command(SSD1306_SETDISPLAYOFFSET);
-    _send_command(v); 
+    _send_command(value ? 0xA1 : 0xA0);
+}
+
+void SSD1306::set_multiplex_ratio(unsigned char value)
+{
+    _send_command(0xA8 | value);
+}
+
+void SSD1306::set_com_output_scan_direction(unsigned char value)
+{
+    _send_command(value ? 0xC8 : 0xC0);
+}
+
+void SSD1306::set_com_pins_hardware_configuration(unsigned char sequential, unsigned char lr_remap)
+{
+    _send_command(0xDA);
+    _send_command(0x02 | ((sequential & 1) << 5) | ((lr_remap & 1) << 6));
 }
 
 void SSD1306::initialise()
 {
- // Init
+    // Init
     _reset = 1;
     wait(0.01);
     _reset = 0;
@@ -60,6 +103,34 @@
     set_high_column(0);
     set_start_line(0);
     
+    _send_command(0xAE);  // turn off
+    _send_command(0x00);  // set low column address
+    _send_command(0x10);  // set high column address
+    _send_command(0x40);  // set start line address
+    
+    set_contrast(0xFF);
+    
+    _send_command(0xA1);  // set segment re-map 95 to 0
+    _send_command(0xA6);  // set normal display
+    _send_command(0xA8);  // set multiplex ratio (1-64);
+    _send_command(0x3F);  // 1/64 duty
+    _send_command(0xD3);  // set display offset
+    _send_command(0x00);  // -- no offset
+    _send_command(0xD5);  // set display clock divide ratio/oscillator frequency
+    _send_command(0x80);  // -- set divide ratio
+    _send_command(0xD9);  // set precharge period;
+    _send_command(0xF1);
+    _send_command(0xDA);  // set com pins hardware config
+    _send_command(0x12);
+    _send_command(0xDB);  // set vcomh
+    _send_command(0x40); 
+    _send_command(0x8D);  // set charge pump enable/disable
+    _send_command(0x14);  // enable  (0x10 disable)
+    _send_command(0xAF);  // switch panel on
+    
+    set_inverse(1);
+    
+    /*
     _send_command(SSD1306_SETCONTRAST);
     _send_command(0xCF); // chargepump, could be 0x9F for external 9V
     
@@ -89,9 +160,9 @@
     _send_command(SSD1306_COMSCANDEC);
     _send_command(SSD1306_CHARGEPUMP);
     _send_command(0x14); // disable, for external 9v 0x10 disable
-   
+    */
     // turn it on
-    on();
+    // on();
 }
 
 void SSD1306::update()
@@ -187,7 +258,7 @@
         _screen[i] = 0;
 }
 
-void SSD1306::_send_command(int code)
+void SSD1306::_send_command(unsigned char code)
 {
     _cs = 1;
     _dc = 0;
@@ -196,7 +267,7 @@
     _cs = 1;
 }
 
-void SSD1306::_send_data(int value)
+void SSD1306::_send_data(unsigned char value)
 {
     _cs = 1;
     _dc = 1;