derived from Aidafruit SSD1306 library

Dependents:   Test_SSD1306 L152RE_OLED_SSD1306 EcranZumo

Fork of SSD1306 by Jonathan Gaul

Committer:
Byrn
Date:
Tue Feb 05 09:46:58 2013 +0000
Revision:
0:21cb91208386
Child:
1:1d58d378221c
[mbed] converted /OLED/SSD1306

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Byrn 0:21cb91208386 1
Byrn 0:21cb91208386 2 #include "mbed.h"
Byrn 0:21cb91208386 3 #include "ssd1306.h"
Byrn 0:21cb91208386 4
Byrn 0:21cb91208386 5 SSD1306::SSD1306(PinName cs, PinName rs, PinName dc, PinName clk, PinName data)
Byrn 0:21cb91208386 6 : _spi(data, NC, clk), _cs(cs), _reset(rs), _dc(dc)
Byrn 0:21cb91208386 7 {
Byrn 0:21cb91208386 8 }
Byrn 0:21cb91208386 9
Byrn 0:21cb91208386 10 void SSD1306::set_low_column(int v)
Byrn 0:21cb91208386 11 {
Byrn 0:21cb91208386 12 _send_command(SSD1306_SETLOWCOLUMN | v);
Byrn 0:21cb91208386 13 }
Byrn 0:21cb91208386 14
Byrn 0:21cb91208386 15 void SSD1306::set_high_column(int v)
Byrn 0:21cb91208386 16 {
Byrn 0:21cb91208386 17 _send_command(SSD1306_SETHIGHCOLUMN | v);
Byrn 0:21cb91208386 18 }
Byrn 0:21cb91208386 19
Byrn 0:21cb91208386 20 void SSD1306::set_start_line(int v)
Byrn 0:21cb91208386 21 {
Byrn 0:21cb91208386 22 _send_command(SSD1306_SETSTARTLINE | v);
Byrn 0:21cb91208386 23 }
Byrn 0:21cb91208386 24
Byrn 0:21cb91208386 25 void SSD1306::off()
Byrn 0:21cb91208386 26 {
Byrn 0:21cb91208386 27 _send_command(SSD1306_DISPLAYOFF);
Byrn 0:21cb91208386 28 }
Byrn 0:21cb91208386 29
Byrn 0:21cb91208386 30 void SSD1306::on()
Byrn 0:21cb91208386 31 {
Byrn 0:21cb91208386 32 _send_command(SSD1306_DISPLAYON);
Byrn 0:21cb91208386 33 }
Byrn 0:21cb91208386 34
Byrn 0:21cb91208386 35 void SSD1306::invert(int i)
Byrn 0:21cb91208386 36 {
Byrn 0:21cb91208386 37 _send_command(i ?
Byrn 0:21cb91208386 38 SSD1306_INVERTDISPLAY :
Byrn 0:21cb91208386 39 SSD1306_NORMALDISPLAY);
Byrn 0:21cb91208386 40 }
Byrn 0:21cb91208386 41
Byrn 0:21cb91208386 42 void SSD1306::set_display_offset(int v)
Byrn 0:21cb91208386 43 {
Byrn 0:21cb91208386 44 _send_command(SSD1306_SETDISPLAYOFFSET);
Byrn 0:21cb91208386 45 _send_command(v);
Byrn 0:21cb91208386 46 }
Byrn 0:21cb91208386 47
Byrn 0:21cb91208386 48 void SSD1306::initialise()
Byrn 0:21cb91208386 49 {
Byrn 0:21cb91208386 50 // Init
Byrn 0:21cb91208386 51 _reset = 1;
Byrn 0:21cb91208386 52 wait(0.01);
Byrn 0:21cb91208386 53 _reset = 0;
Byrn 0:21cb91208386 54 wait(0.10);
Byrn 0:21cb91208386 55 _reset = 1;
Byrn 0:21cb91208386 56
Byrn 0:21cb91208386 57 off();
Byrn 0:21cb91208386 58
Byrn 0:21cb91208386 59 set_low_column(0);
Byrn 0:21cb91208386 60 set_high_column(0);
Byrn 0:21cb91208386 61 set_start_line(0);
Byrn 0:21cb91208386 62
Byrn 0:21cb91208386 63 _send_command(SSD1306_SETCONTRAST);
Byrn 0:21cb91208386 64 _send_command(0xCF); // chargepump, could be 0x9F for external 9V
Byrn 0:21cb91208386 65
Byrn 0:21cb91208386 66 _send_command(0xA1); // setment remap 95 to 0 (??)
Byrn 0:21cb91208386 67
Byrn 0:21cb91208386 68 invert(0);
Byrn 0:21cb91208386 69
Byrn 0:21cb91208386 70 _send_command(SSD1306_DISPLAYALLON_RESUME);
Byrn 0:21cb91208386 71 _send_command(SSD1306_SETMULTIPLEX);
Byrn 0:21cb91208386 72 _send_command(0x3F); // 1/64 duty
Byrn 0:21cb91208386 73
Byrn 0:21cb91208386 74 set_display_offset(0);
Byrn 0:21cb91208386 75
Byrn 0:21cb91208386 76 _send_command(SSD1306_SETDISPLAYCLOCKDIV);
Byrn 0:21cb91208386 77 _send_command(0x80); // suggested value = 0x80
Byrn 0:21cb91208386 78 _send_command(SSD1306_SETPRECHARGE);
Byrn 0:21cb91208386 79 _send_command(0xF1); // dc/dc, could be 0x22 for external 9V
Byrn 0:21cb91208386 80 _send_command(SSD1306_SETCOMPINS);
Byrn 0:21cb91208386 81 _send_command(0x12); // disable COM left/right remap
Byrn 0:21cb91208386 82 _send_command(SSD1306_SETVCOMDETECT);
Byrn 0:21cb91208386 83 _send_command(0x40); // apparently, 0x20 is default...
Byrn 0:21cb91208386 84 _send_command(SSD1306_MEMORYMODE);
Byrn 0:21cb91208386 85 _send_command(0x0); // act like KS0108
Byrn 0:21cb91208386 86
Byrn 0:21cb91208386 87 // left-to-right scan
Byrn 0:21cb91208386 88 _send_command(SSD1306_SEGREMAP | 0x1);
Byrn 0:21cb91208386 89 _send_command(SSD1306_COMSCANDEC);
Byrn 0:21cb91208386 90 _send_command(SSD1306_CHARGEPUMP);
Byrn 0:21cb91208386 91 _send_command(0x14); // disable, for external 9v 0x10 disable
Byrn 0:21cb91208386 92
Byrn 0:21cb91208386 93 // turn it on
Byrn 0:21cb91208386 94 on();
Byrn 0:21cb91208386 95 }
Byrn 0:21cb91208386 96
Byrn 0:21cb91208386 97 void SSD1306::update()
Byrn 0:21cb91208386 98 {
Byrn 0:21cb91208386 99 set_low_column(0);
Byrn 0:21cb91208386 100 set_high_column(0);
Byrn 0:21cb91208386 101 set_start_line(0);
Byrn 0:21cb91208386 102
Byrn 0:21cb91208386 103 for (int i = 0; i < 1024; i++)
Byrn 0:21cb91208386 104 _send_data(_screen[i]);
Byrn 0:21cb91208386 105 }
Byrn 0:21cb91208386 106
Byrn 0:21cb91208386 107 void SSD1306::set_pixel(int x, int y)
Byrn 0:21cb91208386 108 {
Byrn 0:21cb91208386 109 if (x >= SSD1306_LCDWIDTH || y >= SSD1306_LCDHEIGHT) return;
Byrn 0:21cb91208386 110
Byrn 0:21cb91208386 111 _screen[x + (y / 8) * 128] |= 1 << (y % 8);
Byrn 0:21cb91208386 112 }
Byrn 0:21cb91208386 113
Byrn 0:21cb91208386 114 void SSD1306::clear_pixel(int x, int y)
Byrn 0:21cb91208386 115 {
Byrn 0:21cb91208386 116 if (x >= SSD1306_LCDWIDTH || y >= SSD1306_LCDHEIGHT) return;
Byrn 0:21cb91208386 117
Byrn 0:21cb91208386 118 _screen[x + (y / 8) * 128] &= ~(1 << (y % 8));
Byrn 0:21cb91208386 119 }
Byrn 0:21cb91208386 120
Byrn 0:21cb91208386 121 void SSD1306::line(int x0, int y0, int x1, int y1) {
Byrn 0:21cb91208386 122 int steep = abs(y1 - y0) > abs(x1 - x0);
Byrn 0:21cb91208386 123 int t;
Byrn 0:21cb91208386 124
Byrn 0:21cb91208386 125 if (steep) {
Byrn 0:21cb91208386 126 t = x0; x0 = y0; y0 = t;
Byrn 0:21cb91208386 127 t = x1; x1 = y1; y1 = t;
Byrn 0:21cb91208386 128 }
Byrn 0:21cb91208386 129
Byrn 0:21cb91208386 130 if (x0 > x1) {
Byrn 0:21cb91208386 131 t = x0; x0 = x1; x1 = t;
Byrn 0:21cb91208386 132 t = y0; y0 = y1; y1 = t;
Byrn 0:21cb91208386 133 }
Byrn 0:21cb91208386 134
Byrn 0:21cb91208386 135 int dx, dy;
Byrn 0:21cb91208386 136
Byrn 0:21cb91208386 137 dx = x1 - x0;
Byrn 0:21cb91208386 138 dy = abs(y1 - y0);
Byrn 0:21cb91208386 139
Byrn 0:21cb91208386 140 int err = dx / 2;
Byrn 0:21cb91208386 141 int ystep;
Byrn 0:21cb91208386 142
Byrn 0:21cb91208386 143 if (y0 < y1) {
Byrn 0:21cb91208386 144 ystep = 1;
Byrn 0:21cb91208386 145 } else {
Byrn 0:21cb91208386 146 ystep = -1;}
Byrn 0:21cb91208386 147
Byrn 0:21cb91208386 148 for (; x0<x1; x0++) {
Byrn 0:21cb91208386 149 if (steep) {
Byrn 0:21cb91208386 150 set_pixel(y0, x0);
Byrn 0:21cb91208386 151 } else {
Byrn 0:21cb91208386 152 set_pixel(x0, y0);
Byrn 0:21cb91208386 153 }
Byrn 0:21cb91208386 154 err -= dy;
Byrn 0:21cb91208386 155 if (err < 0) {
Byrn 0:21cb91208386 156 y0 += ystep;
Byrn 0:21cb91208386 157 err += dx;
Byrn 0:21cb91208386 158 }
Byrn 0:21cb91208386 159 }
Byrn 0:21cb91208386 160 }
Byrn 0:21cb91208386 161
Byrn 0:21cb91208386 162 void SSD1306::draw_string(char *font, int x, int y, const char *string)
Byrn 0:21cb91208386 163 {
Byrn 0:21cb91208386 164 _cursor_x = x;
Byrn 0:21cb91208386 165 _cursor_y = y;
Byrn 0:21cb91208386 166
Byrn 0:21cb91208386 167 for (int i = 0; i < strlen(string); i++)
Byrn 0:21cb91208386 168 draw_char(font, _cursor_x, _cursor_y, string[i]);
Byrn 0:21cb91208386 169 }
Byrn 0:21cb91208386 170
Byrn 0:21cb91208386 171 void SSD1306::draw_char(char *font, int x, int y, char c)
Byrn 0:21cb91208386 172 {
Byrn 0:21cb91208386 173 int height = font[FONT_HEIGHT_OFFSET];
Byrn 0:21cb91208386 174 int max_width = font[FONT_SIZE_OFFSET];
Byrn 0:21cb91208386 175 int char_size_bytes = max_width * height + 1;
Byrn 0:21cb91208386 176 int char_width = font[(c - FONT_START) * char_size_bytes + FONT_DATA_OFFSET];
Byrn 0:21cb91208386 177 for (int i = 0; i < char_width; i++)
Byrn 0:21cb91208386 178 _screen[(x + i) + (y * SSD1306_LCDWIDTH)] = font[(c - FONT_START) * (char_size_bytes) + i + FONT_DATA_OFFSET + 1];
Byrn 0:21cb91208386 179
Byrn 0:21cb91208386 180 _cursor_x = x + char_width;
Byrn 0:21cb91208386 181 _cursor_y = y;
Byrn 0:21cb91208386 182 }
Byrn 0:21cb91208386 183
Byrn 0:21cb91208386 184 void SSD1306::clear()
Byrn 0:21cb91208386 185 {
Byrn 0:21cb91208386 186 for (int i = 0; i < 1024; i++)
Byrn 0:21cb91208386 187 _screen[i] = 0;
Byrn 0:21cb91208386 188 }
Byrn 0:21cb91208386 189
Byrn 0:21cb91208386 190 void SSD1306::_send_command(int code)
Byrn 0:21cb91208386 191 {
Byrn 0:21cb91208386 192 _cs = 1;
Byrn 0:21cb91208386 193 _dc = 0;
Byrn 0:21cb91208386 194 _cs = 0;
Byrn 0:21cb91208386 195 _spi.write(code);
Byrn 0:21cb91208386 196 _cs = 1;
Byrn 0:21cb91208386 197 }
Byrn 0:21cb91208386 198
Byrn 0:21cb91208386 199 void SSD1306::_send_data(int value)
Byrn 0:21cb91208386 200 {
Byrn 0:21cb91208386 201 _cs = 1;
Byrn 0:21cb91208386 202 _dc = 1;
Byrn 0:21cb91208386 203 _cs = 0;
Byrn 0:21cb91208386 204 _spi.write(value);
Byrn 0:21cb91208386 205 _cs = 1;
Byrn 0:21cb91208386 206 }
Byrn 0:21cb91208386 207