Fork of SSD1306 by
Diff: ssd1306.cpp
- 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;