Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: ME503_VehicleAssembly
Adafruit_ST7735.cpp@8:96f8411b85a3, 2019-08-27 (annotated)
- Committer:
- DrCoyle
- Date:
- Tue Aug 27 20:24:10 2019 +0000
- Revision:
- 8:96f8411b85a3
- Parent:
- 7:58d9c26fd03c
2019 Update
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| DrCoyle | 0:1e675eea5267 | 1 | /*************************************************** | 
| DrCoyle | 0:1e675eea5267 | 2 | This is a library for the Adafruit 1.8" SPI display. | 
| DrCoyle | 0:1e675eea5267 | 3 | This library works with the Adafruit 1.8" TFT Breakout w/SD card | 
| DrCoyle | 0:1e675eea5267 | 4 | ----> http://www.adafruit.com/products/358 | 
| DrCoyle | 0:1e675eea5267 | 5 | as well as Adafruit raw 1.8" TFT display | 
| DrCoyle | 0:1e675eea5267 | 6 | ----> http://www.adafruit.com/products/618 | 
| DrCoyle | 0:1e675eea5267 | 7 | |
| DrCoyle | 0:1e675eea5267 | 8 | Check out the links above for our tutorials and wiring diagrams | 
| DrCoyle | 0:1e675eea5267 | 9 | These displays use SPI to communicate, 4 or 5 pins are required to | 
| DrCoyle | 0:1e675eea5267 | 10 | interface (RST is optional) | 
| DrCoyle | 0:1e675eea5267 | 11 | Adafruit invests time and resources providing this open source code, | 
| DrCoyle | 0:1e675eea5267 | 12 | please support Adafruit and open-source hardware by purchasing | 
| DrCoyle | 0:1e675eea5267 | 13 | products from Adafruit! | 
| DrCoyle | 0:1e675eea5267 | 14 | |
| DrCoyle | 0:1e675eea5267 | 15 | Written by Limor Fried/Ladyada for Adafruit Industries. | 
| DrCoyle | 0:1e675eea5267 | 16 | MIT license, all text above must be included in any redistribution | 
| DrCoyle | 0:1e675eea5267 | 17 | ****************************************************/ | 
| DrCoyle | 0:1e675eea5267 | 18 | |
| DrCoyle | 0:1e675eea5267 | 19 | #include "mbed.h" | 
| DrCoyle | 0:1e675eea5267 | 20 | #include "Adafruit_ST7735.h" | 
| DrCoyle | 0:1e675eea5267 | 21 | |
| DrCoyle | 0:1e675eea5267 | 22 | // Constructor | 
| DrCoyle | 8:96f8411b85a3 | 23 | Adafruit_ST7735::Adafruit_ST7735(PinName mosi, PinName miso, PinName clk, PinName cs, PinName rs, PinName rst): lcdPort(mosi,miso,clk), _cs(cs), _rs(rs), _rst(rst), Adafruit_GFX(ST7735_TFTWIDTH, ST7735_TFTHEIGHT) | 
| DrCoyle | 0:1e675eea5267 | 24 | { | 
| DrCoyle | 0:1e675eea5267 | 25 | lcdPort.format(8,3); | 
| DrCoyle | 0:1e675eea5267 | 26 | lcdPort.frequency(10000000); | 
| DrCoyle | 0:1e675eea5267 | 27 | initR(); | 
| DrCoyle | 0:1e675eea5267 | 28 | setRotation(0); | 
| DrCoyle | 7:58d9c26fd03c | 29 | setCursor(0,0); | 
| DrCoyle | 0:1e675eea5267 | 30 | fillScreen(0x0000); | 
| DrCoyle | 1:643bda4b6ced | 31 | setTextColor(0xFFFF,0x0000); | 
| DrCoyle | 0:1e675eea5267 | 32 | } | 
| DrCoyle | 0:1e675eea5267 | 33 | |
| DrCoyle | 0:1e675eea5267 | 34 | |
| DrCoyle | 0:1e675eea5267 | 35 | void Adafruit_ST7735::writecommand(uint8_t c) | 
| DrCoyle | 0:1e675eea5267 | 36 | { | 
| DrCoyle | 0:1e675eea5267 | 37 | _rs = 0; | 
| DrCoyle | 0:1e675eea5267 | 38 | _cs = 0; | 
| DrCoyle | 0:1e675eea5267 | 39 | lcdPort.write( c ); | 
| DrCoyle | 0:1e675eea5267 | 40 | _cs = 1; | 
| DrCoyle | 0:1e675eea5267 | 41 | } | 
| DrCoyle | 0:1e675eea5267 | 42 | |
| DrCoyle | 0:1e675eea5267 | 43 | |
| DrCoyle | 0:1e675eea5267 | 44 | void Adafruit_ST7735::writedata(uint8_t c) | 
| DrCoyle | 0:1e675eea5267 | 45 | { | 
| DrCoyle | 0:1e675eea5267 | 46 | _rs = 1; | 
| DrCoyle | 0:1e675eea5267 | 47 | _cs = 0; | 
| DrCoyle | 0:1e675eea5267 | 48 | lcdPort.write( c ); | 
| DrCoyle | 0:1e675eea5267 | 49 | |
| DrCoyle | 0:1e675eea5267 | 50 | _cs = 1; | 
| DrCoyle | 0:1e675eea5267 | 51 | } | 
| DrCoyle | 0:1e675eea5267 | 52 | |
| DrCoyle | 0:1e675eea5267 | 53 | |
| DrCoyle | 0:1e675eea5267 | 54 | // Rather than a bazillion writecommand() and writedata() calls, screen | 
| DrCoyle | 0:1e675eea5267 | 55 | // initialization commands and arguments are organized in these tables | 
| DrCoyle | 0:1e675eea5267 | 56 | // stored in PROGMEM. The table may look bulky, but that's mostly the | 
| DrCoyle | 0:1e675eea5267 | 57 | // formatting -- storage-wise this is hundreds of bytes more compact | 
| DrCoyle | 0:1e675eea5267 | 58 | // than the equivalent code. Companion function follows. | 
| DrCoyle | 0:1e675eea5267 | 59 | #define DELAY 0x80 | 
| DrCoyle | 0:1e675eea5267 | 60 | static unsigned char | 
| DrCoyle | 0:1e675eea5267 | 61 | Bcmd[] = { // Initialization commands for 7735B screens | 
| DrCoyle | 0:1e675eea5267 | 62 | 18, // 18 commands in list: | 
| DrCoyle | 0:1e675eea5267 | 63 | ST7735_SWRESET, DELAY, // 1: Software reset, no args, w/delay | 
| DrCoyle | 0:1e675eea5267 | 64 | 50, // 50 ms delay | 
| DrCoyle | 0:1e675eea5267 | 65 | ST7735_SLPOUT , DELAY, // 2: Out of sleep mode, no args, w/delay | 
| DrCoyle | 0:1e675eea5267 | 66 | 255, // 255 = 500 ms delay | 
| DrCoyle | 0:1e675eea5267 | 67 | ST7735_COLMOD , 1+DELAY, // 3: Set color mode, 1 arg + delay: | 
| DrCoyle | 0:1e675eea5267 | 68 | 0x05, // 16-bit color | 
| DrCoyle | 0:1e675eea5267 | 69 | 10, // 10 ms delay | 
| DrCoyle | 0:1e675eea5267 | 70 | ST7735_FRMCTR1, 3+DELAY, // 4: Frame rate control, 3 args + delay: | 
| DrCoyle | 0:1e675eea5267 | 71 | 0x00, // fastest refresh | 
| DrCoyle | 0:1e675eea5267 | 72 | 0x06, // 6 lines front porch | 
| DrCoyle | 0:1e675eea5267 | 73 | 0x03, // 3 lines back porch | 
| DrCoyle | 0:1e675eea5267 | 74 | 10, // 10 ms delay | 
| DrCoyle | 0:1e675eea5267 | 75 | ST7735_MADCTL , 1 , // 5: Memory access ctrl (directions), 1 arg: | 
| DrCoyle | 0:1e675eea5267 | 76 | 0x08, // Row addr/col addr, bottom to top refresh | 
| DrCoyle | 0:1e675eea5267 | 77 | ST7735_DISSET5, 2 , // 6: Display settings #5, 2 args, no delay: | 
| DrCoyle | 0:1e675eea5267 | 78 | 0x15, // 1 clk cycle nonoverlap, 2 cycle gate | 
| DrCoyle | 0:1e675eea5267 | 79 | // rise, 3 cycle osc equalize | 
| DrCoyle | 0:1e675eea5267 | 80 | 0x02, // Fix on VTL | 
| DrCoyle | 0:1e675eea5267 | 81 | ST7735_INVCTR , 1 , // 7: Display inversion control, 1 arg: | 
| DrCoyle | 0:1e675eea5267 | 82 | 0x0, // Line inversion | 
| DrCoyle | 0:1e675eea5267 | 83 | ST7735_PWCTR1 , 2+DELAY, // 8: Power control, 2 args + delay: | 
| DrCoyle | 0:1e675eea5267 | 84 | 0x02, // GVDD = 4.7V | 
| DrCoyle | 0:1e675eea5267 | 85 | 0x70, // 1.0uA | 
| DrCoyle | 0:1e675eea5267 | 86 | 10, // 10 ms delay | 
| DrCoyle | 0:1e675eea5267 | 87 | ST7735_PWCTR2 , 1 , // 9: Power control, 1 arg, no delay: | 
| DrCoyle | 0:1e675eea5267 | 88 | 0x05, // VGH = 14.7V, VGL = -7.35V | 
| DrCoyle | 0:1e675eea5267 | 89 | ST7735_PWCTR3 , 2 , // 10: Power control, 2 args, no delay: | 
| DrCoyle | 0:1e675eea5267 | 90 | 0x01, // Opamp current small | 
| DrCoyle | 0:1e675eea5267 | 91 | 0x02, // Boost frequency | 
| DrCoyle | 0:1e675eea5267 | 92 | ST7735_VMCTR1 , 2+DELAY, // 11: Power control, 2 args + delay: | 
| DrCoyle | 0:1e675eea5267 | 93 | 0x3C, // VCOMH = 4V | 
| DrCoyle | 0:1e675eea5267 | 94 | 0x38, // VCOML = -1.1V | 
| DrCoyle | 0:1e675eea5267 | 95 | 10, // 10 ms delay | 
| DrCoyle | 0:1e675eea5267 | 96 | ST7735_PWCTR6 , 2 , // 12: Power control, 2 args, no delay: | 
| DrCoyle | 0:1e675eea5267 | 97 | 0x11, 0x15, | 
| DrCoyle | 0:1e675eea5267 | 98 | ST7735_GMCTRP1,16 , // 13: Magical unicorn dust, 16 args, no delay: | 
| DrCoyle | 0:1e675eea5267 | 99 | 0x09, 0x16, 0x09, 0x20, // (seriously though, not sure what | 
| DrCoyle | 0:1e675eea5267 | 100 | 0x21, 0x1B, 0x13, 0x19, // these config values represent) | 
| DrCoyle | 0:1e675eea5267 | 101 | 0x17, 0x15, 0x1E, 0x2B, | 
| DrCoyle | 0:1e675eea5267 | 102 | 0x04, 0x05, 0x02, 0x0E, | 
| DrCoyle | 0:1e675eea5267 | 103 | ST7735_GMCTRN1,16+DELAY, // 14: Sparkles and rainbows, 16 args + delay: | 
| DrCoyle | 0:1e675eea5267 | 104 | 0x0B, 0x14, 0x08, 0x1E, // (ditto) | 
| DrCoyle | 0:1e675eea5267 | 105 | 0x22, 0x1D, 0x18, 0x1E, | 
| DrCoyle | 0:1e675eea5267 | 106 | 0x1B, 0x1A, 0x24, 0x2B, | 
| DrCoyle | 0:1e675eea5267 | 107 | 0x06, 0x06, 0x02, 0x0F, | 
| DrCoyle | 0:1e675eea5267 | 108 | 10, // 10 ms delay | 
| DrCoyle | 0:1e675eea5267 | 109 | ST7735_CASET , 4 , // 15: Column addr set, 4 args, no delay: | 
| DrCoyle | 0:1e675eea5267 | 110 | 0x00, 0x02, // XSTART = 2 | 
| DrCoyle | 0:1e675eea5267 | 111 | 0x00, 0x81, // XEND = 129 | 
| DrCoyle | 0:1e675eea5267 | 112 | ST7735_RASET , 4 , // 16: Row addr set, 4 args, no delay: | 
| DrCoyle | 0:1e675eea5267 | 113 | 0x00, 0x01, // XSTART = 1 | 
| DrCoyle | 0:1e675eea5267 | 114 | 0x00, 0x80, // XEND = 160 or '128' /*sarvesh*/ | 
| DrCoyle | 0:1e675eea5267 | 115 | ST7735_NORON , DELAY, // 17: Normal display on, no args, w/delay | 
| DrCoyle | 0:1e675eea5267 | 116 | 10, // 10 ms delay | 
| DrCoyle | 0:1e675eea5267 | 117 | ST7735_DISPON , DELAY, // 18: Main screen turn on, no args, w/delay | 
| DrCoyle | 0:1e675eea5267 | 118 | 255 | 
| DrCoyle | 0:1e675eea5267 | 119 | }, // 255 = 500 ms delay | 
| DrCoyle | 0:1e675eea5267 | 120 | |
| DrCoyle | 0:1e675eea5267 | 121 | Rcmd1[] = { // Init for 7735R, part 1 (red or green tab) | 
| DrCoyle | 0:1e675eea5267 | 122 | 15, // 15 commands in list: | 
| DrCoyle | 0:1e675eea5267 | 123 | ST7735_SWRESET, DELAY, // 1: Software reset, 0 args, w/delay | 
| DrCoyle | 0:1e675eea5267 | 124 | 150, // 150 ms delay | 
| DrCoyle | 0:1e675eea5267 | 125 | ST7735_SLPOUT , DELAY, // 2: Out of sleep mode, 0 args, w/delay | 
| DrCoyle | 0:1e675eea5267 | 126 | 255, // 500 ms delay | 
| DrCoyle | 0:1e675eea5267 | 127 | ST7735_FRMCTR1, 3 , // 3: Frame rate ctrl - normal mode, 3 args: | 
| DrCoyle | 0:1e675eea5267 | 128 | 0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D) | 
| DrCoyle | 0:1e675eea5267 | 129 | ST7735_FRMCTR2, 3 , // 4: Frame rate control - idle mode, 3 args: | 
| DrCoyle | 0:1e675eea5267 | 130 | 0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D) | 
| DrCoyle | 0:1e675eea5267 | 131 | ST7735_FRMCTR3, 6 , // 5: Frame rate ctrl - partial mode, 6 args: | 
| DrCoyle | 0:1e675eea5267 | 132 | 0x01, 0x2C, 0x2D, // Dot inversion mode | 
| DrCoyle | 0:1e675eea5267 | 133 | 0x01, 0x2C, 0x2D, // Line inversion mode | 
| DrCoyle | 0:1e675eea5267 | 134 | ST7735_INVCTR , 1 , // 6: Display inversion ctrl, 1 arg, no delay: | 
| DrCoyle | 0:1e675eea5267 | 135 | 0x07, // No inversion | 
| DrCoyle | 0:1e675eea5267 | 136 | ST7735_PWCTR1 , 3 , // 7: Power control, 3 args, no delay: | 
| DrCoyle | 0:1e675eea5267 | 137 | 0xA2, | 
| DrCoyle | 0:1e675eea5267 | 138 | 0x02, // -4.6V | 
| DrCoyle | 0:1e675eea5267 | 139 | 0x84, // AUTO mode | 
| DrCoyle | 0:1e675eea5267 | 140 | ST7735_PWCTR2 , 1 , // 8: Power control, 1 arg, no delay: | 
| DrCoyle | 0:1e675eea5267 | 141 | 0xC5, // VGH25 = 2.4C VGSEL = -10 VGH = 3 * AVDD | 
| DrCoyle | 0:1e675eea5267 | 142 | ST7735_PWCTR3 , 2 , // 9: Power control, 2 args, no delay: | 
| DrCoyle | 0:1e675eea5267 | 143 | 0x0A, // Opamp current small | 
| DrCoyle | 0:1e675eea5267 | 144 | 0x00, // Boost frequency | 
| DrCoyle | 0:1e675eea5267 | 145 | ST7735_PWCTR4 , 2 , // 10: Power control, 2 args, no delay: | 
| DrCoyle | 0:1e675eea5267 | 146 | 0x8A, // BCLK/2, Opamp current small & Medium low | 
| DrCoyle | 0:1e675eea5267 | 147 | 0x2A, | 
| DrCoyle | 0:1e675eea5267 | 148 | ST7735_PWCTR5 , 2 , // 11: Power control, 2 args, no delay: | 
| DrCoyle | 0:1e675eea5267 | 149 | 0x8A, 0xEE, | 
| DrCoyle | 0:1e675eea5267 | 150 | ST7735_VMCTR1 , 1 , // 12: Power control, 1 arg, no delay: | 
| DrCoyle | 0:1e675eea5267 | 151 | 0x0E, | 
| DrCoyle | 0:1e675eea5267 | 152 | ST7735_INVOFF , 0 , // 13: Don't invert display, no args, no delay | 
| DrCoyle | 0:1e675eea5267 | 153 | ST7735_MADCTL , 1 , // 14: Memory access control (directions), 1 arg: | 
| DrCoyle | 0:1e675eea5267 | 154 | 0xC8, // row addr/col addr, bottom to top refresh | 
| DrCoyle | 0:1e675eea5267 | 155 | ST7735_COLMOD , 1 , // 15: set color mode, 1 arg, no delay: | 
| DrCoyle | 0:1e675eea5267 | 156 | 0x05 | 
| DrCoyle | 0:1e675eea5267 | 157 | }, // 16-bit color | 
| DrCoyle | 0:1e675eea5267 | 158 | |
| DrCoyle | 0:1e675eea5267 | 159 | Rcmd2green[] = { // Init for 7735R, part 2 (green tab only) | 
| DrCoyle | 0:1e675eea5267 | 160 | 2, // 2 commands in list: | 
| DrCoyle | 0:1e675eea5267 | 161 | ST7735_CASET , 4 , // 1: Column addr set, 4 args, no delay: | 
| DrCoyle | 0:1e675eea5267 | 162 | 0x00, 0x02, // XSTART = 0 | 
| DrCoyle | 0:1e675eea5267 | 163 | 0x00, 0x7F+0x02, // XEND = 127 | 
| DrCoyle | 0:1e675eea5267 | 164 | ST7735_RASET , 4 , // 2: Row addr set, 4 args, no delay: | 
| DrCoyle | 0:1e675eea5267 | 165 | 0x00, 0x01, // XSTART = 0 | 
| DrCoyle | 0:1e675eea5267 | 166 | 0x00, 0x7F+0x01 // XEND = not 159 but 127 /*sarvesh*/ | 
| DrCoyle | 0:1e675eea5267 | 167 | }, | 
| DrCoyle | 0:1e675eea5267 | 168 | Rcmd2red[] = { // Init for 7735R, part 2 (red tab only) | 
| DrCoyle | 0:1e675eea5267 | 169 | 2, // 2 commands in list: | 
| DrCoyle | 0:1e675eea5267 | 170 | ST7735_CASET , 4 , // 1: Column addr set, 4 args, no delay: | 
| DrCoyle | 0:1e675eea5267 | 171 | 0x00, 0x00, // XSTART = 0 | 
| DrCoyle | 0:1e675eea5267 | 172 | 0x00, 0x7F, // XEND = 127 | 
| DrCoyle | 0:1e675eea5267 | 173 | ST7735_RASET , 4 , // 2: Row addr set, 4 args, no delay: | 
| DrCoyle | 0:1e675eea5267 | 174 | 0x00, 0x00, // XSTART = 0 | 
| DrCoyle | 0:1e675eea5267 | 175 | 0x00, 0x7F // XEND = not 159 but 127 /*sarvesh*/ | 
| DrCoyle | 0:1e675eea5267 | 176 | }, | 
| DrCoyle | 0:1e675eea5267 | 177 | |
| DrCoyle | 0:1e675eea5267 | 178 | Rcmd3[] = { // Init for 7735R, part 3 (red or green tab) | 
| DrCoyle | 0:1e675eea5267 | 179 | 4, // 4 commands in list: | 
| DrCoyle | 0:1e675eea5267 | 180 | ST7735_GMCTRP1, 16 , // 1: Magical unicorn dust, 16 args, no delay: | 
| DrCoyle | 0:1e675eea5267 | 181 | 0x02, 0x1c, 0x07, 0x12, | 
| DrCoyle | 0:1e675eea5267 | 182 | 0x37, 0x32, 0x29, 0x2d, | 
| DrCoyle | 0:1e675eea5267 | 183 | 0x29, 0x25, 0x2B, 0x39, | 
| DrCoyle | 0:1e675eea5267 | 184 | 0x00, 0x01, 0x03, 0x10, | 
| DrCoyle | 0:1e675eea5267 | 185 | ST7735_GMCTRN1, 16 , // 2: Sparkles and rainbows, 16 args, no delay: | 
| DrCoyle | 0:1e675eea5267 | 186 | 0x03, 0x1d, 0x07, 0x06, | 
| DrCoyle | 0:1e675eea5267 | 187 | 0x2E, 0x2C, 0x29, 0x2D, | 
| DrCoyle | 0:1e675eea5267 | 188 | 0x2E, 0x2E, 0x37, 0x3F, | 
| DrCoyle | 0:1e675eea5267 | 189 | 0x00, 0x00, 0x02, 0x10, | 
| DrCoyle | 0:1e675eea5267 | 190 | ST7735_NORON , DELAY, // 3: Normal display on, no args, w/delay | 
| DrCoyle | 0:1e675eea5267 | 191 | 10, // 10 ms delay | 
| DrCoyle | 0:1e675eea5267 | 192 | ST7735_DISPON , DELAY, // 4: Main screen turn on, no args w/delay | 
| DrCoyle | 0:1e675eea5267 | 193 | 100 | 
| DrCoyle | 0:1e675eea5267 | 194 | }; // 100 ms delay | 
| DrCoyle | 0:1e675eea5267 | 195 | |
| DrCoyle | 0:1e675eea5267 | 196 | static unsigned char Scmd[] = { // Initialization commands for S6D02A1 screens | 
| DrCoyle | 0:1e675eea5267 | 197 | 29, | 
| DrCoyle | 0:1e675eea5267 | 198 | 0xf0, 2, 0x5a, 0x5a, // Excommand2 | 
| DrCoyle | 0:1e675eea5267 | 199 | 0xfc, 2, 0x5a, 0x5a, // Excommand3 | 
| DrCoyle | 0:1e675eea5267 | 200 | 0x26, 1, 0x01, // Gamma set | 
| DrCoyle | 0:1e675eea5267 | 201 | 0xfa, 15, 0x02, 0x1f, 0x00, 0x10, 0x22, 0x30, 0x38, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3d, 0x02, 0x01, // Positive gamma control | 
| DrCoyle | 0:1e675eea5267 | 202 | 0xfb, 15, 0x21, 0x00, 0x02, 0x04, 0x07, 0x0a, 0x0b, 0x0c, 0x0c, 0x16, 0x1e, 0x30, 0x3f, 0x01, 0x02, // Negative gamma control | 
| DrCoyle | 0:1e675eea5267 | 203 | 0xfd, 11, 0x00, 0x00, 0x00, 0x17, 0x10, 0x00, 0x01, 0x01, 0x00, 0x1f, 0x1f, // Analog parameter control | 
| DrCoyle | 0:1e675eea5267 | 204 | 0xf4, 15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x07, 0x00, 0x3C, 0x36, 0x00, 0x3C, 0x36, 0x00, // Power control | 
| DrCoyle | 0:1e675eea5267 | 205 | 0xf5, 13, 0x00, 0x70, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x66, 0x06, // VCOM control | 
| DrCoyle | 0:1e675eea5267 | 206 | 0xf6, 11, 0x02, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x01, 0x00, // Source control | 
| DrCoyle | 0:1e675eea5267 | 207 | 0xf2, 17, 0x00, 0x01, 0x03, 0x08, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x08, 0x08, //Display control | 
| DrCoyle | 0:1e675eea5267 | 208 | 0xf8, 1, 0x11, // Gate control | 
| DrCoyle | 0:1e675eea5267 | 209 | 0xf7, 4, 0xc8, 0x20, 0x00, 0x00, // Interface control | 
| DrCoyle | 0:1e675eea5267 | 210 | 0xf3, 2, 0x00, 0x00, // Power sequence control | 
| DrCoyle | 0:1e675eea5267 | 211 | 0x11, DELAY, 50, // Wake | 
| DrCoyle | 0:1e675eea5267 | 212 | 0xf3, 2+DELAY, 0x00, 0x01, 50, // Power sequence control | 
| DrCoyle | 0:1e675eea5267 | 213 | 0xf3, 2+DELAY, 0x00, 0x03, 50, // Power sequence control | 
| DrCoyle | 0:1e675eea5267 | 214 | 0xf3, 2+DELAY, 0x00, 0x07, 50, // Power sequence control | 
| DrCoyle | 0:1e675eea5267 | 215 | 0xf3, 2+DELAY, 0x00, 0x0f, 50, // Power sequence control | 
| DrCoyle | 0:1e675eea5267 | 216 | 0xf4, 15+DELAY, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x07, 0x00, 0x3C, 0x36, 0x00, 0x3C, 0x36, 0x00, 50, // Power control | 
| DrCoyle | 0:1e675eea5267 | 217 | 0xf3, 2+DELAY, 0x00, 0x1f, 50, // Power sequence control | 
| DrCoyle | 0:1e675eea5267 | 218 | 0xf3, 2+DELAY, 0x00, 0x7f, 50, // Power sequence control | 
| DrCoyle | 0:1e675eea5267 | 219 | 0xf3, 2+DELAY, 0x00, 0xff, 50, // Power sequence control | 
| DrCoyle | 0:1e675eea5267 | 220 | 0xfd, 11, 0x00, 0x00, 0x00, 0x17, 0x10, 0x00, 0x00, 0x01, 0x00, 0x16, 0x16, // Analog parameter control | 
| DrCoyle | 0:1e675eea5267 | 221 | 0xf4, 15, 0x00, 0x09, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x07, 0x00, 0x3C, 0x36, 0x00, 0x3C, 0x36, 0x00, // Power control | 
| DrCoyle | 0:1e675eea5267 | 222 | 0x36, 1, 0x08, // Memory access data control | 
| DrCoyle | 0:1e675eea5267 | 223 | 0x35, 1, 0x00, // Tearing effect line on | 
| DrCoyle | 0:1e675eea5267 | 224 | 0x3a, 1+DELAY, 0x05, 150, // Interface pixel control | 
| DrCoyle | 0:1e675eea5267 | 225 | 0x29, 0, // Display on | 
| DrCoyle | 0:1e675eea5267 | 226 | 0x2c, 0 // Memory write | 
| DrCoyle | 0:1e675eea5267 | 227 | }; | 
| DrCoyle | 0:1e675eea5267 | 228 | |
| DrCoyle | 0:1e675eea5267 | 229 | // Companion code to the above tables. Reads and issues | 
| DrCoyle | 0:1e675eea5267 | 230 | // a series of LCD commands stored in byte array. | 
| DrCoyle | 0:1e675eea5267 | 231 | void Adafruit_ST7735::commandList(uint8_t *addr) | 
| DrCoyle | 0:1e675eea5267 | 232 | { | 
| DrCoyle | 0:1e675eea5267 | 233 | |
| DrCoyle | 0:1e675eea5267 | 234 | uint8_t numCommands, numArgs; | 
| DrCoyle | 0:1e675eea5267 | 235 | uint16_t ms; | 
| DrCoyle | 0:1e675eea5267 | 236 | |
| DrCoyle | 0:1e675eea5267 | 237 | numCommands = *addr++; // Number of commands to follow | 
| DrCoyle | 0:1e675eea5267 | 238 | while(numCommands--) { // For each command... | 
| DrCoyle | 0:1e675eea5267 | 239 | writecommand(*addr++); // Read, issue command | 
| DrCoyle | 0:1e675eea5267 | 240 | numArgs = *addr++; // Number of args to follow | 
| DrCoyle | 0:1e675eea5267 | 241 | ms = numArgs & DELAY; // If hibit set, delay follows args | 
| DrCoyle | 0:1e675eea5267 | 242 | numArgs &= ~DELAY; // Mask out delay bit | 
| DrCoyle | 0:1e675eea5267 | 243 | while(numArgs--) { // For each argument... | 
| DrCoyle | 0:1e675eea5267 | 244 | writedata(*addr++); // Read, issue argument | 
| DrCoyle | 0:1e675eea5267 | 245 | } | 
| DrCoyle | 0:1e675eea5267 | 246 | |
| DrCoyle | 0:1e675eea5267 | 247 | if(ms) { | 
| DrCoyle | 0:1e675eea5267 | 248 | ms = *addr++; // Read post-command delay time (ms) | 
| DrCoyle | 0:1e675eea5267 | 249 | if(ms == 255) ms = 500; // If 255, delay for 500 ms | 
| DrCoyle | 0:1e675eea5267 | 250 | wait_ms(ms); | 
| DrCoyle | 0:1e675eea5267 | 251 | } | 
| DrCoyle | 0:1e675eea5267 | 252 | } | 
| DrCoyle | 0:1e675eea5267 | 253 | } | 
| DrCoyle | 0:1e675eea5267 | 254 | |
| DrCoyle | 0:1e675eea5267 | 255 | |
| DrCoyle | 0:1e675eea5267 | 256 | // Initialization code common to both 'B' and 'R' type displays | 
| DrCoyle | 0:1e675eea5267 | 257 | void Adafruit_ST7735::commonInit(uint8_t *cmdList) | 
| DrCoyle | 0:1e675eea5267 | 258 | { | 
| DrCoyle | 0:1e675eea5267 | 259 | |
| DrCoyle | 0:1e675eea5267 | 260 | colstart = rowstart = 0; // May be overridden in init func | 
| DrCoyle | 0:1e675eea5267 | 261 | |
| DrCoyle | 0:1e675eea5267 | 262 | _rs = 1; | 
| DrCoyle | 0:1e675eea5267 | 263 | _cs = 1; | 
| DrCoyle | 0:1e675eea5267 | 264 | |
| DrCoyle | 0:1e675eea5267 | 265 | // use default SPI format | 
| DrCoyle | 0:1e675eea5267 | 266 | //lcdPort.format(8,0); | 
| DrCoyle | 0:1e675eea5267 | 267 | //lcdPort.frequency(4000000); // Lets try 4MHz | 
| DrCoyle | 0:1e675eea5267 | 268 | |
| DrCoyle | 0:1e675eea5267 | 269 | // toggle RST low to reset; CS low so it'll listen to us | 
| DrCoyle | 0:1e675eea5267 | 270 | _cs = 0; | 
| DrCoyle | 8:96f8411b85a3 | 271 | _rst = 1; | 
| DrCoyle | 8:96f8411b85a3 | 272 | wait_ms(500); | 
| DrCoyle | 8:96f8411b85a3 | 273 | _rst = 0; | 
| DrCoyle | 8:96f8411b85a3 | 274 | wait_ms(500); | 
| DrCoyle | 8:96f8411b85a3 | 275 | _rst = 1; | 
| DrCoyle | 0:1e675eea5267 | 276 | wait_ms(500); | 
| DrCoyle | 0:1e675eea5267 | 277 | if(cmdList) commandList(cmdList); | 
| DrCoyle | 0:1e675eea5267 | 278 | |
| DrCoyle | 0:1e675eea5267 | 279 | } | 
| DrCoyle | 0:1e675eea5267 | 280 | |
| DrCoyle | 0:1e675eea5267 | 281 | |
| DrCoyle | 0:1e675eea5267 | 282 | // Initialization for ST7735B screens | 
| DrCoyle | 0:1e675eea5267 | 283 | void Adafruit_ST7735::initB(void) | 
| DrCoyle | 0:1e675eea5267 | 284 | { | 
| DrCoyle | 0:1e675eea5267 | 285 | commonInit(Bcmd); | 
| DrCoyle | 0:1e675eea5267 | 286 | } | 
| DrCoyle | 0:1e675eea5267 | 287 | |
| DrCoyle | 0:1e675eea5267 | 288 | |
| DrCoyle | 0:1e675eea5267 | 289 | // Initialization for ST7735R screens (green or red tabs) | 
| DrCoyle | 0:1e675eea5267 | 290 | void Adafruit_ST7735::initR(uint8_t options) | 
| DrCoyle | 0:1e675eea5267 | 291 | { | 
| DrCoyle | 0:1e675eea5267 | 292 | commonInit(Rcmd1); | 
| DrCoyle | 0:1e675eea5267 | 293 | if(options == INITR_GREENTAB) { | 
| DrCoyle | 0:1e675eea5267 | 294 | commandList(Rcmd2green); | 
| DrCoyle | 0:1e675eea5267 | 295 | colstart = 2; | 
| DrCoyle | 0:1e675eea5267 | 296 | rowstart = 3; | 
| DrCoyle | 0:1e675eea5267 | 297 | } else { | 
| DrCoyle | 0:1e675eea5267 | 298 | // colstart, rowstart left at default '0' values | 
| DrCoyle | 0:1e675eea5267 | 299 | commandList(Rcmd2red); | 
| DrCoyle | 0:1e675eea5267 | 300 | } | 
| DrCoyle | 0:1e675eea5267 | 301 | commandList(Rcmd3); | 
| DrCoyle | 0:1e675eea5267 | 302 | } | 
| DrCoyle | 0:1e675eea5267 | 303 | |
| DrCoyle | 0:1e675eea5267 | 304 | // Initialization for ST7735B screens | 
| DrCoyle | 0:1e675eea5267 | 305 | void Adafruit_ST7735::initS(void) | 
| DrCoyle | 0:1e675eea5267 | 306 | { | 
| DrCoyle | 0:1e675eea5267 | 307 | commonInit(Scmd); | 
| DrCoyle | 0:1e675eea5267 | 308 | } | 
| DrCoyle | 0:1e675eea5267 | 309 | |
| DrCoyle | 0:1e675eea5267 | 310 | void Adafruit_ST7735::setAddrWindow(uint8_t x0, uint8_t y0, uint8_t x1, | 
| DrCoyle | 0:1e675eea5267 | 311 | uint8_t y1) | 
| DrCoyle | 0:1e675eea5267 | 312 | { | 
| DrCoyle | 0:1e675eea5267 | 313 | |
| DrCoyle | 0:1e675eea5267 | 314 | writecommand(ST7735_CASET); // Column addr set | 
| DrCoyle | 0:1e675eea5267 | 315 | writedata(0x00); | 
| DrCoyle | 0:1e675eea5267 | 316 | writedata(x0+colstart); // XSTART | 
| DrCoyle | 0:1e675eea5267 | 317 | writedata(0x00); | 
| DrCoyle | 0:1e675eea5267 | 318 | writedata(x1+colstart); // XEND | 
| DrCoyle | 0:1e675eea5267 | 319 | |
| DrCoyle | 0:1e675eea5267 | 320 | writecommand(ST7735_RASET); // Row addr set | 
| DrCoyle | 0:1e675eea5267 | 321 | writedata(0x00); | 
| DrCoyle | 0:1e675eea5267 | 322 | writedata(y0+rowstart); // YSTART | 
| DrCoyle | 0:1e675eea5267 | 323 | writedata(0x00); | 
| DrCoyle | 0:1e675eea5267 | 324 | writedata(y1+rowstart); // YEND | 
| DrCoyle | 0:1e675eea5267 | 325 | |
| DrCoyle | 0:1e675eea5267 | 326 | writecommand(ST7735_RAMWR); // write to RAM | 
| DrCoyle | 0:1e675eea5267 | 327 | } | 
| DrCoyle | 0:1e675eea5267 | 328 | |
| DrCoyle | 0:1e675eea5267 | 329 | |
| DrCoyle | 0:1e675eea5267 | 330 | void Adafruit_ST7735::fillScreen(uint16_t color) | 
| DrCoyle | 0:1e675eea5267 | 331 | { | 
| DrCoyle | 0:1e675eea5267 | 332 | |
| DrCoyle | 0:1e675eea5267 | 333 | uint8_t x, y, hi = color >> 8, lo = color; | 
| DrCoyle | 0:1e675eea5267 | 334 | |
| DrCoyle | 0:1e675eea5267 | 335 | setAddrWindow(0, 0, _width-1, _height-1); | 
| DrCoyle | 0:1e675eea5267 | 336 | |
| DrCoyle | 0:1e675eea5267 | 337 | _rs = 1; | 
| DrCoyle | 0:1e675eea5267 | 338 | _cs = 0; | 
| DrCoyle | 0:1e675eea5267 | 339 | |
| DrCoyle | 0:1e675eea5267 | 340 | for(y=_height; y>0; y--) | 
| DrCoyle | 0:1e675eea5267 | 341 | { | 
| DrCoyle | 0:1e675eea5267 | 342 | for(x=_width; x>0; x--) | 
| DrCoyle | 0:1e675eea5267 | 343 | { | 
| DrCoyle | 0:1e675eea5267 | 344 | lcdPort.write( hi ); | 
| DrCoyle | 0:1e675eea5267 | 345 | lcdPort.write( lo ); | 
| DrCoyle | 0:1e675eea5267 | 346 | } | 
| DrCoyle | 0:1e675eea5267 | 347 | } | 
| DrCoyle | 0:1e675eea5267 | 348 | _cs = 1; | 
| DrCoyle | 4:46614318d085 | 349 | clearTextBuf(0,0,_width,_height); | 
| DrCoyle | 0:1e675eea5267 | 350 | } | 
| DrCoyle | 0:1e675eea5267 | 351 | |
| DrCoyle | 0:1e675eea5267 | 352 | |
| DrCoyle | 0:1e675eea5267 | 353 | void Adafruit_ST7735::pushColor(uint16_t color) | 
| DrCoyle | 0:1e675eea5267 | 354 | { | 
| DrCoyle | 0:1e675eea5267 | 355 | _rs = 1; | 
| DrCoyle | 0:1e675eea5267 | 356 | _cs = 0; | 
| DrCoyle | 0:1e675eea5267 | 357 | |
| DrCoyle | 0:1e675eea5267 | 358 | lcdPort.write( color >> 8 ); | 
| DrCoyle | 0:1e675eea5267 | 359 | lcdPort.write( color ); | 
| DrCoyle | 0:1e675eea5267 | 360 | _cs = 1; | 
| DrCoyle | 0:1e675eea5267 | 361 | } | 
| DrCoyle | 0:1e675eea5267 | 362 | |
| DrCoyle | 0:1e675eea5267 | 363 | |
| DrCoyle | 0:1e675eea5267 | 364 | void Adafruit_ST7735::drawPixel(int16_t x, int16_t y, uint16_t color) | 
| DrCoyle | 0:1e675eea5267 | 365 | { | 
| DrCoyle | 0:1e675eea5267 | 366 | |
| DrCoyle | 0:1e675eea5267 | 367 | if((x < 0) ||(x >= _width+1) || (y < 0) || (y >= _height+1)) return; | 
| DrCoyle | 0:1e675eea5267 | 368 | |
| DrCoyle | 0:1e675eea5267 | 369 | setAddrWindow(x,y,x+1,y+1); | 
| DrCoyle | 0:1e675eea5267 | 370 | |
| DrCoyle | 0:1e675eea5267 | 371 | _rs = 1; | 
| DrCoyle | 0:1e675eea5267 | 372 | _cs = 0; | 
| DrCoyle | 0:1e675eea5267 | 373 | |
| DrCoyle | 0:1e675eea5267 | 374 | lcdPort.write( color >> 8 ); | 
| DrCoyle | 0:1e675eea5267 | 375 | lcdPort.write( color ); | 
| DrCoyle | 0:1e675eea5267 | 376 | |
| DrCoyle | 0:1e675eea5267 | 377 | _cs = 1; | 
| DrCoyle | 0:1e675eea5267 | 378 | } | 
| DrCoyle | 0:1e675eea5267 | 379 | |
| DrCoyle | 0:1e675eea5267 | 380 | |
| DrCoyle | 0:1e675eea5267 | 381 | void Adafruit_ST7735::drawFastVLine(int16_t x, int16_t y, int16_t h, | 
| DrCoyle | 0:1e675eea5267 | 382 | uint16_t color) | 
| DrCoyle | 0:1e675eea5267 | 383 | { | 
| DrCoyle | 0:1e675eea5267 | 384 | |
| DrCoyle | 0:1e675eea5267 | 385 | // Rudimentary clipping | 
| DrCoyle | 0:1e675eea5267 | 386 | if((x >= _width) || (y >= _height)) return; | 
| DrCoyle | 0:1e675eea5267 | 387 | if((y+h-1) >= _height) h = _height-y; | 
| DrCoyle | 0:1e675eea5267 | 388 | setAddrWindow(x, y, x, y+h-1); | 
| DrCoyle | 0:1e675eea5267 | 389 | |
| DrCoyle | 0:1e675eea5267 | 390 | uint8_t hi = color >> 8, lo = color; | 
| DrCoyle | 0:1e675eea5267 | 391 | _rs = 1; | 
| DrCoyle | 0:1e675eea5267 | 392 | _cs = 0; | 
| DrCoyle | 0:1e675eea5267 | 393 | while (h--) { | 
| DrCoyle | 0:1e675eea5267 | 394 | lcdPort.write( hi ); | 
| DrCoyle | 0:1e675eea5267 | 395 | lcdPort.write( lo ); | 
| DrCoyle | 0:1e675eea5267 | 396 | } | 
| DrCoyle | 0:1e675eea5267 | 397 | _cs = 1; | 
| DrCoyle | 0:1e675eea5267 | 398 | } | 
| DrCoyle | 0:1e675eea5267 | 399 | |
| DrCoyle | 0:1e675eea5267 | 400 | |
| DrCoyle | 0:1e675eea5267 | 401 | void Adafruit_ST7735::drawFastHLine(int16_t x, int16_t y, int16_t w, | 
| DrCoyle | 0:1e675eea5267 | 402 | uint16_t color) | 
| DrCoyle | 0:1e675eea5267 | 403 | { | 
| DrCoyle | 0:1e675eea5267 | 404 | |
| DrCoyle | 0:1e675eea5267 | 405 | // Rudimentary clipping | 
| DrCoyle | 0:1e675eea5267 | 406 | if((x >= _width) || (y >= _height)) return; | 
| DrCoyle | 0:1e675eea5267 | 407 | if((x+w-1) >= _width) w = _width-x; | 
| DrCoyle | 0:1e675eea5267 | 408 | setAddrWindow(x, y, x+w-1, y); | 
| DrCoyle | 0:1e675eea5267 | 409 | |
| DrCoyle | 0:1e675eea5267 | 410 | uint8_t hi = color >> 8, lo = color; | 
| DrCoyle | 0:1e675eea5267 | 411 | _rs = 1; | 
| DrCoyle | 0:1e675eea5267 | 412 | _cs = 0; | 
| DrCoyle | 0:1e675eea5267 | 413 | while (w--) { | 
| DrCoyle | 0:1e675eea5267 | 414 | lcdPort.write( hi ); | 
| DrCoyle | 0:1e675eea5267 | 415 | lcdPort.write( lo ); | 
| DrCoyle | 0:1e675eea5267 | 416 | } | 
| DrCoyle | 0:1e675eea5267 | 417 | _cs = 1; | 
| DrCoyle | 0:1e675eea5267 | 418 | } | 
| DrCoyle | 0:1e675eea5267 | 419 | |
| DrCoyle | 0:1e675eea5267 | 420 | /*To draw rectangle - by Sarvesh*/ | 
| DrCoyle | 0:1e675eea5267 | 421 | void Adafruit_ST7735::drawRect(int16_t x0, int16_t y0, int16_t x1,int16_t y1,uint16_t color) | 
| DrCoyle | 0:1e675eea5267 | 422 | { | 
| DrCoyle | 0:1e675eea5267 | 423 | int16_t w=abs(x1-x0); | 
| DrCoyle | 0:1e675eea5267 | 424 | int16_t h=abs(y1-y0); | 
| DrCoyle | 0:1e675eea5267 | 425 | if (x1 > x0) drawFastHLine(x0,y0,w,color); | 
| DrCoyle | 0:1e675eea5267 | 426 | else drawFastHLine(x1,y1,w,color); | 
| DrCoyle | 0:1e675eea5267 | 427 | |
| DrCoyle | 0:1e675eea5267 | 428 | if (y1 > y0) drawFastVLine(x0,y0,h,color); | 
| DrCoyle | 0:1e675eea5267 | 429 | else drawFastVLine(x1,y1,h,color); | 
| DrCoyle | 0:1e675eea5267 | 430 | |
| DrCoyle | 0:1e675eea5267 | 431 | if (x1 > x0) drawFastHLine(x0,y1,w,color); | 
| DrCoyle | 0:1e675eea5267 | 432 | else drawFastHLine(x1,y0,w,color); | 
| DrCoyle | 0:1e675eea5267 | 433 | |
| DrCoyle | 0:1e675eea5267 | 434 | if (y1 > y0) drawFastVLine(x1,y0,h,color); | 
| DrCoyle | 0:1e675eea5267 | 435 | else drawFastVLine(x0,y1,h,color); | 
| DrCoyle | 0:1e675eea5267 | 436 | |
| DrCoyle | 0:1e675eea5267 | 437 | return; | 
| DrCoyle | 0:1e675eea5267 | 438 | } | 
| DrCoyle | 0:1e675eea5267 | 439 | |
| DrCoyle | 0:1e675eea5267 | 440 | // fill a rectangle | 
| DrCoyle | 0:1e675eea5267 | 441 | void Adafruit_ST7735::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, | 
| DrCoyle | 0:1e675eea5267 | 442 | uint16_t color) | 
| DrCoyle | 0:1e675eea5267 | 443 | { | 
| DrCoyle | 0:1e675eea5267 | 444 | |
| DrCoyle | 0:1e675eea5267 | 445 | // rudimentary clipping (drawChar w/big text requires this) | 
| DrCoyle | 0:1e675eea5267 | 446 | if((x >= _width) || (y >= _height)) return; | 
| DrCoyle | 0:1e675eea5267 | 447 | if((x + w - 1) >= _width) w = _width - x; | 
| DrCoyle | 0:1e675eea5267 | 448 | if((y + h - 1) >= _height) h = _height - y; | 
| DrCoyle | 0:1e675eea5267 | 449 | |
| DrCoyle | 0:1e675eea5267 | 450 | setAddrWindow(x, y, x+w-1, y+h-1); | 
| DrCoyle | 0:1e675eea5267 | 451 | |
| DrCoyle | 0:1e675eea5267 | 452 | uint8_t hi = color >> 8, lo = color; | 
| DrCoyle | 0:1e675eea5267 | 453 | _rs = 1; | 
| DrCoyle | 0:1e675eea5267 | 454 | _cs = 0; | 
| DrCoyle | 0:1e675eea5267 | 455 | for(y=h; y>0; y--) { | 
| DrCoyle | 0:1e675eea5267 | 456 | for(x=w; x>0; x--) { | 
| DrCoyle | 0:1e675eea5267 | 457 | lcdPort.write( hi ); | 
| DrCoyle | 0:1e675eea5267 | 458 | lcdPort.write( lo ); | 
| DrCoyle | 0:1e675eea5267 | 459 | } | 
| DrCoyle | 0:1e675eea5267 | 460 | } | 
| DrCoyle | 0:1e675eea5267 | 461 | |
| DrCoyle | 0:1e675eea5267 | 462 | _cs = 1; | 
| DrCoyle | 0:1e675eea5267 | 463 | } | 
| DrCoyle | 0:1e675eea5267 | 464 | /*To draw circle - by Sarvesh*/ | 
| DrCoyle | 0:1e675eea5267 | 465 | void Adafruit_ST7735::drawCircle(int16_t x0, int16_t y0,int16_t r,uint16_t color) | 
| DrCoyle | 0:1e675eea5267 | 466 | { | 
| DrCoyle | 0:1e675eea5267 | 467 | int16_t draw_x0, draw_y0; | 
| DrCoyle | 0:1e675eea5267 | 468 | int16_t draw_x1, draw_y1; | 
| DrCoyle | 0:1e675eea5267 | 469 | int16_t draw_x2, draw_y2; | 
| DrCoyle | 0:1e675eea5267 | 470 | int16_t draw_x3, draw_y3; | 
| DrCoyle | 0:1e675eea5267 | 471 | int16_t draw_x4, draw_y4; | 
| DrCoyle | 0:1e675eea5267 | 472 | int16_t draw_x5, draw_y5; | 
| DrCoyle | 0:1e675eea5267 | 473 | int16_t draw_x6, draw_y6; | 
| DrCoyle | 0:1e675eea5267 | 474 | int16_t draw_x7, draw_y7; | 
| DrCoyle | 0:1e675eea5267 | 475 | int16_t xx, yy; | 
| DrCoyle | 0:1e675eea5267 | 476 | int16_t di; | 
| DrCoyle | 0:1e675eea5267 | 477 | setAddrWindow(1, 1, _width, _height); | 
| DrCoyle | 0:1e675eea5267 | 478 | if (r == 0) { /* no radius */ | 
| DrCoyle | 0:1e675eea5267 | 479 | return; | 
| DrCoyle | 0:1e675eea5267 | 480 | } | 
| DrCoyle | 0:1e675eea5267 | 481 | |
| DrCoyle | 0:1e675eea5267 | 482 | draw_x0 = draw_x1 = x0; | 
| DrCoyle | 0:1e675eea5267 | 483 | draw_y0 = draw_y1 = y0 + r; | 
| DrCoyle | 0:1e675eea5267 | 484 | if (draw_y0 < height()) { | 
| DrCoyle | 0:1e675eea5267 | 485 | drawPixel(draw_x0, draw_y0, color); /* 90 degree */ | 
| DrCoyle | 0:1e675eea5267 | 486 | } | 
| DrCoyle | 0:1e675eea5267 | 487 | |
| DrCoyle | 0:1e675eea5267 | 488 | draw_x2 = draw_x3 = x0; | 
| DrCoyle | 0:1e675eea5267 | 489 | draw_y2 = draw_y3 = y0 - r; | 
| DrCoyle | 0:1e675eea5267 | 490 | if (draw_y2 >= 0) { | 
| DrCoyle | 0:1e675eea5267 | 491 | drawPixel(draw_x2, draw_y2, color); /* 270 degree */ | 
| DrCoyle | 0:1e675eea5267 | 492 | } | 
| DrCoyle | 0:1e675eea5267 | 493 | |
| DrCoyle | 0:1e675eea5267 | 494 | draw_x4 = draw_x6 = x0 + r; | 
| DrCoyle | 0:1e675eea5267 | 495 | draw_y4 = draw_y6 = y0; | 
| DrCoyle | 0:1e675eea5267 | 496 | if (draw_x4 < width()) { | 
| DrCoyle | 0:1e675eea5267 | 497 | drawPixel(draw_x4, draw_y4, color); /* 0 degree */ | 
| DrCoyle | 0:1e675eea5267 | 498 | } | 
| DrCoyle | 0:1e675eea5267 | 499 | |
| DrCoyle | 0:1e675eea5267 | 500 | draw_x5 = draw_x7 = x0 - r; | 
| DrCoyle | 0:1e675eea5267 | 501 | draw_y5 = draw_y7 = y0; | 
| DrCoyle | 0:1e675eea5267 | 502 | if (draw_x5>=0) { | 
| DrCoyle | 0:1e675eea5267 | 503 | drawPixel(draw_x5, draw_y5, color); /* 180 degree */ | 
| DrCoyle | 0:1e675eea5267 | 504 | } | 
| DrCoyle | 0:1e675eea5267 | 505 | |
| DrCoyle | 0:1e675eea5267 | 506 | if (r == 1) { | 
| DrCoyle | 0:1e675eea5267 | 507 | return; | 
| DrCoyle | 0:1e675eea5267 | 508 | } | 
| DrCoyle | 0:1e675eea5267 | 509 | |
| DrCoyle | 0:1e675eea5267 | 510 | di = 3 - 2*r; | 
| DrCoyle | 0:1e675eea5267 | 511 | xx = 0; | 
| DrCoyle | 0:1e675eea5267 | 512 | yy = r; | 
| DrCoyle | 0:1e675eea5267 | 513 | while (xx < yy) { | 
| DrCoyle | 0:1e675eea5267 | 514 | |
| DrCoyle | 0:1e675eea5267 | 515 | if (di < 0) { | 
| DrCoyle | 0:1e675eea5267 | 516 | di += 4*xx + 6; | 
| DrCoyle | 0:1e675eea5267 | 517 | } else { | 
| DrCoyle | 0:1e675eea5267 | 518 | di += 4*(xx - yy) + 10; | 
| DrCoyle | 0:1e675eea5267 | 519 | yy--; | 
| DrCoyle | 0:1e675eea5267 | 520 | draw_y0--; | 
| DrCoyle | 0:1e675eea5267 | 521 | draw_y1--; | 
| DrCoyle | 0:1e675eea5267 | 522 | draw_y2++; | 
| DrCoyle | 0:1e675eea5267 | 523 | draw_y3++; | 
| DrCoyle | 0:1e675eea5267 | 524 | draw_x4--; | 
| DrCoyle | 0:1e675eea5267 | 525 | draw_x5++; | 
| DrCoyle | 0:1e675eea5267 | 526 | draw_x6--; | 
| DrCoyle | 0:1e675eea5267 | 527 | draw_x7++; | 
| DrCoyle | 0:1e675eea5267 | 528 | } | 
| DrCoyle | 0:1e675eea5267 | 529 | xx++; | 
| DrCoyle | 0:1e675eea5267 | 530 | draw_x0++; | 
| DrCoyle | 0:1e675eea5267 | 531 | draw_x1--; | 
| DrCoyle | 0:1e675eea5267 | 532 | draw_x2++; | 
| DrCoyle | 0:1e675eea5267 | 533 | draw_x3--; | 
| DrCoyle | 0:1e675eea5267 | 534 | draw_y4++; | 
| DrCoyle | 0:1e675eea5267 | 535 | draw_y5++; | 
| DrCoyle | 0:1e675eea5267 | 536 | draw_y6--; | 
| DrCoyle | 0:1e675eea5267 | 537 | draw_y7--; | 
| DrCoyle | 0:1e675eea5267 | 538 | |
| DrCoyle | 0:1e675eea5267 | 539 | if ( (draw_x0 <= width()) && (draw_y0>=0) ) { | 
| DrCoyle | 0:1e675eea5267 | 540 | drawPixel(draw_x0, draw_y0, color); | 
| DrCoyle | 0:1e675eea5267 | 541 | } | 
| DrCoyle | 0:1e675eea5267 | 542 | |
| DrCoyle | 0:1e675eea5267 | 543 | if ( (draw_x1 >= 0) && (draw_y1 >= 0) ) { | 
| DrCoyle | 0:1e675eea5267 | 544 | drawPixel(draw_x1, draw_y1, color); | 
| DrCoyle | 0:1e675eea5267 | 545 | } | 
| DrCoyle | 0:1e675eea5267 | 546 | |
| DrCoyle | 0:1e675eea5267 | 547 | if ( (draw_x2 <= width()) && (draw_y2 <= height()) ) { | 
| DrCoyle | 0:1e675eea5267 | 548 | drawPixel(draw_x2, draw_y2, color); | 
| DrCoyle | 0:1e675eea5267 | 549 | } | 
| DrCoyle | 0:1e675eea5267 | 550 | |
| DrCoyle | 0:1e675eea5267 | 551 | if ( (draw_x3 >=0 ) && (draw_y3 <= height()) ) { | 
| DrCoyle | 0:1e675eea5267 | 552 | drawPixel(draw_x3, draw_y3, color); | 
| DrCoyle | 0:1e675eea5267 | 553 | } | 
| DrCoyle | 0:1e675eea5267 | 554 | |
| DrCoyle | 0:1e675eea5267 | 555 | if ( (draw_x4 <= width()) && (draw_y4 >= 0) ) { | 
| DrCoyle | 0:1e675eea5267 | 556 | drawPixel(draw_x4, draw_y4, color); | 
| DrCoyle | 0:1e675eea5267 | 557 | } | 
| DrCoyle | 0:1e675eea5267 | 558 | |
| DrCoyle | 0:1e675eea5267 | 559 | if ( (draw_x5 >= 0) && (draw_y5 >= 0) ) { | 
| DrCoyle | 0:1e675eea5267 | 560 | drawPixel(draw_x5, draw_y5, color); | 
| DrCoyle | 0:1e675eea5267 | 561 | } | 
| DrCoyle | 0:1e675eea5267 | 562 | if ( (draw_x6 <=width()) && (draw_y6 <= height()) ) { | 
| DrCoyle | 0:1e675eea5267 | 563 | drawPixel(draw_x6, draw_y6, color); | 
| DrCoyle | 0:1e675eea5267 | 564 | } | 
| DrCoyle | 0:1e675eea5267 | 565 | if ( (draw_x7 >= 0) && (draw_y7 <= height()) ) { | 
| DrCoyle | 0:1e675eea5267 | 566 | drawPixel(draw_x7, draw_y7, color); | 
| DrCoyle | 0:1e675eea5267 | 567 | } | 
| DrCoyle | 0:1e675eea5267 | 568 | } | 
| DrCoyle | 0:1e675eea5267 | 569 | return; | 
| DrCoyle | 0:1e675eea5267 | 570 | } | 
| DrCoyle | 0:1e675eea5267 | 571 | |
| DrCoyle | 0:1e675eea5267 | 572 | |
| DrCoyle | 0:1e675eea5267 | 573 | // Pass 8-bit (each) R,G,B, get back 16-bit packed color | 
| DrCoyle | 0:1e675eea5267 | 574 | uint16_t Adafruit_ST7735::Color565(uint8_t r, uint8_t g, uint8_t b) | 
| DrCoyle | 0:1e675eea5267 | 575 | { | 
| DrCoyle | 0:1e675eea5267 | 576 | return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); | 
| DrCoyle | 0:1e675eea5267 | 577 | } | 
| DrCoyle | 0:1e675eea5267 | 578 | |
| DrCoyle | 0:1e675eea5267 | 579 | |
| DrCoyle | 0:1e675eea5267 | 580 | #define MADCTL_MY 0x80 | 
| DrCoyle | 0:1e675eea5267 | 581 | #define MADCTL_MX 0x40 | 
| DrCoyle | 0:1e675eea5267 | 582 | #define MADCTL_MV 0x20 | 
| DrCoyle | 0:1e675eea5267 | 583 | #define MADCTL_ML 0x10 | 
| DrCoyle | 0:1e675eea5267 | 584 | #define MADCTL_RGB 0x08 | 
| DrCoyle | 0:1e675eea5267 | 585 | #define MADCTL_MH 0x04 | 
| DrCoyle | 0:1e675eea5267 | 586 | |
| DrCoyle | 0:1e675eea5267 | 587 | void Adafruit_ST7735::setRotation(uint8_t m) | 
| DrCoyle | 0:1e675eea5267 | 588 | { | 
| DrCoyle | 0:1e675eea5267 | 589 | |
| DrCoyle | 0:1e675eea5267 | 590 | writecommand(ST7735_MADCTL); | 
| DrCoyle | 0:1e675eea5267 | 591 | rotation = m % 4; // can't be higher than 3 | 
| DrCoyle | 0:1e675eea5267 | 592 | switch (rotation) { | 
| DrCoyle | 0:1e675eea5267 | 593 | case 0: | 
| DrCoyle | 0:1e675eea5267 | 594 | writedata(MADCTL_MX | MADCTL_MY | MADCTL_RGB); | 
| DrCoyle | 0:1e675eea5267 | 595 | _width = ST7735_TFTWIDTH; | 
| DrCoyle | 0:1e675eea5267 | 596 | _height = ST7735_TFTHEIGHT; | 
| DrCoyle | 0:1e675eea5267 | 597 | break; | 
| DrCoyle | 0:1e675eea5267 | 598 | case 1: | 
| DrCoyle | 0:1e675eea5267 | 599 | writedata(MADCTL_MY | MADCTL_MV | MADCTL_RGB); | 
| DrCoyle | 0:1e675eea5267 | 600 | _width = ST7735_TFTHEIGHT; | 
| DrCoyle | 0:1e675eea5267 | 601 | _height = ST7735_TFTWIDTH; | 
| DrCoyle | 0:1e675eea5267 | 602 | break; | 
| DrCoyle | 0:1e675eea5267 | 603 | case 2: | 
| DrCoyle | 0:1e675eea5267 | 604 | writedata(MADCTL_RGB); | 
| DrCoyle | 0:1e675eea5267 | 605 | _width = ST7735_TFTWIDTH; | 
| DrCoyle | 0:1e675eea5267 | 606 | _height = ST7735_TFTHEIGHT; | 
| DrCoyle | 0:1e675eea5267 | 607 | break; | 
| DrCoyle | 0:1e675eea5267 | 608 | case 3: | 
| DrCoyle | 0:1e675eea5267 | 609 | writedata(MADCTL_MX | MADCTL_MV | MADCTL_RGB); | 
| DrCoyle | 0:1e675eea5267 | 610 | _width = ST7735_TFTHEIGHT; | 
| DrCoyle | 0:1e675eea5267 | 611 | _height = ST7735_TFTWIDTH; | 
| DrCoyle | 0:1e675eea5267 | 612 | break; | 
| DrCoyle | 0:1e675eea5267 | 613 | } | 
| DrCoyle | 0:1e675eea5267 | 614 | } | 
| DrCoyle | 0:1e675eea5267 | 615 | |
| DrCoyle | 0:1e675eea5267 | 616 | |
| DrCoyle | 0:1e675eea5267 | 617 | void Adafruit_ST7735::invertDisplay(boolean i) | 
| DrCoyle | 0:1e675eea5267 | 618 | { | 
| DrCoyle | 0:1e675eea5267 | 619 | writecommand(i ? ST7735_INVON : ST7735_INVOFF); | 
| DrCoyle | 0:1e675eea5267 | 620 | } | 
| DrCoyle | 0:1e675eea5267 | 621 | /* | 
| DrCoyle | 0:1e675eea5267 | 622 | void Adafruit_ST7735::display(void) | 
| DrCoyle | 0:1e675eea5267 | 623 | { | 
| DrCoyle | 0:1e675eea5267 | 624 | writecommand(ST7735_CASET | 0x0); // low col = 0 | 
| DrCoyle | 0:1e675eea5267 | 625 | writecommand(ST7735_RASET | 0x0); // hi col = 0 | 
| DrCoyle | 0:1e675eea5267 | 626 | writecommand(ST7735_RAMWR | 0x0); // line #0 | 
| DrCoyle | 0:1e675eea5267 | 627 | |
| DrCoyle | 0:1e675eea5267 | 628 | _cs = 1; | 
| DrCoyle | 0:1e675eea5267 | 629 | _rs = 1; | 
| DrCoyle | 0:1e675eea5267 | 630 | _cs = 0; | 
| DrCoyle | 0:1e675eea5267 | 631 | setAddrWindow(0,0,3,3); | 
| DrCoyle | 0:1e675eea5267 | 632 | for (uint16_t i=0; i<(ST7735_TFTWIDTH*ST7735_TFTHEIGHT/8); i++) | 
| DrCoyle | 0:1e675eea5267 | 633 | lcdPort.write(buffer[i]); | 
| DrCoyle | 0:1e675eea5267 | 634 | |
| DrCoyle | 0:1e675eea5267 | 635 | // i wonder why we have to do this (check datasheet) | 
| DrCoyle | 0:1e675eea5267 | 636 | if (ST7735_TFTHEIGHT == 64) | 
| DrCoyle | 0:1e675eea5267 | 637 | { | 
| DrCoyle | 0:1e675eea5267 | 638 | |
| DrCoyle | 0:1e675eea5267 | 639 | for (uint16_t i=0; i<(ST7735_TFTWIDTH*ST7735_TFTHEIGHT/8); i++) | 
| DrCoyle | 0:1e675eea5267 | 640 | lcdPort.write(0); | 
| DrCoyle | 0:1e675eea5267 | 641 | } | 
| DrCoyle | 0:1e675eea5267 | 642 | |
| DrCoyle | 0:1e675eea5267 | 643 | _cs = 1; | 
| DrCoyle | 0:1e675eea5267 | 644 | } */ | 
| DrCoyle | 0:1e675eea5267 | 645 | /* | 
| DrCoyle | 0:1e675eea5267 | 646 | void Adafruit_ST7735::drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size) | 
| DrCoyle | 0:1e675eea5267 | 647 | { | 
| DrCoyle | 0:1e675eea5267 | 648 | if( | 
| DrCoyle | 0:1e675eea5267 | 649 | (x >= _width) || // Clip right | 
| DrCoyle | 0:1e675eea5267 | 650 | (y >= _height) || // Clip bottom | 
| DrCoyle | 0:1e675eea5267 | 651 | ((x + 5 * size - 1) < 0) || // Clip left | 
| DrCoyle | 0:1e675eea5267 | 652 | ((y + 8 * size - 1) < 0) // Clip top | 
| DrCoyle | 0:1e675eea5267 | 653 | ) | 
| DrCoyle | 0:1e675eea5267 | 654 | return; | 
| DrCoyle | 0:1e675eea5267 | 655 | |
| DrCoyle | 0:1e675eea5267 | 656 | for (int8_t i=0; i<6; i++ ) | 
| DrCoyle | 0:1e675eea5267 | 657 | { | 
| DrCoyle | 0:1e675eea5267 | 658 | uint8_t line = 0; | 
| DrCoyle | 0:1e675eea5267 | 659 | |
| DrCoyle | 0:1e675eea5267 | 660 | if (i == 5) | 
| DrCoyle | 0:1e675eea5267 | 661 | line = 0x0; | 
| DrCoyle | 0:1e675eea5267 | 662 | else | 
| DrCoyle | 0:1e675eea5267 | 663 | line = font[(c*5)+i]; | 
| DrCoyle | 0:1e675eea5267 | 664 | |
| DrCoyle | 0:1e675eea5267 | 665 | for (int8_t j = 0; j<8; j++) | 
| DrCoyle | 0:1e675eea5267 | 666 | { | 
| DrCoyle | 0:1e675eea5267 | 667 | if (line & 0x1) | 
| DrCoyle | 0:1e675eea5267 | 668 | { | 
| DrCoyle | 0:1e675eea5267 | 669 | if (size == 1) // default size | 
| DrCoyle | 0:1e675eea5267 | 670 | drawPixel(x+i, y+j, color); | 
| DrCoyle | 0:1e675eea5267 | 671 | #ifdef WANT_ABSTRACTS | 
| DrCoyle | 0:1e675eea5267 | 672 | else // big size | 
| DrCoyle | 0:1e675eea5267 | 673 | fillRect(x+(i*size), y+(j*size), size, size, color); | 
| DrCoyle | 0:1e675eea5267 | 674 | #endif | 
| DrCoyle | 0:1e675eea5267 | 675 | } | 
| DrCoyle | 0:1e675eea5267 | 676 | else if (bg != color) | 
| DrCoyle | 0:1e675eea5267 | 677 | { | 
| DrCoyle | 0:1e675eea5267 | 678 | if (size == 1) // default size | 
| DrCoyle | 0:1e675eea5267 | 679 | drawPixel(x+i, y+j, bg); | 
| DrCoyle | 0:1e675eea5267 | 680 | #ifdef WANT_ABSTRACTS | 
| DrCoyle | 0:1e675eea5267 | 681 | else // big size | 
| DrCoyle | 0:1e675eea5267 | 682 | fillRect(x+i*size, y+j*size, size, size, bg); | 
| DrCoyle | 0:1e675eea5267 | 683 | #endif | 
| DrCoyle | 0:1e675eea5267 | 684 | } | 
| DrCoyle | 0:1e675eea5267 | 685 | line >>= 1; | 
| DrCoyle | 0:1e675eea5267 | 686 | } | 
| DrCoyle | 0:1e675eea5267 | 687 | } | 
| DrCoyle | 0:1e675eea5267 | 688 | }*/ | 
| DrCoyle | 0:1e675eea5267 | 689 | /* | 
| DrCoyle | 0:1e675eea5267 | 690 | void Adafruit_ST7735::drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color) | 
| DrCoyle | 0:1e675eea5267 | 691 | { | 
| DrCoyle | 0:1e675eea5267 | 692 | drawLine(x0, y0, x1, y1, color); | 
| DrCoyle | 0:1e675eea5267 | 693 | drawLine(x1, y1, x2, y2, color); | 
| DrCoyle | 0:1e675eea5267 | 694 | drawLine(x2, y2, x0, y0, color); | 
| DrCoyle | 0:1e675eea5267 | 695 | }*/ |