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