Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of SSD1306 by
ssd1306.cpp@3:1d9df877c90a, 2013-02-09 (annotated)
- Committer:
- Byrn
- Date:
- Sat Feb 09 16:43:49 2013 +0000
- Revision:
- 3:1d9df877c90a
- Parent:
- 2:e479b0296757
- Child:
- 4:3bfab336f638
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?
| User | Revision | Line number | New 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 | } |
