Demonstration of SSD1308 OLED driver library

Dependencies:   mbed SSD1308_128x64_I2C

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /* mbed Seeed 128x64 OLED Test
00002  * http://www.seeedstudio.com/depot/grove-oled-display-12864-p-781.html?cPath=163_167
00003  *
00004  * Copyright (c) 2012 Wim Huiskamp
00005  * Released under the MIT License: http://mbed.org/license/mit
00006  *
00007  * version 0.2 Initial Release
00008  * version 0.3 2017 Fixed non-copyable issue (Thx kenjiArai) 
00009  */
00010 #include "mbed.h"
00011 #include "mbed_logo.h"
00012 #include "SSD1308.h"
00013 
00014 #if defined(TARGET_LPC1768)
00015 //Pin Defines for I2C Bus
00016 //#define D_SDA                  p9
00017 //#define D_SCL                  p10
00018 #define D_SDA                  p28
00019 #define D_SCL                  p27
00020 #endif
00021 
00022 #if defined(TARGET_NUCLEO_F401RE)
00023 #define D_SDA                  PB_9
00024 #define D_SCL                  PB_8
00025 #endif
00026 
00027 #if defined(TARGET_KL25Z)
00028 // I2C for KL25Z
00029 #define D_SCL                  PTE1
00030 #define D_SDA                  PTE0
00031 #endif
00032 
00033 I2C i2c(D_SDA, D_SCL);
00034 
00035 //Host PC Baudrate (Virtual Com Port on USB)
00036 #define D_BAUDRATE            9600
00037 //#define D_BAUDRATE            57600
00038 
00039 // mbed Interface Hardware definitions
00040 DigitalOut myled1(LED1);
00041 DigitalOut myled2(LED2);
00042 DigitalOut myled3(LED3);
00043 DigitalOut heartbeatLED(LED4);
00044 
00045 // Host PC Communication channels
00046 Serial pc(USBTX, USBRX); // tx, rx
00047 
00048 // Instantiate OLED
00049 SSD1308 oled = SSD1308(&i2c, SSD1308_SA0);
00050 
00051 void show_menu() {
00052     pc.printf("0: Exit\r");
00053     pc.printf("1: Show Menu\r");    
00054     pc.printf("2: Send Message\r"); 
00055     pc.printf("3: Fill Display\r");
00056     pc.printf("4: Display cleared\r");        
00057     pc.printf("5: Display off\r");            
00058     pc.printf("6: Display on\r");                
00059     pc.printf("7: Display Invert\r");                    
00060     pc.printf("8: Display Normal\r");                
00061     pc.printf("9: Display Bitmap\r");                    
00062     pc.printf("A: Brightness Ramp\r");                    
00063     pc.printf("B: Send Inverted Message\r");  
00064     pc.printf("C: Flip and Mirror\r");                      
00065     pc.printf("D: Blink\r");   
00066     pc.printf("E: Big Chars\r");                       
00067     pc.printf("F: Progress Scale\r");    
00068     pc.printf("G: Scroll\r");        
00069     pc.printf("H: Hor Scroll\r");    
00070     pc.printf("V: Ver and Hor Scroll\r");    
00071 //    pc.printf("\n\r");                
00072      
00073 }
00074 
00075 
00076 void oled_Test() {
00077   pc.printf("OLED test start\r"); 
00078 
00079 #if defined(TARGET_LPC1768)
00080   pc.printf("\r\nHello World from LPC1768\r\n");
00081 #endif  
00082 #if defined(TARGET_KL25Z)
00083   pc.printf("\r\nHello World from KL25Z\r\n");
00084 #endif  
00085 #if defined(TARGET_LPC812)
00086   pc.printf("\r\nHello World from LPC812\r\n");
00087 #endif
00088 #if defined(TARGET_LPC1549)
00089   pc.printf("Hello World from LPC1549\n\r");    
00090 #endif  
00091 #if defined(TARGET_NUCLEO_F401RE)
00092   pc.printf("Hello World from ST32F401RE\n\r");    
00093 #endif  
00094 #if defined(TARGET_NUCLEO_F103RB)
00095   pc.printf("Hello World from ST32F103RB\n\r");    
00096 #endif  
00097  
00098   
00099 //  oled.writeString(0, 0, 13, "Hello World !");
00100   oled.writeString(0, 0, "Hello World !");  
00101   pc.printf("Printed something\r");    
00102   wait(3);
00103     
00104 //  oled.writeString(1, 0, 8, "baz quux");
00105   oled.writeString(1, 0, "baz quux");  
00106   pc.printf("Printed something\r");  
00107   wait(3);
00108     
00109 //  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");
00110 //  pc.printf("Printed something\r");
00111 //  wait(3);
00112 
00113   oled.fillDisplay(0xAA);
00114   pc.printf("Display filled\r");      
00115   wait(3);
00116 
00117   oled.setDisplayOff();
00118   pc.printf("Display off\r");          
00119   wait(0.5);
00120 
00121   oled.setDisplayOn();
00122   pc.printf("Display on\r");          
00123   wait(0.5);  
00124 
00125   oled.clearDisplay();
00126   pc.printf("Display cleared\r");        
00127   wait(0.5);
00128 
00129 //  oled.writeString(0, 0, 11, "Bye World !");
00130   oled.writeString(0, 0, "Bye World !");  
00131   pc.printf("Printed something\r");    
00132   wait(3);
00133 
00134   pc.printf("OLED test done\r");  
00135 }
00136 
00137 // Variables for Heartbeat and Status monitoring
00138 Ticker heartbeat;
00139 bool heartbeatflag=false;
00140 
00141 // Local functions
00142 void clear_screen() {
00143 //ANSI Terminal Commands
00144     pc.printf("\x1B[2J");
00145     pc.printf("\x1B[H");
00146 }
00147 
00148 
00149 void init_interfaces() {
00150     // Init Host PC communication, default is 9600
00151     pc.baud(D_BAUDRATE);
00152       
00153     // Init I/F hardware
00154 //    i2c.frequency(100000);
00155     i2c.frequency(400000); // according to the spec the max bitrate for the SSD1308 is 400 kbit/s
00156 }
00157       
00158 
00159 // Heartbeat monitor
00160 void pulse() {
00161   heartbeatLED = !heartbeatLED;
00162 }
00163 
00164 void heartbeat_start() {
00165   heartbeat.attach(&pulse, 0.5);
00166 }
00167 
00168 void heartbeat_stop() {
00169   heartbeat.detach();
00170 }
00171 
00172 
00173 int main() {
00174     bool running=true;
00175     bool left = true;
00176     bool down = true;
00177    
00178     char command;
00179 
00180     init_interfaces();
00181     
00182     heartbeat_start();
00183           
00184     clear_screen(); 
00185   
00186     pc.printf("Hello World!\r");
00187 
00188 #if(0)
00189 // Quick test
00190     oled_Test(); 
00191     
00192     while(1) {
00193         myled1 = 1;
00194         wait(0.2);       
00195          
00196         myled1 = 0;
00197         wait(0.2);     
00198         pc.printf("*");
00199     }
00200 #else    
00201 // Interactive Test
00202     show_menu();
00203       
00204     while(running) {
00205           
00206        if(pc.readable()) {
00207          command = pc.getc();       
00208          //pc.printf("command= %c \n\r", command);         
00209          pc.printf("\r");         
00210          
00211          switch (command) {
00212           case '0' :
00213                      pc.printf("Done\r");                    
00214                      running = false;  
00215                      break;
00216           
00217           case '1' :
00218                      show_menu();
00219                      break;
00220                     
00221           case '2' :
00222                      pc.printf("Hello World!\r");  
00223                      oled.writeString(0, 0, "Hello World !");   
00224                      break;
00225           
00226           case '3' :
00227                      pc.printf("Fill part of Display 0xA5\r");            
00228 //                     oled.fillDisplay(0xA5);
00229                      
00230                      oled.fillDisplay(0xA5, 2, 5, 0, 63);                     
00231                      break;
00232 
00233           case '4' :
00234                      pc.printf("Display cleared\r");                  
00235                      oled.clearDisplay();
00236                      break;
00237 
00238           case '5' :
00239                      pc.printf("Display off\r");                
00240                      oled.setDisplayOff();                  
00241                      break;
00242           case '6' :
00243                      pc.printf("Display on\r");          
00244                      oled.setDisplayOn();                     
00245                      break;
00246 
00247           case '7' :
00248                      pc.printf("Display Invert\r");          
00249                      oled.setDisplayInverse();
00250                      break;
00251 
00252           case '8' :
00253                      pc.printf("Display Normal\r");
00254                      oled.setDisplayNormal();                                         
00255                      break;
00256 
00257           case '9' :
00258                      pc.printf("Display bitmap\r");          
00259                      oled.writeBitmap((uint8_t*) mbed_logo);
00260                                         
00261                      break;
00262 
00263           case 'A' :
00264                      pc.printf("Brightness Ramp Down\r");          
00265                      for (int contrast=0x7F; contrast >= 0x10; contrast--) { 
00266                         oled.setContrastControl(contrast);
00267                         wait(0.05);
00268                      }                   
00269                      
00270                      wait(1);
00271 
00272                      pc.printf("Brightness Ramp Up\r");          
00273                      for (int contrast=0x10; contrast <= 0x7F; contrast++) { 
00274                         oled.setContrastControl(contrast);
00275                         wait(0.05);
00276                      }                   
00277 
00278                      pc.printf("Brightness Ramp Done\r");                              
00279                      
00280                      break;
00281 
00282           case 'B' :
00283                      pc.printf("Send Inverted Message\r");
00284                      oled.setInverted(true);                     
00285 //                     oled.writeString(0, 0, 13, "Hello World !");                                                 
00286                      oled.writeString(0, 0, "Hello World !");                                                                      
00287                      oled.setInverted(false);                                          
00288 
00289                      oled.printf(" Result is %d", 12345);                                                 
00290 
00291                      break;
00292                      
00293           case 'C' :
00294                      pc.printf("Flip and Mirror (Rewrite display to show horizontal effect)\r");
00295                      left = !left;
00296                      down = !down;
00297                      oled.setDisplayFlip(left, down);                     
00298                      break;
00299           
00300           case 'D' :                     
00301                      pc.printf("D: Blink and Fade (not supported)\r");
00302 
00303 //                     oled.setDisplayBlink(true);
00304 //                     wait(4);
00305 //                     oled.setDisplayBlink(false);
00306 
00307                      oled.setDisplayFade(true);
00308                      wait(4);
00309                      oled.setDisplayFade(false);
00310                      
00311                      pc.printf("D: Blink done\r");
00312                      break;                       
00313                      
00314           case 'E' :                     
00315                      pc.printf("E: Big Chars\r");
00316                      
00317                      oled.writeBigChar(0,  0, '+');
00318                      oled.writeBigChar(0, 16, '7');
00319                      oled.writeBigChar(0, 32, '8');
00320                      oled.writeBigChar(0, 48, '9');                                          
00321                      
00322                      pc.printf("E: Big Chars done\r");
00323                      break;   
00324                      
00325           case 'F' :                     
00326                      pc.printf("F: Progress Scale\r");
00327 
00328                      for (int percentage=0; percentage <= 100; percentage++) { 
00329                        oled.writeProgressBar(2, 0, percentage); 
00330                        oled.printf(" %3d%%", percentage);                                           
00331                        
00332                        oled.writeProgressBar(4, 0, 100 - percentage);                        
00333                        oled.printf(" %3d%%", 100 - percentage);                                                                  
00334 
00335                        oled.writeLevelBar(6, 0, percentage);                        
00336                        oled.printf(" %3dmV", percentage);                                                                  
00337                        
00338                        wait(0.05);
00339                      }                   
00340                     
00341                      pc.printf("F: Progress Scale done\r");                   
00342                      break;   
00343                      
00344           case 'G' :                     
00345                      pc.printf("G: Scroll\r");
00346 
00347                      for (int line=0; line < ROWS; line++) { 
00348                        oled.setDisplayStartLine(line);                        
00349                        wait(0.05);
00350                      }                   
00351                        
00352                      oled.setDisplayStartLine(0);                                            
00353                      
00354                      pc.printf("G: Scroll done\r");                   
00355                      break;   
00356                      
00357 
00358           case 'H' :                     
00359 //                     pc.printf("H: Hor Scroll\r");
00360                      pc.printf("H: Hor Scroll (Page 0-3)\r");
00361 //                     oled.setContinuousHorizontalScroll(true, PAGE0, PAGE7, SCROLL_INTERVAL_25_FRAMES);                     
00362                      oled.setContinuousHorizontalScroll(true, PAGE0, PAGE3, SCROLL_INTERVAL_25_FRAMES);                                          
00363                      oled.setDisplayScroll(true);
00364                        
00365                      wait(5);                     
00366                      
00367                      oled.setDisplayScroll(false);
00368                      
00369                      pc.printf("H: Hor Scroll done\r");                   
00370                      break;   
00371 
00372 
00373           case 'V' :                     
00374                      pc.printf("V: Ver and Hor Scroll (Page 0-7)\r");
00375 
00376 
00377                      oled.setContinuousVerticalAndHorizontalScroll(true, PAGE0, PAGE7, 0x01, SCROLL_INTERVAL_25_FRAMES);
00378                      oled.setVerticalScrollArea(20, 20); 
00379 
00380                      oled.setDisplayScroll(true);
00381 
00382                        
00383                      wait(5);                     
00384                      
00385                      oled.setDisplayScroll(false);
00386                      
00387                      pc.printf("V: Ver and Hor Scroll done\r");                   
00388                      break;   
00389 
00390                                                                                                          
00391         } //switch
00392       }//if
00393     }//while
00394 #endif
00395 
00396     pc.printf("Bye World!\n\r");                       
00397 }//main    
00398