derived from Aidafruit SSD1306 library
Dependents: Test_SSD1306 L152RE_OLED_SSD1306 EcranZumo
Fork of SSD1306 by
Revision 1:1d58d378221c, committed 2013-02-05
- Comitter:
- Byrn
- Date:
- Tue Feb 05 17:18:23 2013 +0000
- Parent:
- 0:21cb91208386
- Child:
- 2:e479b0296757
- Commit message:
- intiial commit;
Changed in this revision
ssd1306.cpp | Show annotated file Show diff for this revision Revisions of this file |
ssd1306.h | Show annotated file Show diff for this revision Revisions of this file |
--- 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;
--- a/ssd1306.h Tue Feb 05 09:46:58 2013 +0000 +++ b/ssd1306.h Tue Feb 05 17:18:23 2013 +0000 @@ -6,9 +6,20 @@ #define FONT_DATA_OFFSET 2 /* Data starts at this position */ #define FONT_START ' ' /* First character value in the font table */ +/** SSD1306 Controller Driver + * + * Information taken from the datasheet at: + * http://www.adafruit.com/datasheets/SSD1306.pdf + */ class SSD1306 { public: + /** Construct a new SSD1306 object. + * @param cs The connected C/S pin. + * @param rs The connected RS pin. + * @param dc The connected DC pin. + * @param clk The connected CLK pin. + * @param data The connected Data pin. SSD1306(PinName cs, PinName rs, PinName dc, PinName clk, PinName data); void initialise(); @@ -17,13 +28,15 @@ void off(); void on(); - void invert(int i); - + // Sends the display to sleep, but leaves RAM intact + void sleep(); + + // + void wake(); + void set_low_column(int value); void set_high_column(int value); - void set_start_line(int value); - - void set_display_offset(int value); + void set_start_line(int value); void clear(); void set_pixel(int x, int y); @@ -32,6 +45,15 @@ void draw_string(char *font, int x, int y, const char *string); void draw_char(char *font, int x, int y, char c); + + void set_contrast(unsigned char value); // 1-256 + void set_inverse(unsigned char value); // 0 or 1 + void set_display_start_line(unsigned char value); // 0-63 + void set_horizontal_flip(unsigned char value); // 0 or 1 + void set_display_offset(unsigned char value); // 0-63 + void set_multiplex_ratio(unsigned char value); // 15-63 (value+1 mux) + void set_com_output_scan_direction(unsigned char value); // 0 or 1 + void set_com_pins_hardware_configuration(unsigned char sequential, unsigned char lr_remap); // 0 or 1 for both parametrs private: SPI _spi; @@ -40,8 +62,8 @@ int _cursor_x, _cursor_y; - void _send_command(int code); - void _send_data(int value); + void _send_command(unsigned char code); + void _send_data(unsigned char value); }; #define SSD1306_LCDWIDTH 128