We connected an OLED to I2C of weather:bit.

Dependencies:   BME280 SSD1308_128x64_I2C microbit

Fork of mbed_oled by Wim Huiskamp

/media/uploads/kanpapa/img_20171215_224649.jpg

Committer:
wim
Date:
Wed Jul 18 14:14:19 2012 +0000
Revision:
4:83b4e905be5b
Parent:
3:1337e3d65ed0
Child:
5:dff410a009c5
Demonstration of SSD1308 OLED driver usage

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wim 1:00053cb70ac5 1 /* mbed Seeed 128x64 OLED Test
wim 1:00053cb70ac5 2 * http://www.seeedstudio.com/depot/grove-oled-display-12864-p-781.html?cPath=163_167
wim 1:00053cb70ac5 3 *
wim 1:00053cb70ac5 4 * Copyright (c) 2012 Wim Huiskamp
wim 1:00053cb70ac5 5 * Released under the MIT License: http://mbed.org/license/mit
wim 1:00053cb70ac5 6 *
wim 1:00053cb70ac5 7 * version 0.2 Initial Release
wim 1:00053cb70ac5 8 */
wim 1:00053cb70ac5 9 #include "mbed.h"
wim 1:00053cb70ac5 10 #include "mbed_logo.h"
wim 1:00053cb70ac5 11 #include "SSD1308.h"
wim 1:00053cb70ac5 12
wim 1:00053cb70ac5 13
wim 1:00053cb70ac5 14 //Pin Defines for I2C Bus
wim 1:00053cb70ac5 15 //#define D_SDA p9
wim 1:00053cb70ac5 16 //#define D_SCL p10
wim 1:00053cb70ac5 17 #define D_SDA p28
wim 1:00053cb70ac5 18 #define D_SCL p27
wim 1:00053cb70ac5 19 I2C i2c(D_SDA, D_SCL);
wim 1:00053cb70ac5 20
wim 1:00053cb70ac5 21 //Host PC Baudrate (Virtual Com Port on USB)
wim 1:00053cb70ac5 22 #define D_BAUDRATE 9600
wim 1:00053cb70ac5 23 //#define D_BAUDRATE 57600
wim 1:00053cb70ac5 24
wim 1:00053cb70ac5 25 // mbed Interface Hardware definitions
wim 1:00053cb70ac5 26 DigitalOut myled1(LED1);
wim 1:00053cb70ac5 27 DigitalOut myled2(LED2);
wim 1:00053cb70ac5 28 DigitalOut myled3(LED3);
wim 1:00053cb70ac5 29 DigitalOut heartbeatLED(LED4);
wim 1:00053cb70ac5 30
wim 1:00053cb70ac5 31 // Host PC Communication channels
wim 1:00053cb70ac5 32 Serial pc(USBTX, USBRX); // tx, rx
wim 1:00053cb70ac5 33
wim 1:00053cb70ac5 34 // Instantiate OLED
wim 1:00053cb70ac5 35 SSD1308 oled = SSD1308(i2c, SSD1308_SA0);
wim 1:00053cb70ac5 36
wim 1:00053cb70ac5 37 void show_menu() {
wim 3:1337e3d65ed0 38 pc.printf("0: Exit\r");
wim 3:1337e3d65ed0 39 pc.printf("1: Show Menu\r");
wim 3:1337e3d65ed0 40 pc.printf("2: Send Message\r");
wim 3:1337e3d65ed0 41 pc.printf("3: Fill Display\r");
wim 3:1337e3d65ed0 42 pc.printf("4: Display cleared\r");
wim 3:1337e3d65ed0 43 pc.printf("5: Display off\r");
wim 3:1337e3d65ed0 44 pc.printf("6: Display on\r");
wim 3:1337e3d65ed0 45 pc.printf("7: Display Invert\r");
wim 3:1337e3d65ed0 46 pc.printf("8: Display Normal\r");
wim 3:1337e3d65ed0 47 pc.printf("9: Display Bitmap\r");
wim 3:1337e3d65ed0 48 pc.printf("A: Brightness Ramp\r");
wim 3:1337e3d65ed0 49 pc.printf("B: Send Inverted Message\r");
wim 3:1337e3d65ed0 50 pc.printf("C: Flip and Mirror\r");
wim 3:1337e3d65ed0 51 pc.printf("D: Blink\r");
wim 3:1337e3d65ed0 52 pc.printf("E: Big Chars\r");
wim 2:d86478c0f5da 53
wim 1:00053cb70ac5 54 // pc.printf("E: \n\r");
wim 1:00053cb70ac5 55 // pc.printf("F: \n\r");
wim 1:00053cb70ac5 56 // pc.printf("\n\r");
wim 1:00053cb70ac5 57
wim 1:00053cb70ac5 58 }
wim 1:00053cb70ac5 59
wim 1:00053cb70ac5 60
wim 1:00053cb70ac5 61 void oled_Test() {
wim 1:00053cb70ac5 62 pc.printf("OLED test start\r");
wim 1:00053cb70ac5 63
wim 1:00053cb70ac5 64 oled.writeString(0, 0, 13, "Hello World !");
wim 1:00053cb70ac5 65 pc.printf("Printed something\r\n");
wim 1:00053cb70ac5 66 wait(3);
wim 1:00053cb70ac5 67
wim 1:00053cb70ac5 68 oled.writeString(1, 0, 8, "baz quux");
wim 1:00053cb70ac5 69 pc.printf("Printed something\r\n");
wim 1:00053cb70ac5 70 wait(3);
wim 1:00053cb70ac5 71
wim 1:00053cb70ac5 72 // oled.writeString(4, 0, 272, "a long, rather lengthy, extended string passage thing, eh, that just goes on, and on, and on, and on, and on, and on, and on, yes, further, continuing, extending, expanding beyond all reason or sanity!!!!! and yet, there's more! so much more! for ever and ever, oh yeah");
wim 1:00053cb70ac5 73 // pc.printf("Printed something\r\n");
wim 1:00053cb70ac5 74 // wait(3);
wim 1:00053cb70ac5 75
wim 1:00053cb70ac5 76 oled.fillDisplay(0xAA);
wim 1:00053cb70ac5 77 pc.printf("Display filled\r\n");
wim 1:00053cb70ac5 78 wait(3);
wim 1:00053cb70ac5 79
wim 1:00053cb70ac5 80 oled.setDisplayOff();
wim 1:00053cb70ac5 81 pc.printf("Display off\r\n");
wim 1:00053cb70ac5 82 wait(0.5);
wim 1:00053cb70ac5 83
wim 1:00053cb70ac5 84 oled.setDisplayOn();
wim 1:00053cb70ac5 85 pc.printf("Display on\r\n");
wim 1:00053cb70ac5 86 wait(0.5);
wim 1:00053cb70ac5 87
wim 1:00053cb70ac5 88 oled.clearDisplay();
wim 1:00053cb70ac5 89 pc.printf("Display cleared\r\n");
wim 1:00053cb70ac5 90 wait(0.5);
wim 1:00053cb70ac5 91
wim 1:00053cb70ac5 92 oled.writeString(0, 0, 11, "Bye World !");
wim 1:00053cb70ac5 93 pc.printf("Printed something\r\n");
wim 1:00053cb70ac5 94 wait(3);
wim 1:00053cb70ac5 95
wim 1:00053cb70ac5 96 pc.printf("OLED test done\r\n");
wim 1:00053cb70ac5 97 }
wim 1:00053cb70ac5 98
wim 1:00053cb70ac5 99 // Variables for Heartbeat and Status monitoring
wim 1:00053cb70ac5 100 Ticker heartbeat;
wim 1:00053cb70ac5 101 bool heartbeatflag=false;
wim 1:00053cb70ac5 102
wim 1:00053cb70ac5 103 // Local functions
wim 1:00053cb70ac5 104 void clear_screen() {
wim 1:00053cb70ac5 105 //ANSI Terminal Commands
wim 1:00053cb70ac5 106 pc.printf("\x1B[2J");
wim 1:00053cb70ac5 107 pc.printf("\x1B[H");
wim 1:00053cb70ac5 108 }
wim 1:00053cb70ac5 109
wim 1:00053cb70ac5 110
wim 1:00053cb70ac5 111 void init_interfaces() {
wim 1:00053cb70ac5 112 // Init Host PC communication, default is 9600
wim 1:00053cb70ac5 113 pc.baud(D_BAUDRATE);
wim 1:00053cb70ac5 114
wim 1:00053cb70ac5 115 // Init I/F hardware
wim 1:00053cb70ac5 116 // i2c.frequency(100000);
wim 1:00053cb70ac5 117 i2c.frequency(400000); // according to the spec the max bitrate for the SSD1308 is 400 kbit/s
wim 1:00053cb70ac5 118 }
wim 1:00053cb70ac5 119
wim 1:00053cb70ac5 120
wim 1:00053cb70ac5 121 // Heartbeat monitor
wim 1:00053cb70ac5 122 void pulse() {
wim 1:00053cb70ac5 123 heartbeatLED = !heartbeatLED;
wim 1:00053cb70ac5 124 }
wim 1:00053cb70ac5 125
wim 1:00053cb70ac5 126 void heartbeat_start() {
wim 1:00053cb70ac5 127 heartbeat.attach(&pulse, 0.5);
wim 1:00053cb70ac5 128 }
wim 1:00053cb70ac5 129
wim 1:00053cb70ac5 130 void heartbeat_stop() {
wim 1:00053cb70ac5 131 heartbeat.detach();
wim 1:00053cb70ac5 132 }
wim 1:00053cb70ac5 133
wim 1:00053cb70ac5 134
wim 1:00053cb70ac5 135 int main() {
wim 1:00053cb70ac5 136 bool running=true;
wim 2:d86478c0f5da 137 bool left = true;
wim 2:d86478c0f5da 138 bool down = true;
wim 2:d86478c0f5da 139
wim 1:00053cb70ac5 140 char command;
wim 1:00053cb70ac5 141
wim 1:00053cb70ac5 142 init_interfaces();
wim 1:00053cb70ac5 143
wim 1:00053cb70ac5 144 heartbeat_start();
wim 1:00053cb70ac5 145
wim 1:00053cb70ac5 146 clear_screen();
wim 1:00053cb70ac5 147
wim 1:00053cb70ac5 148 pc.printf("Hello World!\n\r");
wim 1:00053cb70ac5 149
wim 1:00053cb70ac5 150 #if(0)
wim 1:00053cb70ac5 151 // Quick test
wim 1:00053cb70ac5 152 oled_Test();
wim 1:00053cb70ac5 153
wim 1:00053cb70ac5 154 while(1) {
wim 1:00053cb70ac5 155 myled1 = 1;
wim 1:00053cb70ac5 156 wait(0.2);
wim 1:00053cb70ac5 157
wim 1:00053cb70ac5 158 myled1 = 0;
wim 1:00053cb70ac5 159 wait(0.2);
wim 1:00053cb70ac5 160 pc.printf("*");
wim 1:00053cb70ac5 161 }
wim 1:00053cb70ac5 162 #else
wim 1:00053cb70ac5 163 // Interactive Test
wim 1:00053cb70ac5 164 show_menu();
wim 1:00053cb70ac5 165
wim 1:00053cb70ac5 166 while(running) {
wim 1:00053cb70ac5 167
wim 1:00053cb70ac5 168 if(pc.readable()) {
wim 1:00053cb70ac5 169 command = pc.getc();
wim 3:1337e3d65ed0 170 //pc.printf("command= %c \n\r", command);
wim 3:1337e3d65ed0 171 pc.printf("\r");
wim 3:1337e3d65ed0 172
wim 1:00053cb70ac5 173 switch (command) {
wim 1:00053cb70ac5 174 case '0' :
wim 1:00053cb70ac5 175 pc.printf("Done\n\r");
wim 1:00053cb70ac5 176 running = false;
wim 1:00053cb70ac5 177 break;
wim 1:00053cb70ac5 178
wim 1:00053cb70ac5 179 case '1' :
wim 1:00053cb70ac5 180 show_menu();
wim 1:00053cb70ac5 181 break;
wim 1:00053cb70ac5 182
wim 1:00053cb70ac5 183 case '2' :
wim 1:00053cb70ac5 184 pc.printf("Hello World!\n\r");
wim 1:00053cb70ac5 185 oled.writeString(0, 0, 13, "Hello World !");
wim 1:00053cb70ac5 186 break;
wim 1:00053cb70ac5 187
wim 1:00053cb70ac5 188 case '3' :
wim 3:1337e3d65ed0 189 pc.printf("Fill part of Display 0xA5\n\r");
wim 3:1337e3d65ed0 190 // oled.fillDisplay(0xA5);
wim 3:1337e3d65ed0 191
wim 3:1337e3d65ed0 192 oled.fillDisplay(0xA5, 2, 5, 0, 63);
wim 1:00053cb70ac5 193 break;
wim 1:00053cb70ac5 194
wim 1:00053cb70ac5 195 case '4' :
wim 1:00053cb70ac5 196 pc.printf("Display cleared\r\n");
wim 1:00053cb70ac5 197 oled.clearDisplay();
wim 1:00053cb70ac5 198 break;
wim 1:00053cb70ac5 199
wim 1:00053cb70ac5 200 case '5' :
wim 1:00053cb70ac5 201 pc.printf("Display off\r\n");
wim 1:00053cb70ac5 202 oled.setDisplayOff();
wim 1:00053cb70ac5 203 break;
wim 1:00053cb70ac5 204 case '6' :
wim 1:00053cb70ac5 205 pc.printf("Display on\r\n");
wim 1:00053cb70ac5 206 oled.setDisplayOn();
wim 1:00053cb70ac5 207 break;
wim 1:00053cb70ac5 208
wim 1:00053cb70ac5 209 case '7' :
wim 1:00053cb70ac5 210 pc.printf("Display Invert\r\n");
wim 1:00053cb70ac5 211 oled.setDisplayInverse();
wim 1:00053cb70ac5 212 break;
wim 1:00053cb70ac5 213
wim 1:00053cb70ac5 214 case '8' :
wim 1:00053cb70ac5 215 pc.printf("Display Normal\r\n");
wim 1:00053cb70ac5 216 oled.setDisplayNormal();
wim 1:00053cb70ac5 217 break;
wim 1:00053cb70ac5 218
wim 1:00053cb70ac5 219 case '9' :
wim 1:00053cb70ac5 220 pc.printf("Display bitmap\r\n");
wim 3:1337e3d65ed0 221 oled.writeBitmap((uint8_t*) mbed_logo);
wim 3:1337e3d65ed0 222
wim 1:00053cb70ac5 223 break;
wim 1:00053cb70ac5 224
wim 1:00053cb70ac5 225 case 'A' :
wim 3:1337e3d65ed0 226
wim 2:d86478c0f5da 227 pc.printf("Brightness Ramp Down\r\n");
wim 3:1337e3d65ed0 228 for (int contrast=0x7F; contrast >= 0x10; contrast--) {
wim 2:d86478c0f5da 229 oled.setContrastControl(contrast);
wim 2:d86478c0f5da 230 wait(0.05);
wim 2:d86478c0f5da 231 }
wim 2:d86478c0f5da 232
wim 2:d86478c0f5da 233 wait(1);
wim 3:1337e3d65ed0 234
wim 2:d86478c0f5da 235 pc.printf("Brightness Ramp Up\r\n");
wim 3:1337e3d65ed0 236 for (int contrast=0x10; contrast <= 0x7F; contrast++) {
wim 2:d86478c0f5da 237 oled.setContrastControl(contrast);
wim 2:d86478c0f5da 238 wait(0.05);
wim 2:d86478c0f5da 239 }
wim 2:d86478c0f5da 240
wim 3:1337e3d65ed0 241 pc.printf("Brightness Ramp Done\r\n");
wim 3:1337e3d65ed0 242
wim 1:00053cb70ac5 243 break;
wim 1:00053cb70ac5 244
wim 1:00053cb70ac5 245 case 'B' :
wim 2:d86478c0f5da 246 pc.printf("Send Inverted Message\n\r");
wim 3:1337e3d65ed0 247 oled.setInverted(true);
wim 3:1337e3d65ed0 248 oled.writeString(0, 0, 13, "Hello World !");
wim 3:1337e3d65ed0 249 oled.setInverted(false);
wim 3:1337e3d65ed0 250
wim 3:1337e3d65ed0 251 oled.printf(" Result is %d", 12345);
wim 3:1337e3d65ed0 252
wim 2:d86478c0f5da 253 break;
wim 2:d86478c0f5da 254
wim 2:d86478c0f5da 255 case 'C' :
wim 2:d86478c0f5da 256 pc.printf("Flip and Mirror (Rewrite display to show horizontal effect)\n\r");
wim 2:d86478c0f5da 257 left = !left;
wim 2:d86478c0f5da 258 down = !down;
wim 2:d86478c0f5da 259 oled.setDisplayFlip(left, down);
wim 3:1337e3d65ed0 260 break;
wim 3:1337e3d65ed0 261
wim 3:1337e3d65ed0 262 case 'D' :
wim 3:1337e3d65ed0 263 pc.printf("D: Blink and Fade (not supported) \n\r");
wim 3:1337e3d65ed0 264
wim 3:1337e3d65ed0 265 // oled.setDisplayBlink(true);
wim 3:1337e3d65ed0 266 // wait(4);
wim 3:1337e3d65ed0 267 // oled.setDisplayBlink(false);
wim 3:1337e3d65ed0 268
wim 3:1337e3d65ed0 269 oled.setDisplayFade(true);
wim 3:1337e3d65ed0 270 wait(4);
wim 3:1337e3d65ed0 271 oled.setDisplayFade(false);
wim 3:1337e3d65ed0 272
wim 3:1337e3d65ed0 273 pc.printf("D: Blink done\n\r");
wim 3:1337e3d65ed0 274 break;
wim 3:1337e3d65ed0 275
wim 3:1337e3d65ed0 276
wim 3:1337e3d65ed0 277 case 'E' :
wim 3:1337e3d65ed0 278 pc.printf("E: Big Chars\n\r");
wim 3:1337e3d65ed0 279
wim 3:1337e3d65ed0 280 oled.writeBigChar(0, 0, '+');
wim 3:1337e3d65ed0 281 oled.writeBigChar(0, 16, '7');
wim 3:1337e3d65ed0 282 oled.writeBigChar(0, 32, '8');
wim 3:1337e3d65ed0 283 oled.writeBigChar(0, 48, '9');
wim 3:1337e3d65ed0 284
wim 3:1337e3d65ed0 285 pc.printf("E: Big Chars done\n\r");
wim 3:1337e3d65ed0 286 break;
wim 3:1337e3d65ed0 287
wim 1:00053cb70ac5 288 } //switch
wim 1:00053cb70ac5 289 }//if
wim 1:00053cb70ac5 290 }//while
wim 1:00053cb70ac5 291 #endif
wim 1:00053cb70ac5 292
wim 1:00053cb70ac5 293 pc.printf("Bye World!\n\r");
wim 1:00053cb70ac5 294 }//main
wim 1:00053cb70ac5 295