4Dsystems Oled library

Dependents:   RDA5807M-FM-Radio

Files at this revision

API Documentation at this revision

Comitter:
star297
Date:
Thu Jan 08 12:01:58 2015 +0000
Commit message:
Update baud rate defines

Changed in this revision

OLED32028P1T.cpp Show annotated file Show diff for this revision Revisions of this file
OLED32028P1T.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OLED32028P1T.cpp	Thu Jan 08 12:01:58 2015 +0000
@@ -0,0 +1,445 @@
+//  mbed library for 4DSystems uOLED-32028-P1T
+#include "mbed.h"
+#include "OLED32028P1T.h"
+
+OLED32028P1T::OLED32028P1T(PinName serialTx, PinName serialRx, PinName resetPin) : s(serialTx, serialRx), reset(resetPin){
+    s.baud(BAUDRATE);
+    while (s.readable()) {
+        s.getc();
+} }
+// Initialise OLED display and redifine baud faster baud rate.
+void OLED32028P1T::init(){
+    resetDisplay();
+    s.putc(0x55);   // send byte for OLED to autodetect baudrate
+    getResponse();
+    s.putc (0x51); // send code to display to change baud rate    
+    #if defined(TARGET_KL05Z) 
+    s.putc (0x0E); // send new display baud rate from list below, upto 128k    
+    #elif defined(TARGET_KL25Z) 
+    s.putc (0x0E); // send new display baud rate from list below, upto 128k
+    #else
+    s.putc (0x0F); // send new display baud rate from list below, maximun 282353  
+    #endif
+    /*
+            00hex : 110 Baud
+            01hex : 300 Baud
+            02hex : 600 Baud
+            03hex : 1200 Baud
+            04hex : 2400 Baud
+            05hex : 4800 Baud
+            06hex : 9600 Baud
+            07hex : 14400 Baud
+            08hex : 19200 Baud
+            09hex : 31250 Baud
+            0Ahex : 38400 Baud
+            0Bhex : 56000 Baud
+            0Chex : 57600 Baud
+            0Dhex : 115200 Baud
+            0Ehex : 128000 Baud (It is actually 129032Baud)
+            0Fhex : 256000 Baud (It is actually 282353Baud)
+            10hex : 128000 Baud
+            11hex : 256000 Baud
+     */       
+    wait_ms(10);
+    #undef BAUDRATE    
+    #if defined(TARGET_KL05Z)
+    #define BAUDRATE  129032 // ***** set matching new display baud rate, upto 128k *****
+    #elif defined(TARGET_KL25Z)
+    #define BAUDRATE  129032 // ***** set matching new display baud rate, upto 128k *****    
+    # else
+    #define BAUDRATE  282353 // ***** set matching new display baud rate, maximum 282353 *****   
+    #endif
+    s.baud(BAUDRATE);
+    while (s.readable()) {
+    s.getc();
+} }
+void OLED32028P1T::resetDisplay(){
+    reset = 0;
+    wait_ms(200);
+    reset = 1;
+    wait_ms(1000);
+}
+void OLED32028P1T::displayControl(int mode, int value){
+    s.putc(0x59);
+    s.putc(mode);
+    s.putc(value);
+    getResponse();
+}
+void OLED32028P1T::displayOff(){
+    s.putc(0x59);
+    s.putc(0x01);
+    s.putc(0x00);
+    getResponse();
+}
+void OLED32028P1T::displayOn(){
+    s.putc(0x59);
+    s.putc(0x01);
+    s.putc(0x01);
+    getResponse();
+}
+void OLED32028P1T::displaySleep(){
+    s.putc(0x5A);
+    s.putc(0x02);
+    s.putc(0xFF);
+    while (!s.readable()){}
+    
+}
+void OLED32028P1T::getResponse(){
+    char response = 0x15;
+    lastCount = 0;
+    NAKCount = 0;
+    while (!s.readable() || response == 0x15) {
+        wait_ms(1);
+        lastCount++;
+        if (s.readable()) {
+            response = s.getc();    // Read response
+            if (response == 0x06) {
+                return;
+            } else if (response == 0x15) {
+                NAKCount++;
+} } } }
+int OLED32028P1T::toRGB(int red, int green, int blue){
+    int outR = ((red * 31) / 255);
+    int outG = ((green * 63) / 255);
+    int outB = ((blue * 31) / 255);
+    return (outR << 11) | (outG << 5) | outB;
+}
+void OLED32028P1T::clear(){
+    s.putc(0x45);
+    getResponse();
+    _row = 0;
+    _column = 0;
+}
+void OLED32028P1T::drawPixel(int x, int y, int color){
+    s.putc(0x50);
+    s.putc(x >> 8);
+    s.putc(x & 0xFF);
+    s.putc(y >> 8);
+    s.putc(y & 0xFF); 
+    s.putc(color >> 8);     // MSB
+    s.putc(color & 0xFF);   // LSB
+    getResponse();
+}
+void OLED32028P1T::drawLine(int x1, int y1, int x2, int y2, int color){
+    s.putc(0x4C);      // Line
+    s.putc(x1 >> 8);
+    s.putc(x1 & 0xFF);
+    s.putc(y1 >> 8);
+    s.putc(y1 & 0xFF);
+    s.putc(x2 >> 8);
+    s.putc(x2 & 0xFF);
+    s.putc(y2 >> 8);
+    s.putc(y2 & 0xFF);
+    s.putc(color >> 8);      // MSB
+    s.putc(color & 0xFF);    // LSB
+    getResponse();
+}
+void OLED32028P1T::drawRectangle(int x, int y, int width, int height, int color){
+    s.putc(0x72);
+    s.putc(x >> 8);
+    s.putc(x & 0xFF);
+    s.putc(y >> 8);
+    s.putc(y & 0xFF);
+    s.putc(x+width >> 8);
+    s.putc(x+width & 0xFF);
+    s.putc(y+height >> 8);
+    s.putc(y+height & 0xFF);
+    s.putc(color >> 8);      // MSB
+    s.putc(color & 0xFF);    // LSB
+    getResponse();
+}
+void OLED32028P1T::drawCircle(int x, int y, int radius, int color){
+    s.putc(0x43);
+    s.putc(0);
+    s.putc(x);
+    s.putc(0);
+    s.putc(y);
+    s.putc(0);
+    s.putc(radius);
+    s.putc(color >> 8);     // MSB
+    s.putc(color & 0xFF);   // LSB
+    getResponse();
+}
+void OLED32028P1T::setFontSize(int fontSize){
+    s.putc(0x46);
+    s.putc(fontSize);
+    _fontSize = fontSize;
+    getResponse();
+}
+void OLED32028P1T::setFontColor(int fontColor){
+    _fontColor = fontColor;
+}
+void OLED32028P1T::setPenSize(int penSize){
+    s.putc(0x70);
+    s.putc(penSize);
+    _penSize = penSize;
+    getResponse();
+}
+void OLED32028P1T::setTextBackgroundType(int textBackgroundType){
+    s.putc(0x4F);
+    s.putc(textBackgroundType);
+    getResponse();
+}
+void OLED32028P1T::setBackgroundColor(int color){
+    s.putc(0x42);
+    s.putc(color >> 8);      // MSB
+    s.putc(color & 0xFF);    // LSB
+    getResponse();
+}
+void OLED32028P1T::drawText(int column, int row, int font_size, char *mytext, int color){
+    s.putc(0x73);
+    // Adjust to center of the screen (26 Columns at font size 0)
+    //int newCol = 13 - (strlen(mytext)/2);
+    //printByte(newCol); // column
+    s.putc(column); // column
+    s.putc(row); // row
+    s.putc(font_size); // font size (0 = 5x7 font, 1 = 8x8 font, 2 = 8x12 font, 3 = 12x16)
+    s.putc(color >> 8);      // MSB
+    s.putc(color & 0xFF);    // LSB
+    for (int i = 0;  i < strlen(mytext); i++) {
+        s.putc(mytext[i]); // character to write
+    }
+    s.putc(0x00);   // string terminator (always 0x00)
+    getResponse();
+}
+void OLED32028P1T::drawTextGraphic(int x, int y, int font_size, char *mytext, int width, int height, int color){
+    s.putc(0x53);        
+    s.putc(x >> 8); //MSB
+    s.putc(x & 0xFF); //LSB
+    s.putc(y >> 8); // MSB
+    s.putc(y & 0xFF); //LSB    
+    s.putc(font_size); // font size (0 = 5x7 font, 1 = 8x8 font, 2 = 8x12 font, 3 = 12x16)
+    s.putc(color >> 8);      // MSB
+    s.putc(color & 0xFF);    // LSB
+    s.putc(width); // character width
+    s.putc(height); // character height
+    for (int i = 0;  i < strlen(mytext); i++) {
+        s.putc(mytext[i]); // character to write
+    }
+    s.putc(0x00);   // string terminator (always 0x00)
+    getResponse();
+}
+void OLED32028P1T::drawSingleChar(int column, int row, int theChar, int color){
+    s.putc(0x54);
+    s.putc(theChar);
+    s.putc(column);
+    s.putc(row);
+    s.putc(color >> 8);      // MSB
+    s.putc(color & 0xFF);    // LSB
+    getResponse();
+}
+char OLED32028P1T::getPenSize(){
+    return _penSize;
+}
+void OLED32028P1T::drawTextButton(int up_down, int x, int y, int button_colour, int font, int string_colour, int width, int height, char *mytext){
+    s.putc(0x62);    
+    s.putc(up_down);    
+    s.putc(x >> 8);
+    s.putc(x & 0xFF);
+    s.putc(y >> 8);
+    s.putc(y & 0xFF);    
+    s.putc(button_colour >> 8);
+    s.putc(button_colour & 0xFF);   
+    s.putc(font); 
+    s.putc(string_colour >> 8);
+    s.putc(string_colour & 0xFF);    
+    s.putc(width);
+    s.putc(height);    
+    for (int i = 0;  i < strlen(mytext); i++) {
+        s.putc(mytext[i]); // characters to write
+    }   
+    s.putc(0x00);   
+    getResponse();
+}
+void OLED32028P1T::enableTouch(){
+    s.putc(0x59); // display control command
+    s.putc(0x05); // Touch Control
+    s.putc(0x00); // enable Touch
+    getResponse();
+}
+void OLED32028P1T::disableTouch(){
+    s.putc(0x59); // display control command
+    s.putc(0x05); // Touch Control
+    s.putc(0x01); // disable Touch
+    getResponse();
+}    
+unsigned char OLED32028P1T::getTouch(int *xbuffer, int *ybuffer){  //Touch Press on the screen, if return=1, touch coordinates are stored on the buffer[]
+  
+  //xbuffer=0;ybuffer=0;
+  s.putc(0x6F);
+  s.putc(0x04);
+  xbuffer[0]=s.getc();
+  xbuffer[0]=xbuffer[0]<<8;
+  xbuffer[0]|=s.getc();
+  ybuffer[0]=s.getc();
+  ybuffer[0]=ybuffer[0]<<8;
+  ybuffer[0]|=s.getc();
+  
+  if(xbuffer[0] !=  0){
+  s.putc(0x6F);
+  s.putc(0x05);
+  xbuffer[0]=s.getc();
+  xbuffer[0]=xbuffer[0]<<8;
+  xbuffer[0]|=s.getc();
+  ybuffer[0]=s.getc();
+  ybuffer[0]=ybuffer[0]<<8;
+  ybuffer[0]|=s.getc(); 
+    return 1;
+  }else{
+    return 0;
+  }  
+}
+unsigned char OLED32028P1T::getTouchPress(int *xbuffer, int *ybuffer){  //Touch Release on the screen, if return=1, touch coordinates are stored on the buffer[]
+  s.putc(0x6F);
+  s.putc(0x01);
+  xbuffer[0]=s.getc();
+  xbuffer[0]=xbuffer[0]<<8;
+  xbuffer[0]|=s.getc();
+  ybuffer[0]=s.getc();
+  ybuffer[0]=ybuffer[0]<<8;
+  ybuffer[0]|=s.getc();
+  
+  if(xbuffer[0] !=  0){
+  s.putc(0x6F);
+  s.putc(0x05);
+  xbuffer[0]=s.getc();
+  xbuffer[0]=xbuffer[0]<<8;
+  xbuffer[0]|=s.getc();
+  ybuffer[0]=s.getc();
+  ybuffer[0]=ybuffer[0]<<8;
+  ybuffer[0]|=s.getc(); 
+    return 1;
+  }else{
+    return 0;
+  }  
+}
+unsigned char OLED32028P1T::getTouchRelease(int *xbuffer, int *ybuffer){  //Touch Release on the screen, if return=1, touch coordinates are stored on the buffer[]
+  s.putc(0x6F);
+  s.putc(0x02);
+  xbuffer[0]=s.getc();
+  xbuffer[0]=xbuffer[0]<<8;
+  xbuffer[0]|=s.getc();
+  ybuffer[0]=s.getc();
+  ybuffer[0]=ybuffer[0]<<8;
+  ybuffer[0]|=s.getc();
+  
+  if(xbuffer[0] !=  0){
+  s.putc(0x6F);
+  s.putc(0x05);
+  xbuffer[0]=s.getc();
+  xbuffer[0]=xbuffer[0]<<8;
+  xbuffer[0]|=s.getc();
+  ybuffer[0]=s.getc();
+  ybuffer[0]=ybuffer[0]<<8;
+  ybuffer[0]|=s.getc(); 
+    return 1;
+  }else{
+    return 0;
+  }  
+}
+void OLED32028P1T::setTouchArea(int x1, int y1 , int x2, int y2) { // define touch area
+    char command[9]= "";int i;
+    command[0] = (0x75);
+    command[1] = (x1 >> 8) & 0xFF;
+    command[2] = x1 & 0xFF;
+    command[3] = (y1 >> 8) & 0xFF;
+    command[4] = y1 & 0xFF;
+    command[5] = (x2 >> 8) & 0xFF;
+    command[6] = x2 & 0xFF;
+    command[7] = (y2 >> 8) & 0xFF;
+    command[8] = y2 & 0xFF;
+    for (i = 0; i < 9; i++) s.putc(command[i]);     
+     getResponse();
+}
+void OLED32028P1T::resetTouchArea(){
+    s.putc(0x59); // display control command
+    s.putc(0x05); // Touch Control
+    s.putc(0x02); // reset Touch Area to whole screen
+    getResponse();
+}  
+void OLED32028P1T::waitTouch(int x){
+    s.putc(0x77); // wait Touch command
+    s.putc(x >> 8);      // MSB
+    s.putc(x & 0xFF);    // LSB    
+    getResponse();
+}
+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[]){
+       //Draw a String from a text file contained on the micro SD card on the screen
+  unsigned char counter=0;  
+  s.putc('S'); 
+  s.putc('S'); //from SD
+  s.putc(x1>>8); 
+  s.putc(x1);
+  s.putc(y1>>8);
+  s.putc(y1);
+  s.putc(x2>>8); 
+  s.putc(x2);
+  s.putc(y2>>8);
+  s.putc(y2);  
+  s.putc(colour>>8);
+  s.putc(colour);
+  s.putc(font); 
+  s.putc(fill); 
+  s.putc(BS>>8);
+  s.putc(BS);  
+  s.putc(BR>>8);
+  s.putc(BR);  
+  while(1){
+    s.putc(name[counter]);
+    if(name[counter]==0x00){
+      break;
+    }    
+    counter++;
+  }
+  return s.getc();
+}
+unsigned char OLED32028P1T::imageSD(int x, int y, char name[]){
+        //Draw an Image contained on the micro SD card on the screen, top left corner coordinates
+  unsigned char counter=0;  
+  s.putc('I'); 
+  s.putc('S'); //from SD
+  s.putc(x>>8); 
+  s.putc(x);
+  s.putc(y>>8);
+  s.putc(y);
+  while(1){
+    s.putc(name[counter]);
+    if(name[counter]==0x00){
+      break;
+    }    
+    counter++;
+  }
+  return s.getc();
+}
+int OLED32028P1T::_putc(int value){
+    if (value == '\n') {
+        _column = 0;
+        _row++;
+        if(_row >= rows()) {
+            _row = 0;
+        }
+    } else {
+        drawSingleChar(_column, _row, value, _fontColor);
+        wait_ms(1);    //TODO: why is this needed?
+        _column++;
+        if (_column >= columns()) {
+            _column = 0;
+            _row++;
+            if(_row >= rows()) {
+                _row = 0;
+        } } }
+    return value;
+}
+void OLED32028P1T::locate(int column, int row){
+    _column = column;
+    _row = row;
+}
+int OLED32028P1T::rows(){
+    return 30;
+}
+int OLED32028P1T::columns(){
+    return 55;
+}
+int OLED32028P1T::_getc(){
+    return -1;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OLED32028P1T.h	Thu Jan 08 12:01:58 2015 +0000
@@ -0,0 +1,110 @@
+//  mbed library for 4DSystems uOLED-32028-P1T
+
+//  *****OLED_BAUDRATE must start at 9600*******
+
+#define BAUDRATE                        9600  // MUST use 9600 here to initialise display, can be redefined upto 256K in OLED3208P1T.cpp
+
+// Screen states
+#define OFF                             0x00
+#define ON                              0x01
+
+// Text properties
+#define TEXT                            0x73
+#define FONT5X7                         0x00
+#define FONT8X8                         0x01
+#define FONT8X12                        0x02
+#define FONT12X16                       0x03
+#define TEXTFORMATED                    0x54
+#define SET_TEXT_BACKGROUND_TYPE        0x4F
+#define SET_BACKGROUND_COLOR            0x42
+#define TEXT_TRANSPARENT                0x00
+#define TEXT_OPAQUE                     0x01
+#define OLED_TEXT_BUTTON                0x62
+
+// Colours
+#define BLACK                           0x0000
+#define WHITE                           0xFFFF
+#define RED                             0xF800
+#define GREEN                           0x07E0
+#define BLUE                            0x001F
+#define YELLOW                          0xFFE0
+#define CYAN                            0x07FF
+#define MAGENTA                         0xF81F
+#define BLUE2                           0xA6BF
+#define GREEN2                          0x2500
+
+#define red_min 0//150
+#define red_max 255
+#define blue_min 0//185
+#define blue_max 255
+#define green_min 0//195
+#define green_max 255
+
+class OLED32028P1T : public Stream {
+public:
+
+    OLED32028P1T(PinName serialTx, PinName serialRx, PinName resetPin); // Default constructor
+    
+// TEXT FUNCTIONS     
+    void setFontSize(int fontSize); // fontSize can be: OLED_FONT5X7, OLED_FONT8X8, or OLED_FONT8X12
+    void setFontColor(int fontColor); // Set font color, for use with printf(); all other functions override this setting.
+    void drawText(int  column, int row, int font_size, char *mytext, int color); // Draw string text at character location column & row)
+    void drawSingleChar(int column, int row, int theChar, int color); // Draw a single ASCII character at the specified location.   
+    void drawTextGraphic(int x, int y, int font_size, char *mytext, int color, int width, int height); // Draw string text at pixel location x & y)
+// GRAPHIC FUNCTIONS
+    void drawCircle(int x, int y, int radius, int color);
+    void drawRectangle(int x, int y, int width, int height, int color);
+    void drawLine(int x1, int y1, int x2, int y2, int color);
+    void drawPixel(int x, int y, int color);   
+    void drawTextButton(int up_down, int x, int y, int button_colour, int font, int string_colour, int width, int height, char *mytext);
+    
+// TOUCH FUNCTIONS
+    void enableTouch(); // Enables the Touch Screen
+    void disableTouch(); // Disables the Touch Screen   
+    void setTouchArea(int, int, int, int); // define Touch Area 0,0,219,239 for whole screen 
+    void resetTouchArea(); // Resets Touch Area to whole screen
+    void waitTouch(int); // wait for Touch, wait time in milliseconds. Maximum value of 65,535 msec or 65.5 seconds used for delay in sd card image display.     
+    unsigned char getTouch(int *xbuffer, int *ybuffer); // get Touch co-ordiantes
+    unsigned char getTouchRelease(int *xbuffer, int *ybuffer); // get Touch Release co-ordiantes
+    unsigned char getTouchPress(int *xbuffer, int *ybuffer); // get Touch Press co-ordiantes 
+    
+    
+// SD FUNCTIONS 
+    unsigned char stringSD(int, int, int, int, int, unsigned char, unsigned char, int, int, char[]);
+    unsigned char imageSD(int , int , char[]);   
+    
+// DISPLAY CONTROL FUNCTION 
+    void resetDisplay(); // Reset the display using the reset pin (the reset pin is active-low).    
+    void init(); // Initialise OLED display.    
+    void baudReset();
+    void getResponse(); // Processes responses (ACK or NAK) from the OLED. A new command cannot be sent to the OLED until a NAK is received, so
+                        // this function waits for the minimum time needed.    
+    void clear(); // Clear the OLED screen.
+    void setPenSize(int penSize); // Set the "pen size".
+    void setTextBackgroundType(int textBackgroundType); //textBackgroundType can be OLED_SET_TEXT_TRANSPARENT or OLED_SET_TEXT_OPAQUE
+    void setBackgroundColor(int color);   
+    int toRGB(int red, int green, int blue);// Calculate 16-bit value from RGB (0 to 63, 565 format)
+    void displayControl(int mode, int value); // Display control functions, such as display ON/OFF, power-up/power-down.
+    void displayOff();
+    void displayOn();
+    void displaySleep();   
+    char getPenSize(); // Get Pen Size
+    int rows();  //Get number of text rows TODO: must depend on font size
+    int columns();// Get number of text columns    
+    virtual void locate(int column, int row);// Set text cursor location   
+    int lastCount;    
+    int NAKCount;
+        
+protected:
+    virtual int _putc(int value);
+    virtual int _getc();
+    short _column;   //Text cursor column number
+    short _row;   //Text cursor row number    
+    int _fontSize;
+    int _penSize;
+    int _fontColor;
+    
+private:
+    Serial s;
+    DigitalOut  reset;   
+};