Demonstration of SSD1308 OLED driver library

Dependencies:   mbed SSD1308_128x64_I2C

Committer:
wim
Date:
Wed Jul 18 13:59:03 2012 +0000
Revision:
3:1337e3d65ed0
Parent:
2:d86478c0f5da
Child:
4:83b4e905be5b
Update 180712

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((PAGES*COLUMNS), (uint8_t*) mbed_logo);
wim 3:1337e3d65ed0 222 oled.writeBitmap((uint8_t*) mbed_logo);
wim 3:1337e3d65ed0 223
wim 1:00053cb70ac5 224 break;
wim 1:00053cb70ac5 225
wim 1:00053cb70ac5 226 case 'A' :
wim 3:1337e3d65ed0 227
wim 2:d86478c0f5da 228 pc.printf("Brightness Ramp Down\r\n");
wim 3:1337e3d65ed0 229 for (int contrast=0x7F; contrast >= 0x10; contrast--) {
wim 2:d86478c0f5da 230 oled.setContrastControl(contrast);
wim 2:d86478c0f5da 231 wait(0.05);
wim 2:d86478c0f5da 232 }
wim 2:d86478c0f5da 233
wim 2:d86478c0f5da 234 wait(1);
wim 3:1337e3d65ed0 235
wim 2:d86478c0f5da 236 pc.printf("Brightness Ramp Up\r\n");
wim 3:1337e3d65ed0 237 for (int contrast=0x10; contrast <= 0x7F; contrast++) {
wim 2:d86478c0f5da 238 oled.setContrastControl(contrast);
wim 2:d86478c0f5da 239 wait(0.05);
wim 2:d86478c0f5da 240 }
wim 2:d86478c0f5da 241
wim 3:1337e3d65ed0 242 pc.printf("Brightness Ramp Done\r\n");
wim 3:1337e3d65ed0 243
wim 1:00053cb70ac5 244 break;
wim 1:00053cb70ac5 245
wim 1:00053cb70ac5 246 case 'B' :
wim 2:d86478c0f5da 247 pc.printf("Send Inverted Message\n\r");
wim 3:1337e3d65ed0 248 oled.setInverted(true);
wim 3:1337e3d65ed0 249 oled.writeString(0, 0, 13, "Hello World !");
wim 3:1337e3d65ed0 250 oled.setInverted(false);
wim 3:1337e3d65ed0 251
wim 3:1337e3d65ed0 252 oled.printf(" Result is %d", 12345);
wim 3:1337e3d65ed0 253
wim 2:d86478c0f5da 254 break;
wim 2:d86478c0f5da 255
wim 2:d86478c0f5da 256 case 'C' :
wim 2:d86478c0f5da 257 pc.printf("Flip and Mirror (Rewrite display to show horizontal effect)\n\r");
wim 2:d86478c0f5da 258 left = !left;
wim 2:d86478c0f5da 259 down = !down;
wim 2:d86478c0f5da 260 oled.setDisplayFlip(left, down);
wim 3:1337e3d65ed0 261 break;
wim 3:1337e3d65ed0 262
wim 3:1337e3d65ed0 263 case 'D' :
wim 3:1337e3d65ed0 264 pc.printf("D: Blink and Fade (not supported) \n\r");
wim 3:1337e3d65ed0 265
wim 3:1337e3d65ed0 266 // oled.setDisplayBlink(true);
wim 3:1337e3d65ed0 267 // wait(4);
wim 3:1337e3d65ed0 268 // oled.setDisplayBlink(false);
wim 3:1337e3d65ed0 269
wim 3:1337e3d65ed0 270 oled.setDisplayFade(true);
wim 3:1337e3d65ed0 271 wait(4);
wim 3:1337e3d65ed0 272 oled.setDisplayFade(false);
wim 3:1337e3d65ed0 273
wim 3:1337e3d65ed0 274 pc.printf("D: Blink done\n\r");
wim 3:1337e3d65ed0 275 break;
wim 3:1337e3d65ed0 276
wim 3:1337e3d65ed0 277
wim 3:1337e3d65ed0 278 case 'E' :
wim 3:1337e3d65ed0 279 pc.printf("E: Big Chars\n\r");
wim 3:1337e3d65ed0 280
wim 3:1337e3d65ed0 281 oled.writeBigChar(0, 0, '+');
wim 3:1337e3d65ed0 282 oled.writeBigChar(0, 16, '7');
wim 3:1337e3d65ed0 283 oled.writeBigChar(0, 32, '8');
wim 3:1337e3d65ed0 284 oled.writeBigChar(0, 48, '9');
wim 3:1337e3d65ed0 285
wim 3:1337e3d65ed0 286 pc.printf("E: Big Chars done\n\r");
wim 3:1337e3d65ed0 287 break;
wim 3:1337e3d65ed0 288
wim 1:00053cb70ac5 289 } //switch
wim 1:00053cb70ac5 290 }//if
wim 1:00053cb70ac5 291 }//while
wim 1:00053cb70ac5 292 #endif
wim 1:00053cb70ac5 293
wim 1:00053cb70ac5 294 pc.printf("Bye World!\n\r");
wim 1:00053cb70ac5 295 }//main
wim 1:00053cb70ac5 296