A first port of the excellent Adafruit ST7735 library

Dependents:   mbed-pong

Revision:
4:2123ea52a4d9
Parent:
3:5cd5edbf5b72
Child:
5:9c04464cd1b4
--- a/Adafruit_ST7735.cpp	Sun Nov 22 11:26:10 2015 +0000
+++ b/Adafruit_ST7735.cpp	Sun Nov 22 12:39:52 2015 +0000
@@ -19,6 +19,10 @@
 #include "mbed.h"
 #include "Adafruit_ST7735.h"
 
+inline uint16_t swapcolor(uint16_t x) { 
+  return (x << 11) | (x & 0x07E0) | (x >> 11);
+}
+
 // Constructor 
 Adafruit_ST7735::Adafruit_ST7735(PinName mosi, PinName miso, PinName sck, PinName cs, PinName rs, PinName rst) 
         : lcdPort(mosi, miso, sck), _cs(cs), _rs(rs), _rst(rst), Adafruit_GFX(ST7735_TFTWIDTH, ST7735_TFTHEIGHT) 
@@ -191,145 +195,6 @@
       100 };                  //     100 ms delay
 
 
-#ifdef oldshit
-static unsigned char
-Bcmd[] = {                  // Initialization commands for 7735B screens
-    18,                       // 18 commands in list:
-    ST7735_SWRESET,   DELAY,  //  1: Software reset, no args, w/delay
-    50,                     //     50 ms delay
-    ST7735_SLPOUT ,   DELAY,  //  2: Out of sleep mode, no args, w/delay
-    255,                    //     255 = 500 ms delay
-    ST7735_COLMOD , 1+DELAY,  //  3: Set color mode, 1 arg + delay:
-    0x05,                   //     16-bit color
-    10,                     //     10 ms delay
-    ST7735_FRMCTR1, 3+DELAY,  //  4: Frame rate control, 3 args + delay:
-    0x00,                   //     fastest refresh
-    0x06,                   //     6 lines front porch
-    0x03,                   //     3 lines back porch
-    10,                     //     10 ms delay
-    ST7735_MADCTL , 1      ,  //  5: Memory access ctrl (directions), 1 arg:
-    0x08,                   //     Row addr/col addr, bottom to top refresh
-    ST7735_DISSET5, 2      ,  //  6: Display settings #5, 2 args, no delay:
-    0x15,                   //     1 clk cycle nonoverlap, 2 cycle gate
-    //     rise, 3 cycle osc equalize
-    0x02,                   //     Fix on VTL
-    ST7735_INVCTR , 1      ,  //  7: Display inversion control, 1 arg:
-    0x0,                    //     Line inversion
-    ST7735_PWCTR1 , 2+DELAY,  //  8: Power control, 2 args + delay:
-    0x02,                   //     GVDD = 4.7V
-    0x70,                   //     1.0uA
-    10,                     //     10 ms delay
-    ST7735_PWCTR2 , 1      ,  //  9: Power control, 1 arg, no delay:
-    0x05,                   //     VGH = 14.7V, VGL = -7.35V
-    ST7735_PWCTR3 , 2      ,  // 10: Power control, 2 args, no delay:
-    0x01,                   //     Opamp current small
-    0x02,                   //     Boost frequency
-    ST7735_VMCTR1 , 2+DELAY,  // 11: Power control, 2 args + delay:
-    0x3C,                   //     VCOMH = 4V
-    0x38,                   //     VCOML = -1.1V
-    10,                     //     10 ms delay
-    ST7735_PWCTR6 , 2      ,  // 12: Power control, 2 args, no delay:
-    0x11, 0x15,
-    ST7735_GMCTRP1,16      ,  // 13: Magical unicorn dust, 16 args, no delay:
-    0x09, 0x16, 0x09, 0x20, //     (seriously though, not sure what
-    0x21, 0x1B, 0x13, 0x19, //      these config values represent)
-    0x17, 0x15, 0x1E, 0x2B,
-    0x04, 0x05, 0x02, 0x0E,
-    ST7735_GMCTRN1,16+DELAY,  // 14: Sparkles and rainbows, 16 args + delay:
-    0x0B, 0x14, 0x08, 0x1E, //     (ditto)
-    0x22, 0x1D, 0x18, 0x1E,
-    0x1B, 0x1A, 0x24, 0x2B,
-    0x06, 0x06, 0x02, 0x0F,
-    10,                     //     10 ms delay
-    ST7735_CASET  , 4      ,  // 15: Column addr set, 4 args, no delay:
-    0x00, 0x02,             //     XSTART = 2
-    0x00, 0x81,             //     XEND = 129
-    ST7735_RASET  , 4      ,  // 16: Row addr set, 4 args, no delay:
-    0x00, 0x02,             //     XSTART = 1
-    0x00, 0x81,             //     XEND = 160
-    ST7735_NORON  ,   DELAY,  // 17: Normal display on, no args, w/delay
-    10,                     //     10 ms delay
-    ST7735_DISPON ,   DELAY,  // 18: Main screen turn on, no args, w/delay
-    255
-},                  //     255 = 500 ms delay
-
-Rcmd1[] = {                 // Init for 7735R, part 1 (red or green tab)
-    15,                       // 15 commands in list:
-    ST7735_SWRESET,   DELAY,  //  1: Software reset, 0 args, w/delay
-    150,                    //     150 ms delay
-    ST7735_SLPOUT ,   DELAY,  //  2: Out of sleep mode, 0 args, w/delay
-    255,                    //     500 ms delay
-    ST7735_FRMCTR1, 3      ,  //  3: Frame rate ctrl - normal mode, 3 args:
-    0x01, 0x2C, 0x2D,       //     Rate = fosc/(1x2+40) * (LINE+2C+2D)
-    ST7735_FRMCTR2, 3      ,  //  4: Frame rate control - idle mode, 3 args:
-    0x01, 0x2C, 0x2D,       //     Rate = fosc/(1x2+40) * (LINE+2C+2D)
-    ST7735_FRMCTR3, 6      ,  //  5: Frame rate ctrl - partial mode, 6 args:
-    0x01, 0x2C, 0x2D,       //     Dot inversion mode
-    0x01, 0x2C, 0x2D,       //     Line inversion mode
-    ST7735_INVCTR , 1      ,  //  6: Display inversion ctrl, 1 arg, no delay:
-    0x07,                   //     No inversion
-    ST7735_PWCTR1 , 3      ,  //  7: Power control, 3 args, no delay:
-    0xA2,
-    0x02,                   //     -4.6V
-    0x84,                   //     AUTO mode
-    ST7735_PWCTR2 , 1      ,  //  8: Power control, 1 arg, no delay:
-    0xC5,                   //     VGH25 = 2.4C VGSEL = -10 VGH = 3 * AVDD
-    ST7735_PWCTR3 , 2      ,  //  9: Power control, 2 args, no delay:
-    0x0A,                   //     Opamp current small
-    0x00,                   //     Boost frequency
-    ST7735_PWCTR4 , 2      ,  // 10: Power control, 2 args, no delay:
-    0x8A,                   //     BCLK/2, Opamp current small & Medium low
-    0x2A,
-    ST7735_PWCTR5 , 2      ,  // 11: Power control, 2 args, no delay:
-    0x8A, 0xEE,
-    ST7735_VMCTR1 , 1      ,  // 12: Power control, 1 arg, no delay:
-    0x0E,
-    ST7735_INVOFF , 0      ,  // 13: Don't invert display, no args, no delay
-    ST7735_MADCTL , 1      ,  // 14: Memory access control (directions), 1 arg:
-    0xC8,                   //     row addr/col addr, bottom to top refresh
-    ST7735_COLMOD , 1      ,  // 15: set color mode, 1 arg, no delay:
-    0x05
-},                 //     16-bit color
-
-Rcmd2green[] = {            // Init for 7735R, part 2 (green tab only)
-    2,                        //  2 commands in list:
-    ST7735_CASET  , 4      ,  //  1: Column addr set, 4 args, no delay:
-    0x00, 0x02,             //     XSTART = 0
-    0x00, 0x7F+0x02,        //     XEND = 127
-    ST7735_RASET  , 4      ,  //  2: Row addr set, 4 args, no delay:
-    0x00, 0x01,             //     XSTART = 0
-    0x00, 0x9F+0x01
-},      //     XEND = 159
-Rcmd2red[] = {              // Init for 7735R, part 2 (red tab only)
-    2,                        //  2 commands in list:
-    ST7735_CASET  , 4      ,  //  1: Column addr set, 4 args, no delay:
-    0x00, 0x00,             //     XSTART = 0
-    0x00, 0x7F,             //     XEND = 127
-    ST7735_RASET  , 4      ,  //  2: Row addr set, 4 args, no delay:
-    0x00, 0x00,             //     XSTART = 0
-    0x00, 0x9F
-},           //     XEND = 159
-
-Rcmd3[] = {                 // Init for 7735R, part 3 (red or green tab)
-    4,                        //  4 commands in list:
-    ST7735_GMCTRP1, 16      , //  1: Magical unicorn dust, 16 args, no delay:
-    0x02, 0x1c, 0x07, 0x12,
-    0x37, 0x32, 0x29, 0x2d,
-    0x29, 0x25, 0x2B, 0x39,
-    0x00, 0x01, 0x03, 0x10,
-    ST7735_GMCTRN1, 16      , //  2: Sparkles and rainbows, 16 args, no delay:
-    0x03, 0x1d, 0x07, 0x06,
-    0x2E, 0x2C, 0x29, 0x2D,
-    0x2E, 0x2E, 0x37, 0x3F,
-    0x00, 0x00, 0x02, 0x10,
-    ST7735_NORON  ,    DELAY, //  3: Normal display on, no args, w/delay
-    10,                     //     10 ms delay
-    ST7735_DISPON ,    DELAY, //  4: Main screen turn on, no args w/delay
-    100
-};                  //     100 ms delay
-
-#endif
-
 // Companion code to the above tables.  Reads and issues
 // a series of LCD commands stored in byte array.
 void Adafruit_ST7735::commandList(uint8_t *addr)
@@ -391,21 +256,32 @@
 
 
 // Initialization for ST7735R screens (green or red tabs)
-void Adafruit_ST7735::initR(uint8_t options)
-{
-    commonInit(Rcmd1);
-    if(options == INITR_GREENTAB) {
-        commandList(Rcmd2green);
-        colstart = 2;
-        rowstart = 1;
-    } else {
-        // colstart, rowstart left at default '0' values
-        commandList(Rcmd2red);
-    }
-    commandList(Rcmd3);
+void Adafruit_ST7735::initR(uint8_t options) {
+  commonInit(Rcmd1);
+  if(options == INITR_GREENTAB) {
+    commandList(Rcmd2green);
+    colstart = 2;
+    rowstart = 1;
+  } else if(options == INITR_144GREENTAB) {
+    _height = ST7735_TFTHEIGHT_144;
+    commandList(Rcmd2green144);
+    colstart = 2;
+    rowstart = 3;
+  } else {
+    // colstart, rowstart left at default '0' values
+    commandList(Rcmd2red);
+  }
+  commandList(Rcmd3);
+
+  // if black, change MADCTL color filter
+  if (options == INITR_BLACKTAB) {
+    writecommand(ST7735_MADCTL);
+    writedata(0xC0);
+  }
+
+  tabcolor = options;
 }
 
-
 void Adafruit_ST7735::setAddrWindow(uint8_t x0, uint8_t y0, uint8_t x1,
                                     uint8_t y1)
 {
@@ -426,27 +302,6 @@
 }
 
 
-void Adafruit_ST7735::fillScreen(uint16_t color)
-{
-
-    uint8_t x, y, hi = color >> 8, lo = color;
-
-    setAddrWindow(0, 0, _width-1, _height-1);
-
-    _rs = 1;
-    _cs = 0;
-
-    for(y=_height; y>0; y--) {
-        for(x=_width; x>0; x--) {
-            lcdPort.write( hi );
-            lcdPort.write( lo );
-        }
-    }
-
-    _cs = 1;
-}
-
-
 void Adafruit_ST7735::pushColor(uint16_t color)
 {
     _rs = 1;
@@ -515,6 +370,30 @@
 }
 
 
+
+void Adafruit_ST7735::fillScreen(uint16_t color)
+{
+    fillRect(0, 0,  _width, _height, color);
+/*
+    uint8_t x, y, hi = color >> 8, lo = color;
+
+    setAddrWindow(0, 0, _width-1, _height-1);
+
+    _rs = 1;
+    _cs = 0;
+
+    for(y=_height; y>0; y--) {
+        for(x=_width; x>0; x--) {
+            lcdPort.write( hi );
+            lcdPort.write( lo );
+        }
+    }
+
+    _cs = 1;
+*/
+}
+
+
 // fill a rectangle
 void Adafruit_ST7735::fillRect(int16_t x, int16_t y, int16_t w, int16_t h,
                                uint16_t color)