4D Systems serial microOLED driver http://www.4dsystems.com.au/prod.php?id=77 http://www.sparkfun.com/products/8538

Committer:
evwijk
Date:
Fri Nov 19 13:30:42 2010 +0000
Revision:
1:3a99823210c0
Parent:
0:d64e7277c3e5
0.2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
evwijk 1:3a99823210c0 1 #include "MicroOLED.h"
evwijk 1:3a99823210c0 2 #include "mbed.h"
evwijk 1:3a99823210c0 3
evwijk 1:3a99823210c0 4
evwijk 1:3a99823210c0 5 #define OLED_INITDELAYMS 500
evwijk 1:3a99823210c0 6
evwijk 1:3a99823210c0 7 #define OLED_ACK 0x06 // Ok
evwijk 1:3a99823210c0 8 #define OLED_NAK 0x15 // Error
evwijk 1:3a99823210c0 9
evwijk 1:3a99823210c0 10
evwijk 1:3a99823210c0 11
evwijk 1:3a99823210c0 12 MicroOLED::MicroOLED(PinName serialTX, PinName serialRX, PinName reset) :
evwijk 1:3a99823210c0 13 _oled(serialTX, serialRX),
evwijk 1:3a99823210c0 14 _reset(reset) {
evwijk 1:3a99823210c0 15
evwijk 1:3a99823210c0 16 _oled.baud(230400);
evwijk 1:3a99823210c0 17 }
evwijk 1:3a99823210c0 18
evwijk 1:3a99823210c0 19 /******************/
evwijk 1:3a99823210c0 20 /* Protected */
evwijk 1:3a99823210c0 21 /******************/
evwijk 1:3a99823210c0 22 void MicroOLED::resetDisplay() {
evwijk 1:3a99823210c0 23 _reset = 0;
evwijk 1:3a99823210c0 24 wait_ms(20);
evwijk 1:3a99823210c0 25 _reset = 1;
evwijk 1:3a99823210c0 26 wait_ms(20);
evwijk 1:3a99823210c0 27 }
evwijk 1:3a99823210c0 28
evwijk 1:3a99823210c0 29
evwijk 1:3a99823210c0 30 /******************/
evwijk 1:3a99823210c0 31 /* Public */
evwijk 1:3a99823210c0 32 /******************/
evwijk 1:3a99823210c0 33 short MicroOLED::getRGB(char red, char green, char blue) {
evwijk 1:3a99823210c0 34 int outR = ((red * 31) / 255);
evwijk 1:3a99823210c0 35 int outG = ((green * 63) / 255);
evwijk 1:3a99823210c0 36 int outB = ((blue * 31) / 255);
evwijk 1:3a99823210c0 37
evwijk 1:3a99823210c0 38 return (outR << 11) | (outG << 5) | outB;
evwijk 1:3a99823210c0 39 }
evwijk 1:3a99823210c0 40
evwijk 1:3a99823210c0 41 bool MicroOLED::addBitmappedCharacter(char character, char data[8]) {
evwijk 1:3a99823210c0 42 _oled.putc(0x41);
evwijk 1:3a99823210c0 43 _oled.putc(character);
evwijk 1:3a99823210c0 44 for (int i=0; i<8; i++) _oled.putc(data[i]);
evwijk 1:3a99823210c0 45 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 46 }
evwijk 1:3a99823210c0 47
evwijk 1:3a99823210c0 48 bool MicroOLED::blockCopyPaste(char sourceX, char sourceY, char destinationX, char destinationY, char width, char height) {
evwijk 1:3a99823210c0 49 _oled.putc(0x63);
evwijk 1:3a99823210c0 50 _oled.putc(sourceX);
evwijk 1:3a99823210c0 51 _oled.putc(sourceY);
evwijk 1:3a99823210c0 52 _oled.putc(destinationX);
evwijk 1:3a99823210c0 53 _oled.putc(destinationY);
evwijk 1:3a99823210c0 54 _oled.putc(width);
evwijk 1:3a99823210c0 55 _oled.putc(height);
evwijk 1:3a99823210c0 56
evwijk 1:3a99823210c0 57 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 58 }
evwijk 1:3a99823210c0 59
evwijk 1:3a99823210c0 60 bool MicroOLED::displayControl(char mode) {
evwijk 1:3a99823210c0 61 _oled.putc(0x59);
evwijk 1:3a99823210c0 62 _oled.putc(mode);
evwijk 1:3a99823210c0 63
evwijk 1:3a99823210c0 64 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 65 }
evwijk 1:3a99823210c0 66
evwijk 1:3a99823210c0 67 bool MicroOLED::displayUserBitmappedCharacter(char character, char x, char y, short color) {
evwijk 1:3a99823210c0 68 _oled.putc(0x44);
evwijk 1:3a99823210c0 69 _oled.putc(character);
evwijk 1:3a99823210c0 70 _oled.putc(x);
evwijk 1:3a99823210c0 71 _oled.putc(y);
evwijk 1:3a99823210c0 72 _oled.putc(color >> 8);
evwijk 1:3a99823210c0 73 _oled.putc(color & 0xFF);
evwijk 1:3a99823210c0 74
evwijk 1:3a99823210c0 75 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 76 }
evwijk 1:3a99823210c0 77
evwijk 1:3a99823210c0 78 bool MicroOLED::drawCharacter(char character, char column, char row, short color) {
evwijk 1:3a99823210c0 79 _oled.putc(0x54);
evwijk 1:3a99823210c0 80 _oled.putc(character);
evwijk 1:3a99823210c0 81 _oled.putc(column);
evwijk 1:3a99823210c0 82 _oled.putc(row);
evwijk 1:3a99823210c0 83 _oled.putc(color >> 8);
evwijk 1:3a99823210c0 84 _oled.putc(color & 0xFF);
evwijk 1:3a99823210c0 85
evwijk 1:3a99823210c0 86 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 87 }
evwijk 1:3a99823210c0 88
evwijk 1:3a99823210c0 89 bool MicroOLED::drawCircle(char x, char y, char radius, short color) {
evwijk 1:3a99823210c0 90 _oled.putc(0x43);
evwijk 1:3a99823210c0 91 _oled.putc(x);
evwijk 1:3a99823210c0 92 _oled.putc(y);
evwijk 1:3a99823210c0 93 _oled.putc(radius);
evwijk 1:3a99823210c0 94 _oled.putc(color >> 8);
evwijk 1:3a99823210c0 95 _oled.putc(color & 0xFF);
evwijk 1:3a99823210c0 96
evwijk 1:3a99823210c0 97 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 98 }
evwijk 1:3a99823210c0 99
evwijk 1:3a99823210c0 100 bool MicroOLED::drawImage(char x, char y, char width, char height, char colorMode, char *pixels) {
evwijk 1:3a99823210c0 101 int numberOfBytesPerPixel = 1;
evwijk 1:3a99823210c0 102
evwijk 1:3a99823210c0 103 _oled.putc(0x49);
evwijk 1:3a99823210c0 104 _oled.putc(x);
evwijk 1:3a99823210c0 105 _oled.putc(y);
evwijk 1:3a99823210c0 106 _oled.putc(width);
evwijk 1:3a99823210c0 107 _oled.putc(height);
evwijk 1:3a99823210c0 108 _oled.putc(colorMode);
evwijk 1:3a99823210c0 109
evwijk 1:3a99823210c0 110 if (colorMode == 16) numberOfBytesPerPixel = 2;
evwijk 1:3a99823210c0 111
evwijk 1:3a99823210c0 112 for (int i=0; i<width * height * numberOfBytesPerPixel; i++) {
evwijk 1:3a99823210c0 113 _oled.putc(pixels[i]);
evwijk 1:3a99823210c0 114 }
evwijk 1:3a99823210c0 115
evwijk 1:3a99823210c0 116 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 117 }
evwijk 1:3a99823210c0 118
evwijk 1:3a99823210c0 119 bool MicroOLED::drawLine(char x1, char y1, char x2, char y2, short color) {
evwijk 1:3a99823210c0 120 _oled.putc(0x4C);
evwijk 1:3a99823210c0 121 _oled.putc(x1);
evwijk 1:3a99823210c0 122 _oled.putc(y1);
evwijk 1:3a99823210c0 123 _oled.putc(x2);
evwijk 1:3a99823210c0 124 _oled.putc(y2);
evwijk 1:3a99823210c0 125 _oled.putc(color >> 8);
evwijk 1:3a99823210c0 126 _oled.putc(color & 0xFF);
evwijk 1:3a99823210c0 127
evwijk 1:3a99823210c0 128 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 129 }
evwijk 1:3a99823210c0 130
evwijk 1:3a99823210c0 131 bool MicroOLED::drawPolygon(char vertices, char *x, char *y, short color) {
evwijk 1:3a99823210c0 132 _oled.putc(0x67);
evwijk 1:3a99823210c0 133 _oled.putc(vertices);
evwijk 1:3a99823210c0 134 for (int i=0; i<vertices; i++) {
evwijk 1:3a99823210c0 135 _oled.putc(x[i]);
evwijk 1:3a99823210c0 136 _oled.putc(y[i]);
evwijk 1:3a99823210c0 137 }
evwijk 1:3a99823210c0 138 _oled.putc(color >> 8);
evwijk 1:3a99823210c0 139 _oled.putc(color & 0xFF);
evwijk 1:3a99823210c0 140
evwijk 1:3a99823210c0 141 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 142 }
evwijk 1:3a99823210c0 143
evwijk 1:3a99823210c0 144 bool MicroOLED::drawRectangle(char x, char y, char width, char height, short color) {
evwijk 1:3a99823210c0 145 _oled.putc(0x72);
evwijk 1:3a99823210c0 146 _oled.putc(x);
evwijk 1:3a99823210c0 147 _oled.putc(y);
evwijk 1:3a99823210c0 148 _oled.putc(x + width);
evwijk 1:3a99823210c0 149 _oled.putc(y + height);
evwijk 1:3a99823210c0 150 _oled.putc(color >> 8);
evwijk 1:3a99823210c0 151 _oled.putc(color & 0xFF);
evwijk 1:3a99823210c0 152
evwijk 1:3a99823210c0 153 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 154 }
evwijk 1:3a99823210c0 155
evwijk 1:3a99823210c0 156 bool MicroOLED::drawText(char column, char row, char font, short color, char *text) {
evwijk 1:3a99823210c0 157 _oled.putc(0x73);
evwijk 1:3a99823210c0 158 _oled.putc(column);
evwijk 1:3a99823210c0 159 _oled.putc(row);
evwijk 1:3a99823210c0 160 _oled.putc(font);
evwijk 1:3a99823210c0 161 _oled.putc(color >> 8);
evwijk 1:3a99823210c0 162 _oled.putc(color & 0xFF);
evwijk 1:3a99823210c0 163 for (int i=0 ; i<strlen(text) ; i++) _oled.putc(text[i]);
evwijk 1:3a99823210c0 164 _oled.putc(0x00);
evwijk 1:3a99823210c0 165
evwijk 1:3a99823210c0 166 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 167 }
evwijk 1:3a99823210c0 168
evwijk 1:3a99823210c0 169 bool MicroOLED::drawTriangle(char x1, char y1, char x2, char y2, char x3, char y3, short color) {
evwijk 1:3a99823210c0 170 _oled.putc(0x47);
evwijk 1:3a99823210c0 171 _oled.putc(x1);
evwijk 1:3a99823210c0 172 _oled.putc(y1);
evwijk 1:3a99823210c0 173 _oled.putc(x2);
evwijk 1:3a99823210c0 174 _oled.putc(y2);
evwijk 1:3a99823210c0 175 _oled.putc(x3);
evwijk 1:3a99823210c0 176 _oled.putc(y3);
evwijk 1:3a99823210c0 177 _oled.putc(color >> 8);
evwijk 1:3a99823210c0 178 _oled.putc(color & 0xFF);
evwijk 1:3a99823210c0 179
evwijk 1:3a99823210c0 180 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 181 }
evwijk 1:3a99823210c0 182
evwijk 1:3a99823210c0 183 bool MicroOLED::eraseScreen() {
evwijk 1:3a99823210c0 184 _oled.putc(0x45);
evwijk 1:3a99823210c0 185
evwijk 1:3a99823210c0 186 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 187 }
evwijk 1:3a99823210c0 188
evwijk 1:3a99823210c0 189 bool MicroOLED::init() {
evwijk 1:3a99823210c0 190 resetDisplay();
evwijk 1:3a99823210c0 191
evwijk 1:3a99823210c0 192 wait_ms(OLED_INITDELAYMS);
evwijk 1:3a99823210c0 193 _oled.putc(0x55);
evwijk 1:3a99823210c0 194
evwijk 1:3a99823210c0 195 _oled.getc();
evwijk 1:3a99823210c0 196
evwijk 1:3a99823210c0 197 _oled.putc(0x4F);
evwijk 1:3a99823210c0 198 _oled.putc(0x01);
evwijk 1:3a99823210c0 199
evwijk 1:3a99823210c0 200 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 201 }
evwijk 1:3a99823210c0 202
evwijk 1:3a99823210c0 203 bool MicroOLED::penSize(char size) {
evwijk 1:3a99823210c0 204 _oled.putc(0x70);
evwijk 1:3a99823210c0 205 _oled.putc(size);
evwijk 1:3a99823210c0 206
evwijk 1:3a99823210c0 207 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 208 }
evwijk 1:3a99823210c0 209
evwijk 1:3a99823210c0 210 bool MicroOLED::putPixel(char x, char y, short color) {
evwijk 1:3a99823210c0 211 _oled.putc(0x50);
evwijk 1:3a99823210c0 212 _oled.putc(x);
evwijk 1:3a99823210c0 213 _oled.putc(y);
evwijk 1:3a99823210c0 214
evwijk 1:3a99823210c0 215 _oled.putc(color >> 8);
evwijk 1:3a99823210c0 216 _oled.putc(color & 0xFF);
evwijk 1:3a99823210c0 217
evwijk 1:3a99823210c0 218 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 219 }
evwijk 1:3a99823210c0 220
evwijk 1:3a99823210c0 221 short MicroOLED::readPixel(char x, char y) {
evwijk 1:3a99823210c0 222 short returnValue;
evwijk 1:3a99823210c0 223
evwijk 1:3a99823210c0 224 _oled.putc(0x52);
evwijk 1:3a99823210c0 225 _oled.putc(x);
evwijk 1:3a99823210c0 226 _oled.putc(y);
evwijk 1:3a99823210c0 227 returnValue = (_oled.getc() << 8);
evwijk 1:3a99823210c0 228 returnValue += _oled.getc();
evwijk 1:3a99823210c0 229
evwijk 1:3a99823210c0 230 return returnValue;
evwijk 1:3a99823210c0 231 }
evwijk 1:3a99823210c0 232
evwijk 1:3a99823210c0 233 bool MicroOLED::setBackgroundColor(short color) {
evwijk 1:3a99823210c0 234 _oled.putc(0x42);
evwijk 1:3a99823210c0 235
evwijk 1:3a99823210c0 236 _oled.putc(color >> 8);
evwijk 1:3a99823210c0 237 _oled.putc(color & 0xFF);
evwijk 1:3a99823210c0 238
evwijk 1:3a99823210c0 239 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 240 }
evwijk 1:3a99823210c0 241
evwijk 1:3a99823210c0 242 bool MicroOLED::setFontSize(char fontType) {
evwijk 1:3a99823210c0 243 _oled.putc(0x46);
evwijk 1:3a99823210c0 244 _oled.putc(fontType);
evwijk 1:3a99823210c0 245
evwijk 1:3a99823210c0 246 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 247 }
evwijk 1:3a99823210c0 248
evwijk 1:3a99823210c0 249 bool MicroOLED::textButton(char state, char x, char y, short buttonColor, char font, short textColor, char textWidth, char textHeight, char *text) {
evwijk 1:3a99823210c0 250 _oled.putc(0x62);
evwijk 1:3a99823210c0 251 _oled.putc(state);
evwijk 1:3a99823210c0 252 _oled.putc(x);
evwijk 1:3a99823210c0 253 _oled.putc(y);
evwijk 1:3a99823210c0 254 _oled.putc(buttonColor >> 8);
evwijk 1:3a99823210c0 255 _oled.putc(buttonColor & 0xFF);
evwijk 1:3a99823210c0 256 _oled.putc(font);
evwijk 1:3a99823210c0 257 _oled.putc(textColor >> 8);
evwijk 1:3a99823210c0 258 _oled.putc(textColor & 0xFF);
evwijk 1:3a99823210c0 259 _oled.putc(textWidth);
evwijk 1:3a99823210c0 260 _oled.putc(textHeight);
evwijk 1:3a99823210c0 261 for (int i=0 ; i<strlen(text) ; i++) _oled.putc(text[i]);
evwijk 1:3a99823210c0 262 _oled.putc(0x00);
evwijk 1:3a99823210c0 263
evwijk 1:3a99823210c0 264 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 265 }
evwijk 1:3a99823210c0 266
evwijk 1:3a99823210c0 267 bool MicroOLED::textMode(char mode) {
evwijk 1:3a99823210c0 268 _oled.putc(0x4F);
evwijk 1:3a99823210c0 269 _oled.putc(mode);
evwijk 1:3a99823210c0 270
evwijk 1:3a99823210c0 271 return (_oled.getc() == OLED_ACK);
evwijk 1:3a99823210c0 272 }
evwijk 1:3a99823210c0 273
evwijk 1:3a99823210c0 274 bool MicroOLED::versionInfo(bool onScreen, char *info) {
evwijk 1:3a99823210c0 275 _oled.putc(0x56);
evwijk 1:3a99823210c0 276 if (onScreen) {
evwijk 1:3a99823210c0 277 _oled.putc(0x01);
evwijk 1:3a99823210c0 278 } else {
evwijk 1:3a99823210c0 279 _oled.putc(0x00);
evwijk 1:3a99823210c0 280 }
evwijk 1:3a99823210c0 281
evwijk 1:3a99823210c0 282 info[0] = _oled.getc();
evwijk 1:3a99823210c0 283 info[1] = _oled.getc();
evwijk 1:3a99823210c0 284 info[2] = _oled.getc();
evwijk 1:3a99823210c0 285 info[3] = _oled.getc();
evwijk 1:3a99823210c0 286 info[4] = _oled.getc();
evwijk 1:3a99823210c0 287
evwijk 1:3a99823210c0 288 return true;
evwijk 0:d64e7277c3e5 289 }