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

Committer:
evwijk
Date:
Wed Nov 17 20:53:12 2010 +0000
Revision:
0:d64e7277c3e5
Child:
1:3a99823210c0
0.1

Who changed what in which revision?

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