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();
    }
}
Committer:
Byrn
Date:
Sat Feb 09 16:43:49 2013 +0000
Revision:
3:1d9df877c90a
Parent:
2:e479b0296757
Completely changed the way fonts work and added printf(), putc() etc.  Now only 8 pixel high fonts are supported, but multiple widths.  Added auto-scrolling from the bottom of the display.  Also replaced the original "smallfont" with two new fonts.

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 3:1d9df877c90a 5 #include <stdarg.h>
Byrn 3:1d9df877c90a 6
Byrn 0:21cb91208386 7 SSD1306::SSD1306(PinName cs, PinName rs, PinName dc, PinName clk, PinName data)
Byrn 1:1d58d378221c 8 : _spi(data, NC, clk),
Byrn 1:1d58d378221c 9 _cs(cs),
Byrn 1:1d58d378221c 10 _reset(rs),
Byrn 3:1d9df877c90a 11 _dc(dc),
Byrn 3:1d9df877c90a 12 _cursor_x(0),
Byrn 3:1d9df877c90a 13 _cursor_y(0)
Byrn 0:21cb91208386 14 {
Byrn 0:21cb91208386 15 }
Byrn 0:21cb91208386 16
Byrn 0:21cb91208386 17 void SSD1306::off()
Byrn 0:21cb91208386 18 {
Byrn 2:e479b0296757 19 _send_command(0xAE);
Byrn 0:21cb91208386 20 }
Byrn 0:21cb91208386 21
Byrn 0:21cb91208386 22 void SSD1306::on()
Byrn 0:21cb91208386 23 {
Byrn 2:e479b0296757 24 _send_command(0xAF);
Byrn 0:21cb91208386 25 }
Byrn 0:21cb91208386 26
Byrn 1:1d58d378221c 27 void SSD1306::sleep()
Byrn 1:1d58d378221c 28 {
Byrn 1:1d58d378221c 29 _send_command(0xAE);
Byrn 1:1d58d378221c 30 }
Byrn 1:1d58d378221c 31
Byrn 1:1d58d378221c 32 void SSD1306::wake()
Byrn 0:21cb91208386 33 {
Byrn 1:1d58d378221c 34 _send_command(0xAF);
Byrn 1:1d58d378221c 35 }
Byrn 1:1d58d378221c 36
Byrn 1:1d58d378221c 37 void SSD1306::set_inverse(unsigned char value)
Byrn 1:1d58d378221c 38 {
Byrn 1:1d58d378221c 39 _send_command(value ? 0xA7 : 0xA6);
Byrn 1:1d58d378221c 40 }
Byrn 1:1d58d378221c 41
Byrn 1:1d58d378221c 42 void SSD1306::set_display_offset(unsigned char value)
Byrn 1:1d58d378221c 43 {
Byrn 1:1d58d378221c 44 _send_command(0xD3);
Byrn 2:e479b0296757 45 _send_command(value & 0x3F);
Byrn 0:21cb91208386 46 }
Byrn 0:21cb91208386 47
Byrn 1:1d58d378221c 48 void SSD1306::set_contrast(unsigned char value)
Byrn 1:1d58d378221c 49 {
Byrn 1:1d58d378221c 50 _send_command(0x81);
Byrn 1:1d58d378221c 51 _send_command(value);
Byrn 1:1d58d378221c 52 }
Byrn 1:1d58d378221c 53
Byrn 1:1d58d378221c 54 void SSD1306::set_display_start_line(unsigned char value)
Byrn 1:1d58d378221c 55 {
Byrn 1:1d58d378221c 56 _send_command(0x40 | value);
Byrn 1:1d58d378221c 57 }
Byrn 1:1d58d378221c 58
Byrn 2:e479b0296757 59 void SSD1306::set_segment_remap(unsigned char value)
Byrn 0:21cb91208386 60 {
Byrn 1:1d58d378221c 61 _send_command(value ? 0xA1 : 0xA0);
Byrn 1:1d58d378221c 62 }
Byrn 1:1d58d378221c 63
Byrn 1:1d58d378221c 64 void SSD1306::set_multiplex_ratio(unsigned char value)
Byrn 1:1d58d378221c 65 {
Byrn 2:e479b0296757 66 _send_command(0xA8);
Byrn 2:e479b0296757 67 _send_command(value & 0x3F);
Byrn 1:1d58d378221c 68 }
Byrn 1:1d58d378221c 69
Byrn 1:1d58d378221c 70 void SSD1306::set_com_output_scan_direction(unsigned char value)
Byrn 1:1d58d378221c 71 {
Byrn 1:1d58d378221c 72 _send_command(value ? 0xC8 : 0xC0);
Byrn 1:1d58d378221c 73 }
Byrn 1:1d58d378221c 74
Byrn 1:1d58d378221c 75 void SSD1306::set_com_pins_hardware_configuration(unsigned char sequential, unsigned char lr_remap)
Byrn 1:1d58d378221c 76 {
Byrn 1:1d58d378221c 77 _send_command(0xDA);
Byrn 2:e479b0296757 78 _send_command(0x02 | ((sequential & 1) << 4) | ((lr_remap & 1) << 5));
Byrn 2:e479b0296757 79 }
Byrn 2:e479b0296757 80
Byrn 2:e479b0296757 81 void SSD1306::start_horizontal_scroll(unsigned char direction, unsigned char start, unsigned char end, unsigned char interval)
Byrn 2:e479b0296757 82 {
Byrn 2:e479b0296757 83 _send_command(direction ? 0x27 : 0x26);
Byrn 2:e479b0296757 84 _send_command(0x00);
Byrn 2:e479b0296757 85 _send_command(start & 0x07);
Byrn 2:e479b0296757 86 switch (interval) {
Byrn 2:e479b0296757 87 case 2: _send_command(0x07); break; // 111b
Byrn 2:e479b0296757 88 case 3: _send_command(0x04); break; // 100b
Byrn 2:e479b0296757 89 case 4: _send_command(0x05); break; // 101b
Byrn 2:e479b0296757 90 case 5: _send_command(0x00); break; // 000b
Byrn 2:e479b0296757 91 case 25: _send_command(0x06); break; // 110b
Byrn 2:e479b0296757 92 case 64: _send_command(0x01); break; // 001b
Byrn 2:e479b0296757 93 case 128: _send_command(0x02); break; // 010b
Byrn 2:e479b0296757 94 case 256: _send_command(0x03); break; // 011b
Byrn 2:e479b0296757 95 default:
Byrn 2:e479b0296757 96 // default to 2 frame interval
Byrn 2:e479b0296757 97 _send_command(0x07); break;
Byrn 2:e479b0296757 98 }
Byrn 2:e479b0296757 99 _send_command(end & 0x07);
Byrn 2:e479b0296757 100 _send_command(0x00);
Byrn 2:e479b0296757 101 _send_command(0xFF);
Byrn 2:e479b0296757 102
Byrn 2:e479b0296757 103 // activate scroll
Byrn 2:e479b0296757 104 _send_command(0x2F);
Byrn 2:e479b0296757 105 }
Byrn 2:e479b0296757 106
Byrn 2:e479b0296757 107 void SSD1306::start_vertical_and_horizontal_scroll(unsigned char direction, unsigned char start, unsigned char end, unsigned char interval, unsigned char vertical_offset)
Byrn 2:e479b0296757 108 {
Byrn 2:e479b0296757 109 _send_command(direction ? 0x2A : 0x29);
Byrn 2:e479b0296757 110 _send_command(0x00);
Byrn 2:e479b0296757 111 _send_command(start & 0x07);
Byrn 2:e479b0296757 112 switch (interval) {
Byrn 2:e479b0296757 113 case 2: _send_command(0x07); break; // 111b
Byrn 2:e479b0296757 114 case 3: _send_command(0x04); break; // 100b
Byrn 2:e479b0296757 115 case 4: _send_command(0x05); break; // 101b
Byrn 2:e479b0296757 116 case 5: _send_command(0x00); break; // 000b
Byrn 2:e479b0296757 117 case 25: _send_command(0x06); break; // 110b
Byrn 2:e479b0296757 118 case 64: _send_command(0x01); break; // 001b
Byrn 2:e479b0296757 119 case 128: _send_command(0x02); break; // 010b
Byrn 2:e479b0296757 120 case 256: _send_command(0x03); break; // 011b
Byrn 2:e479b0296757 121 default:
Byrn 2:e479b0296757 122 // default to 2 frame interval
Byrn 2:e479b0296757 123 _send_command(0x07); break;
Byrn 2:e479b0296757 124 }
Byrn 2:e479b0296757 125 _send_command(end & 0x07);
Byrn 2:e479b0296757 126 _send_command(vertical_offset);
Byrn 2:e479b0296757 127
Byrn 2:e479b0296757 128 // activate scroll
Byrn 2:e479b0296757 129 _send_command(0x2F);
Byrn 2:e479b0296757 130 }
Byrn 2:e479b0296757 131
Byrn 2:e479b0296757 132 void SSD1306::stop_scroll()
Byrn 2:e479b0296757 133 {
Byrn 2:e479b0296757 134 // all scroll configurations are removed from the display when executing this command.
Byrn 2:e479b0296757 135 _send_command(0x2E);
Byrn 2:e479b0296757 136 }
Byrn 2:e479b0296757 137
Byrn 2:e479b0296757 138 void SSD1306::pam_set_start_address(unsigned char address)
Byrn 2:e479b0296757 139 {
Byrn 2:e479b0296757 140 // "Set Lower Column Start Address for Page Addressing Mode"
Byrn 2:e479b0296757 141 _send_command(address & 0x0F);
Byrn 2:e479b0296757 142
Byrn 2:e479b0296757 143 // "Set Higher Column Start Address for Page Addressing Mode"
Byrn 2:e479b0296757 144 _send_command((address << 4) & 0x0F);
Byrn 2:e479b0296757 145 }
Byrn 2:e479b0296757 146
Byrn 2:e479b0296757 147 void SSD1306::set_memory_addressing_mode(unsigned char mode)
Byrn 2:e479b0296757 148 {
Byrn 2:e479b0296757 149 _send_command(0x20);
Byrn 2:e479b0296757 150 _send_command(mode & 0x3);
Byrn 2:e479b0296757 151 }
Byrn 2:e479b0296757 152
Byrn 2:e479b0296757 153 void SSD1306::hv_set_column_address(unsigned char start, unsigned char end)
Byrn 2:e479b0296757 154 {
Byrn 2:e479b0296757 155 _send_command(0x21);
Byrn 2:e479b0296757 156 _send_command(start & 0x7F);
Byrn 2:e479b0296757 157 _send_command(end & 0x7F);
Byrn 2:e479b0296757 158 }
Byrn 2:e479b0296757 159
Byrn 2:e479b0296757 160 void SSD1306::hv_set_page_address(unsigned char start, unsigned char end)
Byrn 2:e479b0296757 161 {
Byrn 2:e479b0296757 162 _send_command(0x22);
Byrn 2:e479b0296757 163 _send_command(start & 0x07);
Byrn 2:e479b0296757 164 _send_command(end & 0x07);
Byrn 2:e479b0296757 165 }
Byrn 2:e479b0296757 166
Byrn 2:e479b0296757 167 void SSD1306::pam_set_page_start(unsigned char address)
Byrn 2:e479b0296757 168 {
Byrn 2:e479b0296757 169 _send_command(0xB0 | (address & 0x07));
Byrn 2:e479b0296757 170 }
Byrn 2:e479b0296757 171
Byrn 2:e479b0296757 172 void SSD1306::set_display_clock_ratio_and_frequency(unsigned char ratio, unsigned char frequency)
Byrn 2:e479b0296757 173 {
Byrn 2:e479b0296757 174 _send_command(0xD5);
Byrn 2:e479b0296757 175 _send_command((ratio & 0x0F) | ((frequency & 0x0F) << 4));
Byrn 2:e479b0296757 176 }
Byrn 2:e479b0296757 177
Byrn 2:e479b0296757 178 void SSD1306::set_precharge_period(unsigned char phase1, unsigned char phase2)
Byrn 2:e479b0296757 179 {
Byrn 2:e479b0296757 180 _send_command(0xD9);
Byrn 2:e479b0296757 181 _send_command((phase1 & 0x0F) | ((phase2 & 0x0F ) << 4));
Byrn 2:e479b0296757 182 }
Byrn 2:e479b0296757 183
Byrn 2:e479b0296757 184 void SSD1306::set_vcomh_deselect_level(unsigned char level)
Byrn 2:e479b0296757 185 {
Byrn 2:e479b0296757 186 _send_command(0xDB);
Byrn 2:e479b0296757 187 _send_command((level & 0x03) << 4);
Byrn 2:e479b0296757 188 }
Byrn 2:e479b0296757 189
Byrn 2:e479b0296757 190 void SSD1306::nop()
Byrn 2:e479b0296757 191 {
Byrn 2:e479b0296757 192 _send_command(0xE3);
Byrn 2:e479b0296757 193 }
Byrn 2:e479b0296757 194
Byrn 2:e479b0296757 195 void SSD1306::set_charge_pump_enable(unsigned char enable)
Byrn 2:e479b0296757 196 {
Byrn 2:e479b0296757 197 _send_command(0x8D);
Byrn 2:e479b0296757 198 _send_command(enable ? 0x14 : 0x10);
Byrn 0:21cb91208386 199 }
Byrn 0:21cb91208386 200
Byrn 0:21cb91208386 201 void SSD1306::initialise()
Byrn 0:21cb91208386 202 {
Byrn 1:1d58d378221c 203 // Init
Byrn 0:21cb91208386 204 _reset = 1;
Byrn 0:21cb91208386 205 wait(0.01);
Byrn 0:21cb91208386 206 _reset = 0;
Byrn 0:21cb91208386 207 wait(0.10);
Byrn 0:21cb91208386 208 _reset = 1;
Byrn 0:21cb91208386 209
Byrn 0:21cb91208386 210 off();
Byrn 2:e479b0296757 211
Byrn 2:e479b0296757 212 set_display_clock_ratio_and_frequency(0, 8);
Byrn 2:e479b0296757 213 set_multiplex_ratio(0x3F); // 1/64 duty
Byrn 2:e479b0296757 214 set_precharge_period(0xF, 0x01);
Byrn 2:e479b0296757 215 set_display_offset(0);
Byrn 2:e479b0296757 216 set_display_start_line(0);
Byrn 2:e479b0296757 217 set_charge_pump_enable(1);
Byrn 3:1d9df877c90a 218 set_memory_addressing_mode(0); // horizontal addressing mode; across then down
Byrn 2:e479b0296757 219 set_segment_remap(1);
Byrn 2:e479b0296757 220 set_com_output_scan_direction(1);
Byrn 2:e479b0296757 221 set_com_pins_hardware_configuration(1, 0);
Byrn 1:1d58d378221c 222 set_contrast(0xFF);
Byrn 2:e479b0296757 223 set_vcomh_deselect_level(1);
Byrn 1:1d58d378221c 224
Byrn 2:e479b0296757 225 wake();
Byrn 2:e479b0296757 226 set_inverse(0);
Byrn 0:21cb91208386 227
Byrn 2:e479b0296757 228 hv_set_column_address(0, 127);
Byrn 2:e479b0296757 229 hv_set_page_address(0, 7);
Byrn 0:21cb91208386 230
Byrn 2:e479b0296757 231 pam_set_start_address(0);
Byrn 2:e479b0296757 232 pam_set_page_start(0);
Byrn 2:e479b0296757 233
Byrn 2:e479b0296757 234 // set_precharge_period(2, 2);
Byrn 0:21cb91208386 235 }
Byrn 0:21cb91208386 236
Byrn 0:21cb91208386 237 void SSD1306::update()
Byrn 0:21cb91208386 238 {
Byrn 2:e479b0296757 239 hv_set_column_address(0, 127);
Byrn 2:e479b0296757 240 hv_set_page_address(0, 7);
Byrn 0:21cb91208386 241
Byrn 0:21cb91208386 242 for (int i = 0; i < 1024; i++)
Byrn 0:21cb91208386 243 _send_data(_screen[i]);
Byrn 0:21cb91208386 244 }
Byrn 0:21cb91208386 245
Byrn 0:21cb91208386 246 void SSD1306::set_pixel(int x, int y)
Byrn 0:21cb91208386 247 {
Byrn 0:21cb91208386 248 if (x >= SSD1306_LCDWIDTH || y >= SSD1306_LCDHEIGHT) return;
Byrn 0:21cb91208386 249
Byrn 0:21cb91208386 250 _screen[x + (y / 8) * 128] |= 1 << (y % 8);
Byrn 0:21cb91208386 251 }
Byrn 0:21cb91208386 252
Byrn 0:21cb91208386 253 void SSD1306::clear_pixel(int x, int y)
Byrn 0:21cb91208386 254 {
Byrn 0:21cb91208386 255 if (x >= SSD1306_LCDWIDTH || y >= SSD1306_LCDHEIGHT) return;
Byrn 0:21cb91208386 256
Byrn 0:21cb91208386 257 _screen[x + (y / 8) * 128] &= ~(1 << (y % 8));
Byrn 0:21cb91208386 258 }
Byrn 0:21cb91208386 259
Byrn 0:21cb91208386 260 void SSD1306::line(int x0, int y0, int x1, int y1) {
Byrn 0:21cb91208386 261 int steep = abs(y1 - y0) > abs(x1 - x0);
Byrn 0:21cb91208386 262 int t;
Byrn 0:21cb91208386 263
Byrn 0:21cb91208386 264 if (steep) {
Byrn 0:21cb91208386 265 t = x0; x0 = y0; y0 = t;
Byrn 0:21cb91208386 266 t = x1; x1 = y1; y1 = t;
Byrn 0:21cb91208386 267 }
Byrn 0:21cb91208386 268
Byrn 0:21cb91208386 269 if (x0 > x1) {
Byrn 0:21cb91208386 270 t = x0; x0 = x1; x1 = t;
Byrn 0:21cb91208386 271 t = y0; y0 = y1; y1 = t;
Byrn 0:21cb91208386 272 }
Byrn 0:21cb91208386 273
Byrn 0:21cb91208386 274 int dx, dy;
Byrn 0:21cb91208386 275
Byrn 0:21cb91208386 276 dx = x1 - x0;
Byrn 0:21cb91208386 277 dy = abs(y1 - y0);
Byrn 0:21cb91208386 278
Byrn 0:21cb91208386 279 int err = dx / 2;
Byrn 0:21cb91208386 280 int ystep;
Byrn 0:21cb91208386 281
Byrn 0:21cb91208386 282 if (y0 < y1) {
Byrn 0:21cb91208386 283 ystep = 1;
Byrn 0:21cb91208386 284 } else {
Byrn 0:21cb91208386 285 ystep = -1;}
Byrn 0:21cb91208386 286
Byrn 0:21cb91208386 287 for (; x0<x1; x0++) {
Byrn 0:21cb91208386 288 if (steep) {
Byrn 0:21cb91208386 289 set_pixel(y0, x0);
Byrn 0:21cb91208386 290 } else {
Byrn 0:21cb91208386 291 set_pixel(x0, y0);
Byrn 0:21cb91208386 292 }
Byrn 0:21cb91208386 293 err -= dy;
Byrn 0:21cb91208386 294 if (err < 0) {
Byrn 0:21cb91208386 295 y0 += ystep;
Byrn 0:21cb91208386 296 err += dx;
Byrn 0:21cb91208386 297 }
Byrn 0:21cb91208386 298 }
Byrn 0:21cb91208386 299 }
Byrn 0:21cb91208386 300
Byrn 3:1d9df877c90a 301 void SSD1306::set_font(unsigned char *font, unsigned int width)
Byrn 0:21cb91208386 302 {
Byrn 3:1d9df877c90a 303 _console_font_data = font;
Byrn 3:1d9df877c90a 304 _console_font_width = width;
Byrn 3:1d9df877c90a 305 }
Byrn 3:1d9df877c90a 306
Byrn 3:1d9df877c90a 307 void SSD1306::set_double_height_text(unsigned int double_height)
Byrn 3:1d9df877c90a 308 {
Byrn 3:1d9df877c90a 309 _double_height_text = double_height;
Byrn 0:21cb91208386 310 }
Byrn 0:21cb91208386 311
Byrn 3:1d9df877c90a 312 void SSD1306::putc(unsigned char c)
Byrn 0:21cb91208386 313 {
Byrn 3:1d9df877c90a 314 while (_cursor_x >= (128 / _console_font_width))
Byrn 3:1d9df877c90a 315 {
Byrn 3:1d9df877c90a 316 _cursor_x -= (128 / _console_font_width);
Byrn 3:1d9df877c90a 317 _cursor_y++;
Byrn 3:1d9df877c90a 318 }
Byrn 3:1d9df877c90a 319
Byrn 3:1d9df877c90a 320 while (_cursor_y > 7)
Byrn 3:1d9df877c90a 321 {
Byrn 3:1d9df877c90a 322 scroll_up();
Byrn 3:1d9df877c90a 323 }
Byrn 3:1d9df877c90a 324
Byrn 3:1d9df877c90a 325 switch (c)
Byrn 3:1d9df877c90a 326 {
Byrn 3:1d9df877c90a 327 case '\n':
Byrn 3:1d9df877c90a 328 _cursor_y++;
Byrn 3:1d9df877c90a 329 break;
Byrn 3:1d9df877c90a 330
Byrn 3:1d9df877c90a 331 case '\r':
Byrn 3:1d9df877c90a 332 _cursor_x = 0;
Byrn 3:1d9df877c90a 333 break;
Byrn 3:1d9df877c90a 334
Byrn 3:1d9df877c90a 335 case '\t':
Byrn 3:1d9df877c90a 336 _cursor_x = (_cursor_x + 4) % 4;
Byrn 3:1d9df877c90a 337 break;
Byrn 3:1d9df877c90a 338
Byrn 3:1d9df877c90a 339 default:
Byrn 3:1d9df877c90a 340 for (int b = 0; b < _console_font_width; b++)
Byrn 3:1d9df877c90a 341 {
Byrn 3:1d9df877c90a 342 _screen[_cursor_x * _console_font_width + _cursor_y * 128 + b] = _console_font_data[(c - FONT_START) * _console_font_width + b];
Byrn 3:1d9df877c90a 343 }
Byrn 3:1d9df877c90a 344
Byrn 3:1d9df877c90a 345 _cursor_x++;
Byrn 3:1d9df877c90a 346 }
Byrn 3:1d9df877c90a 347 }
Byrn 3:1d9df877c90a 348
Byrn 3:1d9df877c90a 349 void SSD1306::scroll_up()
Byrn 3:1d9df877c90a 350 {
Byrn 3:1d9df877c90a 351 for (int y = 1; y <= 7; y++)
Byrn 3:1d9df877c90a 352 {
Byrn 3:1d9df877c90a 353 for (int x = 0; x < 128; x++)
Byrn 3:1d9df877c90a 354 {
Byrn 3:1d9df877c90a 355 _screen[x + 128 * (y - 1)] = _screen[x + 128 * y];
Byrn 3:1d9df877c90a 356 }
Byrn 3:1d9df877c90a 357 }
Byrn 0:21cb91208386 358
Byrn 3:1d9df877c90a 359 for (int x = 0; x < 128; x++)
Byrn 3:1d9df877c90a 360 {
Byrn 3:1d9df877c90a 361 _screen[x + 128 * 7] = 0;
Byrn 3:1d9df877c90a 362 }
Byrn 3:1d9df877c90a 363
Byrn 3:1d9df877c90a 364 _cursor_y--;
Byrn 3:1d9df877c90a 365 }
Byrn 3:1d9df877c90a 366
Byrn 3:1d9df877c90a 367 void SSD1306::printf(const char *format, ...)
Byrn 3:1d9df877c90a 368 {
Byrn 3:1d9df877c90a 369 static char buffer[128];
Byrn 3:1d9df877c90a 370
Byrn 3:1d9df877c90a 371 va_list args;
Byrn 3:1d9df877c90a 372 va_start(args, format);
Byrn 3:1d9df877c90a 373 vsprintf(buffer, format, args);
Byrn 3:1d9df877c90a 374 va_end(args);
Byrn 3:1d9df877c90a 375
Byrn 3:1d9df877c90a 376 char *c = (char *)&buffer;
Byrn 3:1d9df877c90a 377 while (*c != 0)
Byrn 3:1d9df877c90a 378 {
Byrn 3:1d9df877c90a 379 putc(*c++);
Byrn 3:1d9df877c90a 380 }
Byrn 0:21cb91208386 381 }
Byrn 0:21cb91208386 382
Byrn 0:21cb91208386 383 void SSD1306::clear()
Byrn 0:21cb91208386 384 {
Byrn 0:21cb91208386 385 for (int i = 0; i < 1024; i++)
Byrn 0:21cb91208386 386 _screen[i] = 0;
Byrn 3:1d9df877c90a 387
Byrn 3:1d9df877c90a 388 _cursor_x = 0;
Byrn 3:1d9df877c90a 389 _cursor_y = 0;
Byrn 0:21cb91208386 390 }
Byrn 0:21cb91208386 391
Byrn 1:1d58d378221c 392 void SSD1306::_send_command(unsigned char code)
Byrn 0:21cb91208386 393 {
Byrn 0:21cb91208386 394 _cs = 1;
Byrn 0:21cb91208386 395 _dc = 0;
Byrn 0:21cb91208386 396 _cs = 0;
Byrn 0:21cb91208386 397 _spi.write(code);
Byrn 0:21cb91208386 398 _cs = 1;
Byrn 0:21cb91208386 399 }
Byrn 0:21cb91208386 400
Byrn 1:1d58d378221c 401 void SSD1306::_send_data(unsigned char value)
Byrn 0:21cb91208386 402 {
Byrn 0:21cb91208386 403 _cs = 1;
Byrn 0:21cb91208386 404 _dc = 1;
Byrn 0:21cb91208386 405 _cs = 0;
Byrn 0:21cb91208386 406 _spi.write(value);
Byrn 0:21cb91208386 407 _cs = 1;
Byrn 0:21cb91208386 408 }