4Dsystems Oled library

Dependents:   RDA5807M-FM-Radio

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers OLED32028P1T.cpp Source File

OLED32028P1T.cpp

00001 //  mbed library for 4DSystems uOLED-32028-P1T
00002 #include "mbed.h"
00003 #include "OLED32028P1T.h"
00004 
00005 OLED32028P1T::OLED32028P1T(PinName serialTx, PinName serialRx, PinName resetPin) : s(serialTx, serialRx), reset(resetPin){
00006     s.baud(BAUDRATE);
00007     while (s.readable()) {
00008         s.getc();
00009 } }
00010 // Initialise OLED display and redifine baud faster baud rate.
00011 void OLED32028P1T::init(){
00012     resetDisplay();
00013     s.putc(0x55);   // send byte for OLED to autodetect baudrate
00014     getResponse();
00015     s.putc (0x51); // send code to display to change baud rate    
00016     #if defined(TARGET_KL05Z) 
00017     s.putc (0x0E); // send new display baud rate from list below, upto 128k    
00018     #elif defined(TARGET_KL25Z) 
00019     s.putc (0x0E); // send new display baud rate from list below, upto 128k
00020     #else
00021     s.putc (0x0F); // send new display baud rate from list below, maximun 282353  
00022     #endif
00023     /*
00024             00hex : 110 Baud
00025             01hex : 300 Baud
00026             02hex : 600 Baud
00027             03hex : 1200 Baud
00028             04hex : 2400 Baud
00029             05hex : 4800 Baud
00030             06hex : 9600 Baud
00031             07hex : 14400 Baud
00032             08hex : 19200 Baud
00033             09hex : 31250 Baud
00034             0Ahex : 38400 Baud
00035             0Bhex : 56000 Baud
00036             0Chex : 57600 Baud
00037             0Dhex : 115200 Baud
00038             0Ehex : 128000 Baud (It is actually 129032Baud)
00039             0Fhex : 256000 Baud (It is actually 282353Baud)
00040             10hex : 128000 Baud
00041             11hex : 256000 Baud
00042      */       
00043     wait_ms(10);
00044     #undef BAUDRATE    
00045     #if defined(TARGET_KL05Z)
00046     #define BAUDRATE  129032 // ***** set matching new display baud rate, upto 128k *****
00047     #elif defined(TARGET_KL25Z)
00048     #define BAUDRATE  129032 // ***** set matching new display baud rate, upto 128k *****    
00049     # else
00050     #define BAUDRATE  282353 // ***** set matching new display baud rate, maximum 282353 *****   
00051     #endif
00052     s.baud(BAUDRATE);
00053     while (s.readable()) {
00054     s.getc();
00055 } }
00056 void OLED32028P1T::resetDisplay(){
00057     reset = 0;
00058     wait_ms(200);
00059     reset = 1;
00060     wait_ms(1000);
00061 }
00062 void OLED32028P1T::displayControl(int mode, int value){
00063     s.putc(0x59);
00064     s.putc(mode);
00065     s.putc(value);
00066     getResponse();
00067 }
00068 void OLED32028P1T::displayOff(){
00069     s.putc(0x59);
00070     s.putc(0x01);
00071     s.putc(0x00);
00072     getResponse();
00073 }
00074 void OLED32028P1T::displayOn(){
00075     s.putc(0x59);
00076     s.putc(0x01);
00077     s.putc(0x01);
00078     getResponse();
00079 }
00080 void OLED32028P1T::displaySleep(){
00081     s.putc(0x5A);
00082     s.putc(0x02);
00083     s.putc(0xFF);
00084     while (!s.readable()){}
00085     
00086 }
00087 void OLED32028P1T::getResponse(){
00088     char response = 0x15;
00089     lastCount = 0;
00090     NAKCount = 0;
00091     while (!s.readable() || response == 0x15) {
00092         wait_ms(1);
00093         lastCount++;
00094         if (s.readable()) {
00095             response = s.getc();    // Read response
00096             if (response == 0x06) {
00097                 return;
00098             } else if (response == 0x15) {
00099                 NAKCount++;
00100 } } } }
00101 int OLED32028P1T::toRGB(int red, int green, int blue){
00102     int outR = ((red * 31) / 255);
00103     int outG = ((green * 63) / 255);
00104     int outB = ((blue * 31) / 255);
00105     return (outR << 11) | (outG << 5) | outB;
00106 }
00107 void OLED32028P1T::clear(){
00108     s.putc(0x45);
00109     getResponse();
00110     _row = 0;
00111     _column = 0;
00112 }
00113 void OLED32028P1T::drawPixel(int x, int y, int color){
00114     s.putc(0x50);
00115     s.putc(x >> 8);
00116     s.putc(x & 0xFF);
00117     s.putc(y >> 8);
00118     s.putc(y & 0xFF); 
00119     s.putc(color >> 8);     // MSB
00120     s.putc(color & 0xFF);   // LSB
00121     getResponse();
00122 }
00123 void OLED32028P1T::drawLine(int x1, int y1, int x2, int y2, int color){
00124     s.putc(0x4C);      // Line
00125     s.putc(x1 >> 8);
00126     s.putc(x1 & 0xFF);
00127     s.putc(y1 >> 8);
00128     s.putc(y1 & 0xFF);
00129     s.putc(x2 >> 8);
00130     s.putc(x2 & 0xFF);
00131     s.putc(y2 >> 8);
00132     s.putc(y2 & 0xFF);
00133     s.putc(color >> 8);      // MSB
00134     s.putc(color & 0xFF);    // LSB
00135     getResponse();
00136 }
00137 void OLED32028P1T::drawRectangle(int x, int y, int width, int height, int color){
00138     s.putc(0x72);
00139     s.putc(x >> 8);
00140     s.putc(x & 0xFF);
00141     s.putc(y >> 8);
00142     s.putc(y & 0xFF);
00143     s.putc(x+width >> 8);
00144     s.putc(x+width & 0xFF);
00145     s.putc(y+height >> 8);
00146     s.putc(y+height & 0xFF);
00147     s.putc(color >> 8);      // MSB
00148     s.putc(color & 0xFF);    // LSB
00149     getResponse();
00150 }
00151 void OLED32028P1T::drawCircle(int x, int y, int radius, int color){
00152     s.putc(0x43);
00153     s.putc(0);
00154     s.putc(x);
00155     s.putc(0);
00156     s.putc(y);
00157     s.putc(0);
00158     s.putc(radius);
00159     s.putc(color >> 8);     // MSB
00160     s.putc(color & 0xFF);   // LSB
00161     getResponse();
00162 }
00163 void OLED32028P1T::setFontSize(int fontSize){
00164     s.putc(0x46);
00165     s.putc(fontSize);
00166     _fontSize = fontSize;
00167     getResponse();
00168 }
00169 void OLED32028P1T::setFontColor(int fontColor){
00170     _fontColor = fontColor;
00171 }
00172 void OLED32028P1T::setPenSize(int penSize){
00173     s.putc(0x70);
00174     s.putc(penSize);
00175     _penSize = penSize;
00176     getResponse();
00177 }
00178 void OLED32028P1T::setTextBackgroundType(int textBackgroundType){
00179     s.putc(0x4F);
00180     s.putc(textBackgroundType);
00181     getResponse();
00182 }
00183 void OLED32028P1T::setBackgroundColor(int color){
00184     s.putc(0x42);
00185     s.putc(color >> 8);      // MSB
00186     s.putc(color & 0xFF);    // LSB
00187     getResponse();
00188 }
00189 void OLED32028P1T::drawText(int column, int row, int font_size, char *mytext, int color){
00190     s.putc(0x73);
00191     // Adjust to center of the screen (26 Columns at font size 0)
00192     //int newCol = 13 - (strlen(mytext)/2);
00193     //printByte(newCol); // column
00194     s.putc(column); // column
00195     s.putc(row); // row
00196     s.putc(font_size); // font size (0 = 5x7 font, 1 = 8x8 font, 2 = 8x12 font, 3 = 12x16)
00197     s.putc(color >> 8);      // MSB
00198     s.putc(color & 0xFF);    // LSB
00199     for (int i = 0;  i < strlen(mytext); i++) {
00200         s.putc(mytext[i]); // character to write
00201     }
00202     s.putc(0x00);   // string terminator (always 0x00)
00203     getResponse();
00204 }
00205 void OLED32028P1T::drawTextGraphic(int x, int y, int font_size, char *mytext, int width, int height, int color){
00206     s.putc(0x53);        
00207     s.putc(x >> 8); //MSB
00208     s.putc(x & 0xFF); //LSB
00209     s.putc(y >> 8); // MSB
00210     s.putc(y & 0xFF); //LSB    
00211     s.putc(font_size); // font size (0 = 5x7 font, 1 = 8x8 font, 2 = 8x12 font, 3 = 12x16)
00212     s.putc(color >> 8);      // MSB
00213     s.putc(color & 0xFF);    // LSB
00214     s.putc(width); // character width
00215     s.putc(height); // character height
00216     for (int i = 0;  i < strlen(mytext); i++) {
00217         s.putc(mytext[i]); // character to write
00218     }
00219     s.putc(0x00);   // string terminator (always 0x00)
00220     getResponse();
00221 }
00222 void OLED32028P1T::drawSingleChar(int column, int row, int theChar, int color){
00223     s.putc(0x54);
00224     s.putc(theChar);
00225     s.putc(column);
00226     s.putc(row);
00227     s.putc(color >> 8);      // MSB
00228     s.putc(color & 0xFF);    // LSB
00229     getResponse();
00230 }
00231 char OLED32028P1T::getPenSize(){
00232     return _penSize;
00233 }
00234 void OLED32028P1T::drawTextButton(int up_down, int x, int y, int button_colour, int font, int string_colour, int width, int height, char *mytext){
00235     s.putc(0x62);    
00236     s.putc(up_down);    
00237     s.putc(x >> 8);
00238     s.putc(x & 0xFF);
00239     s.putc(y >> 8);
00240     s.putc(y & 0xFF);    
00241     s.putc(button_colour >> 8);
00242     s.putc(button_colour & 0xFF);   
00243     s.putc(font); 
00244     s.putc(string_colour >> 8);
00245     s.putc(string_colour & 0xFF);    
00246     s.putc(width);
00247     s.putc(height);    
00248     for (int i = 0;  i < strlen(mytext); i++) {
00249         s.putc(mytext[i]); // characters to write
00250     }   
00251     s.putc(0x00);   
00252     getResponse();
00253 }
00254 void OLED32028P1T::enableTouch(){
00255     s.putc(0x59); // display control command
00256     s.putc(0x05); // Touch Control
00257     s.putc(0x00); // enable Touch
00258     getResponse();
00259 }
00260 void OLED32028P1T::disableTouch(){
00261     s.putc(0x59); // display control command
00262     s.putc(0x05); // Touch Control
00263     s.putc(0x01); // disable Touch
00264     getResponse();
00265 }    
00266 unsigned char OLED32028P1T::getTouch(int *xbuffer, int *ybuffer){  //Touch Press on the screen, if return=1, touch coordinates are stored on the buffer[]
00267   
00268   //xbuffer=0;ybuffer=0;
00269   s.putc(0x6F);
00270   s.putc(0x04);
00271   xbuffer[0]=s.getc();
00272   xbuffer[0]=xbuffer[0]<<8;
00273   xbuffer[0]|=s.getc();
00274   ybuffer[0]=s.getc();
00275   ybuffer[0]=ybuffer[0]<<8;
00276   ybuffer[0]|=s.getc();
00277   
00278   if(xbuffer[0] !=  0){
00279   s.putc(0x6F);
00280   s.putc(0x05);
00281   xbuffer[0]=s.getc();
00282   xbuffer[0]=xbuffer[0]<<8;
00283   xbuffer[0]|=s.getc();
00284   ybuffer[0]=s.getc();
00285   ybuffer[0]=ybuffer[0]<<8;
00286   ybuffer[0]|=s.getc(); 
00287     return 1;
00288   }else{
00289     return 0;
00290   }  
00291 }
00292 unsigned char OLED32028P1T::getTouchPress(int *xbuffer, int *ybuffer){  //Touch Release on the screen, if return=1, touch coordinates are stored on the buffer[]
00293   s.putc(0x6F);
00294   s.putc(0x01);
00295   xbuffer[0]=s.getc();
00296   xbuffer[0]=xbuffer[0]<<8;
00297   xbuffer[0]|=s.getc();
00298   ybuffer[0]=s.getc();
00299   ybuffer[0]=ybuffer[0]<<8;
00300   ybuffer[0]|=s.getc();
00301   
00302   if(xbuffer[0] !=  0){
00303   s.putc(0x6F);
00304   s.putc(0x05);
00305   xbuffer[0]=s.getc();
00306   xbuffer[0]=xbuffer[0]<<8;
00307   xbuffer[0]|=s.getc();
00308   ybuffer[0]=s.getc();
00309   ybuffer[0]=ybuffer[0]<<8;
00310   ybuffer[0]|=s.getc(); 
00311     return 1;
00312   }else{
00313     return 0;
00314   }  
00315 }
00316 unsigned char OLED32028P1T::getTouchRelease(int *xbuffer, int *ybuffer){  //Touch Release on the screen, if return=1, touch coordinates are stored on the buffer[]
00317   s.putc(0x6F);
00318   s.putc(0x02);
00319   xbuffer[0]=s.getc();
00320   xbuffer[0]=xbuffer[0]<<8;
00321   xbuffer[0]|=s.getc();
00322   ybuffer[0]=s.getc();
00323   ybuffer[0]=ybuffer[0]<<8;
00324   ybuffer[0]|=s.getc();
00325   
00326   if(xbuffer[0] !=  0){
00327   s.putc(0x6F);
00328   s.putc(0x05);
00329   xbuffer[0]=s.getc();
00330   xbuffer[0]=xbuffer[0]<<8;
00331   xbuffer[0]|=s.getc();
00332   ybuffer[0]=s.getc();
00333   ybuffer[0]=ybuffer[0]<<8;
00334   ybuffer[0]|=s.getc(); 
00335     return 1;
00336   }else{
00337     return 0;
00338   }  
00339 }
00340 void OLED32028P1T::setTouchArea(int x1, int y1 , int x2, int y2) { // define touch area
00341     char command[9]= "";int i;
00342     command[0] = (0x75);
00343     command[1] = (x1 >> 8) & 0xFF;
00344     command[2] = x1 & 0xFF;
00345     command[3] = (y1 >> 8) & 0xFF;
00346     command[4] = y1 & 0xFF;
00347     command[5] = (x2 >> 8) & 0xFF;
00348     command[6] = x2 & 0xFF;
00349     command[7] = (y2 >> 8) & 0xFF;
00350     command[8] = y2 & 0xFF;
00351     for (i = 0; i < 9; i++) s.putc(command[i]);     
00352      getResponse();
00353 }
00354 void OLED32028P1T::resetTouchArea(){
00355     s.putc(0x59); // display control command
00356     s.putc(0x05); // Touch Control
00357     s.putc(0x02); // reset Touch Area to whole screen
00358     getResponse();
00359 }  
00360 void OLED32028P1T::waitTouch(int x){
00361     s.putc(0x77); // wait Touch command
00362     s.putc(x >> 8);      // MSB
00363     s.putc(x & 0xFF);    // LSB    
00364     getResponse();
00365 }
00366 unsigned char OLED32028P1T::stringSD(int x1, int y1, int x2, int y2, int colour, unsigned char font, unsigned char fill, int BS, int BR, char name[]){
00367        //Draw a String from a text file contained on the micro SD card on the screen
00368   unsigned char counter=0;  
00369   s.putc('S'); 
00370   s.putc('S'); //from SD
00371   s.putc(x1>>8); 
00372   s.putc(x1);
00373   s.putc(y1>>8);
00374   s.putc(y1);
00375   s.putc(x2>>8); 
00376   s.putc(x2);
00377   s.putc(y2>>8);
00378   s.putc(y2);  
00379   s.putc(colour>>8);
00380   s.putc(colour);
00381   s.putc(font); 
00382   s.putc(fill); 
00383   s.putc(BS>>8);
00384   s.putc(BS);  
00385   s.putc(BR>>8);
00386   s.putc(BR);  
00387   while(1){
00388     s.putc(name[counter]);
00389     if(name[counter]==0x00){
00390       break;
00391     }    
00392     counter++;
00393   }
00394   return s.getc();
00395 }
00396 unsigned char OLED32028P1T::imageSD(int x, int y, char name[]){
00397         //Draw an Image contained on the micro SD card on the screen, top left corner coordinates
00398   unsigned char counter=0;  
00399   s.putc('I'); 
00400   s.putc('S'); //from SD
00401   s.putc(x>>8); 
00402   s.putc(x);
00403   s.putc(y>>8);
00404   s.putc(y);
00405   while(1){
00406     s.putc(name[counter]);
00407     if(name[counter]==0x00){
00408       break;
00409     }    
00410     counter++;
00411   }
00412   return s.getc();
00413 }
00414 int OLED32028P1T::_putc(int value){
00415     if (value == '\n') {
00416         _column = 0;
00417         _row++;
00418         if(_row >= rows()) {
00419             _row = 0;
00420         }
00421     } else {
00422         drawSingleChar(_column, _row, value, _fontColor);
00423         wait_ms(1);    //TODO: why is this needed?
00424         _column++;
00425         if (_column >= columns()) {
00426             _column = 0;
00427             _row++;
00428             if(_row >= rows()) {
00429                 _row = 0;
00430         } } }
00431     return value;
00432 }
00433 void OLED32028P1T::locate(int column, int row){
00434     _column = column;
00435     _row = row;
00436 }
00437 int OLED32028P1T::rows(){
00438     return 30;
00439 }
00440 int OLED32028P1T::columns(){
00441     return 55;
00442 }
00443 int OLED32028P1T::_getc(){
00444     return -1;
00445 }