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.
SSD1606/ssd1606.cpp@0:33994cfad0c2, 2014-06-01 (annotated)
- Committer:
- allankliu
- Date:
- Sun Jun 01 00:47:23 2014 +0000
- Revision:
- 0:33994cfad0c2
- Child:
- 2:bb9f154ea2f4
Initial version, reuse code from lpc1114uart, ssd1306, previous code spd2706 and others.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| allankliu | 0:33994cfad0c2 | 1 | |
| allankliu | 0:33994cfad0c2 | 2 | #include "mbed.h" |
| allankliu | 0:33994cfad0c2 | 3 | #include "ssd1606.h" |
| allankliu | 0:33994cfad0c2 | 4 | #include "image.h" |
| allankliu | 0:33994cfad0c2 | 5 | |
| allankliu | 0:33994cfad0c2 | 6 | #include <stdarg.h> |
| allankliu | 0:33994cfad0c2 | 7 | |
| allankliu | 0:33994cfad0c2 | 8 | const unsigned char init_data[]={ |
| allankliu | 0:33994cfad0c2 | 9 | 0x82,0x00,0x00,0x00,0xAA,0x00,0x00,0x00, |
| allankliu | 0:33994cfad0c2 | 10 | 0xAA,0xAA,0x00,0x00,0xAA,0xAA,0xAA,0x00, |
| allankliu | 0:33994cfad0c2 | 11 | 0x55,0xAA,0xAA,0x00,0x55,0x55,0x55,0x55, |
| allankliu | 0:33994cfad0c2 | 12 | 0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55, |
| allankliu | 0:33994cfad0c2 | 13 | 0xAA,0xAA,0xAA,0xAA,0x15,0x15,0x15,0x15, |
| allankliu | 0:33994cfad0c2 | 14 | 0x05,0x05,0x05,0x05,0x01,0x01,0x01,0x01, |
| allankliu | 0:33994cfad0c2 | 15 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
| allankliu | 0:33994cfad0c2 | 16 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
| allankliu | 0:33994cfad0c2 | 17 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
| allankliu | 0:33994cfad0c2 | 18 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
| allankliu | 0:33994cfad0c2 | 19 | 0x41,0x45,0xF1,0xFF,0x5F,0x55,0x01,0x00, |
| allankliu | 0:33994cfad0c2 | 20 | 0x00,0x00,}; |
| allankliu | 0:33994cfad0c2 | 21 | |
| allankliu | 0:33994cfad0c2 | 22 | |
| allankliu | 0:33994cfad0c2 | 23 | SSD1606::SSD1606(PinName cs, PinName rst, PinName dc, PinName clk, PinName busy, PinName data) |
| allankliu | 0:33994cfad0c2 | 24 | : _spi(data, NC, clk), |
| allankliu | 0:33994cfad0c2 | 25 | _cs(cs), |
| allankliu | 0:33994cfad0c2 | 26 | _reset(rst), |
| allankliu | 0:33994cfad0c2 | 27 | _dc(dc), |
| allankliu | 0:33994cfad0c2 | 28 | _busy(busy), |
| allankliu | 0:33994cfad0c2 | 29 | _cursor_x(0), |
| allankliu | 0:33994cfad0c2 | 30 | _cursor_y(0) |
| allankliu | 0:33994cfad0c2 | 31 | { |
| allankliu | 0:33994cfad0c2 | 32 | } |
| allankliu | 0:33994cfad0c2 | 33 | |
| allankliu | 0:33994cfad0c2 | 34 | void SSD1606::reset() |
| allankliu | 0:33994cfad0c2 | 35 | { |
| allankliu | 0:33994cfad0c2 | 36 | _reset = 1; |
| allankliu | 0:33994cfad0c2 | 37 | wait(0.01); |
| allankliu | 0:33994cfad0c2 | 38 | _reset = 0; |
| allankliu | 0:33994cfad0c2 | 39 | wait(0.01); |
| allankliu | 0:33994cfad0c2 | 40 | _reset = 1; |
| allankliu | 0:33994cfad0c2 | 41 | wait(0.01); |
| allankliu | 0:33994cfad0c2 | 42 | } |
| allankliu | 0:33994cfad0c2 | 43 | |
| allankliu | 0:33994cfad0c2 | 44 | void SSD1606::initialize() |
| allankliu | 0:33994cfad0c2 | 45 | { |
| allankliu | 0:33994cfad0c2 | 46 | reset(); |
| allankliu | 0:33994cfad0c2 | 47 | _send_command(0x10); |
| allankliu | 0:33994cfad0c2 | 48 | _send_data(0x00); |
| allankliu | 0:33994cfad0c2 | 49 | #ifdef MODE3 |
| allankliu | 0:33994cfad0c2 | 50 | _send_command(0x11); |
| allankliu | 0:33994cfad0c2 | 51 | _send_data(0x03); |
| allankliu | 0:33994cfad0c2 | 52 | _send_command(0x44); |
| allankliu | 0:33994cfad0c2 | 53 | _send_data(0x00); |
| allankliu | 0:33994cfad0c2 | 54 | _send_data(0x11); |
| allankliu | 0:33994cfad0c2 | 55 | _send_command(0x45); |
| allankliu | 0:33994cfad0c2 | 56 | _send_data(0x00); |
| allankliu | 0:33994cfad0c2 | 57 | _send_data(0xAB); |
| allankliu | 0:33994cfad0c2 | 58 | _send_command(0x4E); |
| allankliu | 0:33994cfad0c2 | 59 | _send_data(0x00); |
| allankliu | 0:33994cfad0c2 | 60 | _send_command(0x4F); |
| allankliu | 0:33994cfad0c2 | 61 | _send_data(0x00); |
| allankliu | 0:33994cfad0c2 | 62 | #endif |
| allankliu | 0:33994cfad0c2 | 63 | #ifdef MODE2 |
| allankliu | 0:33994cfad0c2 | 64 | _send_command(0x11); |
| allankliu | 0:33994cfad0c2 | 65 | _send_data(0x02); |
| allankliu | 0:33994cfad0c2 | 66 | _send_command(0x44); |
| allankliu | 0:33994cfad0c2 | 67 | _send_data(0x11); |
| allankliu | 0:33994cfad0c2 | 68 | _send_data(0x00); |
| allankliu | 0:33994cfad0c2 | 69 | _send_command(0x45); |
| allankliu | 0:33994cfad0c2 | 70 | _send_data(0x00); |
| allankliu | 0:33994cfad0c2 | 71 | _send_data(0xAB); |
| allankliu | 0:33994cfad0c2 | 72 | _send_command(0x4E); |
| allankliu | 0:33994cfad0c2 | 73 | _send_data(0x11); |
| allankliu | 0:33994cfad0c2 | 74 | _send_command(0x4F); |
| allankliu | 0:33994cfad0c2 | 75 | _send_data(0x00); |
| allankliu | 0:33994cfad0c2 | 76 | #endif |
| allankliu | 0:33994cfad0c2 | 77 | #ifdef MODE1 |
| allankliu | 0:33994cfad0c2 | 78 | _send_command(0x11); |
| allankliu | 0:33994cfad0c2 | 79 | _send_data(0x01); |
| allankliu | 0:33994cfad0c2 | 80 | _send_command(0x44); |
| allankliu | 0:33994cfad0c2 | 81 | _send_data(0x00); |
| allankliu | 0:33994cfad0c2 | 82 | _send_data(0x11); |
| allankliu | 0:33994cfad0c2 | 83 | _send_command(0x45); |
| allankliu | 0:33994cfad0c2 | 84 | _send_data(0xAB); |
| allankliu | 0:33994cfad0c2 | 85 | _send_data(0x00); |
| allankliu | 0:33994cfad0c2 | 86 | _send_command(0x4E); |
| allankliu | 0:33994cfad0c2 | 87 | _send_data(0x00); |
| allankliu | 0:33994cfad0c2 | 88 | _send_command(0x4F); |
| allankliu | 0:33994cfad0c2 | 89 | _send_data(0xAB); |
| allankliu | 0:33994cfad0c2 | 90 | #endif |
| allankliu | 0:33994cfad0c2 | 91 | #ifdef MODE0 |
| allankliu | 0:33994cfad0c2 | 92 | _send_command(0x11); |
| allankliu | 0:33994cfad0c2 | 93 | _send_data(0x00); |
| allankliu | 0:33994cfad0c2 | 94 | _send_command(0x44); |
| allankliu | 0:33994cfad0c2 | 95 | _send_data(0x11); |
| allankliu | 0:33994cfad0c2 | 96 | _send_data(0x00); |
| allankliu | 0:33994cfad0c2 | 97 | _send_command(0x45); |
| allankliu | 0:33994cfad0c2 | 98 | _send_data(0xAB); |
| allankliu | 0:33994cfad0c2 | 99 | _send_data(0x00); |
| allankliu | 0:33994cfad0c2 | 100 | _send_command(0x4E); |
| allankliu | 0:33994cfad0c2 | 101 | _send_data(0x11); |
| allankliu | 0:33994cfad0c2 | 102 | _send_command(0x4F); |
| allankliu | 0:33994cfad0c2 | 103 | _send_data(0xAB); |
| allankliu | 0:33994cfad0c2 | 104 | #endif |
| allankliu | 0:33994cfad0c2 | 105 | _send_command(0xF0); |
| allankliu | 0:33994cfad0c2 | 106 | _send_data(0x1F); |
| allankliu | 0:33994cfad0c2 | 107 | _send_command(0x21); |
| allankliu | 0:33994cfad0c2 | 108 | _send_data(0x03); |
| allankliu | 0:33994cfad0c2 | 109 | _send_command(0x2C); |
| allankliu | 0:33994cfad0c2 | 110 | _send_data(0xA0); |
| allankliu | 0:33994cfad0c2 | 111 | _send_command(0x3C); |
| allankliu | 0:33994cfad0c2 | 112 | _send_data(0x63); |
| allankliu | 0:33994cfad0c2 | 113 | _send_command(0x22); |
| allankliu | 0:33994cfad0c2 | 114 | _send_data(0xC4); |
| allankliu | 0:33994cfad0c2 | 115 | |
| allankliu | 0:33994cfad0c2 | 116 | set_lut(); |
| allankliu | 0:33994cfad0c2 | 117 | } |
| allankliu | 0:33994cfad0c2 | 118 | |
| allankliu | 0:33994cfad0c2 | 119 | unsigned char SSD1606::is_busy() |
| allankliu | 0:33994cfad0c2 | 120 | { |
| allankliu | 0:33994cfad0c2 | 121 | return(0); |
| allankliu | 0:33994cfad0c2 | 122 | } |
| allankliu | 0:33994cfad0c2 | 123 | |
| allankliu | 0:33994cfad0c2 | 124 | void SSD1606::rom_image(const unsigned char *bitmap) |
| allankliu | 0:33994cfad0c2 | 125 | { |
| allankliu | 0:33994cfad0c2 | 126 | int i; |
| allankliu | 0:33994cfad0c2 | 127 | _send_command(0x24); |
| allankliu | 0:33994cfad0c2 | 128 | |
| allankliu | 0:33994cfad0c2 | 129 | for (i=0; i <3096; i++) |
| allankliu | 0:33994cfad0c2 | 130 | _send_data(bitmap[i]); |
| allankliu | 0:33994cfad0c2 | 131 | |
| allankliu | 0:33994cfad0c2 | 132 | _send_command(0x20); |
| allankliu | 0:33994cfad0c2 | 133 | wait(0.01); |
| allankliu | 0:33994cfad0c2 | 134 | |
| allankliu | 0:33994cfad0c2 | 135 | } |
| allankliu | 0:33994cfad0c2 | 136 | |
| allankliu | 0:33994cfad0c2 | 137 | void SSD1606::update() |
| allankliu | 0:33994cfad0c2 | 138 | { |
| allankliu | 0:33994cfad0c2 | 139 | for (int i=0; i<3096; i++) |
| allankliu | 0:33994cfad0c2 | 140 | _send_data(_screen[i]); |
| allankliu | 0:33994cfad0c2 | 141 | } |
| allankliu | 0:33994cfad0c2 | 142 | |
| allankliu | 0:33994cfad0c2 | 143 | void SSD1606::off() |
| allankliu | 0:33994cfad0c2 | 144 | { |
| allankliu | 0:33994cfad0c2 | 145 | } |
| allankliu | 0:33994cfad0c2 | 146 | |
| allankliu | 0:33994cfad0c2 | 147 | void SSD1606::sleep() |
| allankliu | 0:33994cfad0c2 | 148 | { |
| allankliu | 0:33994cfad0c2 | 149 | _send_command(0x10); |
| allankliu | 0:33994cfad0c2 | 150 | _send_data(0x01); |
| allankliu | 0:33994cfad0c2 | 151 | } |
| allankliu | 0:33994cfad0c2 | 152 | |
| allankliu | 0:33994cfad0c2 | 153 | void SSD1606::set_command_between_images() |
| allankliu | 0:33994cfad0c2 | 154 | { |
| allankliu | 0:33994cfad0c2 | 155 | _send_command(0x22); |
| allankliu | 0:33994cfad0c2 | 156 | _send_data(0xC7); |
| allankliu | 0:33994cfad0c2 | 157 | _send_command(0x21); |
| allankliu | 0:33994cfad0c2 | 158 | _send_data(0x03); |
| allankliu | 0:33994cfad0c2 | 159 | } |
| allankliu | 0:33994cfad0c2 | 160 | |
| allankliu | 0:33994cfad0c2 | 161 | void SSD1606::clear() |
| allankliu | 0:33994cfad0c2 | 162 | { |
| allankliu | 0:33994cfad0c2 | 163 | for (int i=0; i<3096; i++) |
| allankliu | 0:33994cfad0c2 | 164 | _send_data(0); |
| allankliu | 0:33994cfad0c2 | 165 | _cursor_x = 0; |
| allankliu | 0:33994cfad0c2 | 166 | _cursor_y = 0; |
| allankliu | 0:33994cfad0c2 | 167 | } |
| allankliu | 0:33994cfad0c2 | 168 | |
| allankliu | 0:33994cfad0c2 | 169 | void SSD1606::_send_command(unsigned char code) |
| allankliu | 0:33994cfad0c2 | 170 | { |
| allankliu | 0:33994cfad0c2 | 171 | _cs = 1; |
| allankliu | 0:33994cfad0c2 | 172 | _dc = 0; |
| allankliu | 0:33994cfad0c2 | 173 | _cs = 0; |
| allankliu | 0:33994cfad0c2 | 174 | _spi.write(code); |
| allankliu | 0:33994cfad0c2 | 175 | _cs = 1; |
| allankliu | 0:33994cfad0c2 | 176 | } |
| allankliu | 0:33994cfad0c2 | 177 | |
| allankliu | 0:33994cfad0c2 | 178 | void SSD1606::_send_data(unsigned char value) |
| allankliu | 0:33994cfad0c2 | 179 | { |
| allankliu | 0:33994cfad0c2 | 180 | _cs = 1; |
| allankliu | 0:33994cfad0c2 | 181 | _dc = 1; |
| allankliu | 0:33994cfad0c2 | 182 | _cs = 0; |
| allankliu | 0:33994cfad0c2 | 183 | _spi.write(value); |
| allankliu | 0:33994cfad0c2 | 184 | _cs = 1; |
| allankliu | 0:33994cfad0c2 | 185 | } |
| allankliu | 0:33994cfad0c2 | 186 | |
| allankliu | 0:33994cfad0c2 | 187 | void SSD1606::set_lut(void) |
| allankliu | 0:33994cfad0c2 | 188 | { |
| allankliu | 0:33994cfad0c2 | 189 | unsigned char i; |
| allankliu | 0:33994cfad0c2 | 190 | _send_command(0x32); |
| allankliu | 0:33994cfad0c2 | 191 | for(i=0; i<90; i++) |
| allankliu | 0:33994cfad0c2 | 192 | { |
| allankliu | 0:33994cfad0c2 | 193 | _send_data(init_data[i]); |
| allankliu | 0:33994cfad0c2 | 194 | } |
| allankliu | 0:33994cfad0c2 | 195 | } |