ILI9340 Library based on the Arduino version from Adafruit. It has been tested with a custom STM32F103C8 board.

Porting of the ILI9340 Library from Adafruit. It has been tested on a custom board based on a STM32F103C8 microcontroller.

Please, see the Wiki page on how to use the library

Committer:
gmoralis
Date:
Wed Dec 17 07:57:28 2014 +0000
Revision:
2:effcedd42f1b
Parent:
1:5f8309157018
Added glcdfont.c which I forgot to include in the initial release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gmoralis 0:0bf2453a67ba 1 /***************************************************
gmoralis 0:0bf2453a67ba 2 This is an Arduino Library for the Adafruit 2.2" SPI display.
gmoralis 0:0bf2453a67ba 3 This library works with the Adafruit 2.2" TFT Breakout w/SD card
gmoralis 0:0bf2453a67ba 4 ----> http://www.adafruit.com/products/1480
gmoralis 0:0bf2453a67ba 5
gmoralis 0:0bf2453a67ba 6 Check out the links above for our tutorials and wiring diagrams
gmoralis 0:0bf2453a67ba 7 These displays use SPI to communicate, 4 or 5 pins are required to
gmoralis 0:0bf2453a67ba 8 interface (RST is optional)
gmoralis 0:0bf2453a67ba 9 Adafruit invests time and resources providing this open source code,
gmoralis 0:0bf2453a67ba 10 please support Adafruit and open-source hardware by purchasing
gmoralis 0:0bf2453a67ba 11 products from Adafruit!
gmoralis 0:0bf2453a67ba 12
gmoralis 0:0bf2453a67ba 13 Written by Limor Fried/Ladyada for Adafruit Industries.
gmoralis 0:0bf2453a67ba 14 MIT license, all text above must be included in any redistribution
gmoralis 0:0bf2453a67ba 15 ****************************************************/
gmoralis 0:0bf2453a67ba 16
gmoralis 0:0bf2453a67ba 17 // Modified for mbed
gmoralis 0:0bf2453a67ba 18 // by Georgios Moralis
gmoralis 0:0bf2453a67ba 19
gmoralis 0:0bf2453a67ba 20
gmoralis 0:0bf2453a67ba 21 #include "mbed.h"
gmoralis 0:0bf2453a67ba 22 #include "Adafruit_ILI9340.h"
gmoralis 0:0bf2453a67ba 23 #include "stdint.h"
gmoralis 0:0bf2453a67ba 24
gmoralis 0:0bf2453a67ba 25
gmoralis 1:5f8309157018 26 #define OSET_BIT(dpin) dpin->write(1)
gmoralis 1:5f8309157018 27 #define OCLEAR_BIT(dpin) dpin->write(0)
gmoralis 0:0bf2453a67ba 28
gmoralis 0:0bf2453a67ba 29 #define digitalWrite(dpin,value) ((value==0)?dpin->write(0):dpin->write(1))
gmoralis 0:0bf2453a67ba 30 #define digitalRead(dpin) (dpin->read())
gmoralis 0:0bf2453a67ba 31
gmoralis 0:0bf2453a67ba 32 // Single constructor either for software or hardware SPI
gmoralis 0:0bf2453a67ba 33 Adafruit_ILI9340::Adafruit_ILI9340(SPI *defspi) : Adafruit_GFX(ILI9340_TFTWIDTH, ILI9340_TFTHEIGHT) {
gmoralis 0:0bf2453a67ba 34 hwSPI = defspi;
gmoralis 0:0bf2453a67ba 35 }
gmoralis 0:0bf2453a67ba 36
gmoralis 0:0bf2453a67ba 37 void Adafruit_ILI9340::setMISO(DigitalIn *gport)
gmoralis 0:0bf2453a67ba 38 {
gmoralis 0:0bf2453a67ba 39 misoport = gport;
gmoralis 0:0bf2453a67ba 40 }
gmoralis 0:0bf2453a67ba 41
gmoralis 0:0bf2453a67ba 42 void Adafruit_ILI9340::setMOSI(DigitalOut *gport)
gmoralis 0:0bf2453a67ba 43 {
gmoralis 0:0bf2453a67ba 44 mosiport = gport;
gmoralis 0:0bf2453a67ba 45 }
gmoralis 0:0bf2453a67ba 46
gmoralis 0:0bf2453a67ba 47 void Adafruit_ILI9340::setCLK(DigitalOut *gport)
gmoralis 0:0bf2453a67ba 48 {
gmoralis 0:0bf2453a67ba 49 clkport = gport;
gmoralis 0:0bf2453a67ba 50 }
gmoralis 0:0bf2453a67ba 51
gmoralis 0:0bf2453a67ba 52 void Adafruit_ILI9340::setRST(DigitalOut *gport)
gmoralis 0:0bf2453a67ba 53 {
gmoralis 0:0bf2453a67ba 54 rstport = gport;
gmoralis 0:0bf2453a67ba 55 }
gmoralis 0:0bf2453a67ba 56
gmoralis 0:0bf2453a67ba 57 void Adafruit_ILI9340::setCS(DigitalOut *gport)
gmoralis 0:0bf2453a67ba 58 {
gmoralis 0:0bf2453a67ba 59 csport = gport;
gmoralis 0:0bf2453a67ba 60 }
gmoralis 0:0bf2453a67ba 61
gmoralis 0:0bf2453a67ba 62 void Adafruit_ILI9340::setDC(DigitalOut *gport)
gmoralis 0:0bf2453a67ba 63 {
gmoralis 0:0bf2453a67ba 64 dcport = gport;
gmoralis 0:0bf2453a67ba 65 }
gmoralis 0:0bf2453a67ba 66
gmoralis 0:0bf2453a67ba 67 void Adafruit_ILI9340::spiwrite(uint8_t c) {
gmoralis 0:0bf2453a67ba 68
gmoralis 0:0bf2453a67ba 69 //Serial.print("0x"); Serial.print(c, HEX); Serial.print(", ");
gmoralis 0:0bf2453a67ba 70
gmoralis 0:0bf2453a67ba 71 if (hwSPI) {
gmoralis 0:0bf2453a67ba 72 hwSPI->write(c);
gmoralis 0:0bf2453a67ba 73 } else {
gmoralis 0:0bf2453a67ba 74 // Fast SPI bitbang swiped from LPD8806 library
gmoralis 0:0bf2453a67ba 75 for(uint8_t bit = 0x80; bit; bit >>= 1) {
gmoralis 0:0bf2453a67ba 76 if(c & bit) {
gmoralis 1:5f8309157018 77 OSET_BIT(mosiport);
gmoralis 0:0bf2453a67ba 78 } else {
gmoralis 0:0bf2453a67ba 79
gmoralis 1:5f8309157018 80 OCLEAR_BIT(mosiport);
gmoralis 0:0bf2453a67ba 81 }
gmoralis 1:5f8309157018 82 OSET_BIT(clkport);
gmoralis 1:5f8309157018 83 OCLEAR_BIT(clkport);
gmoralis 0:0bf2453a67ba 84 }
gmoralis 0:0bf2453a67ba 85 }
gmoralis 0:0bf2453a67ba 86 }
gmoralis 0:0bf2453a67ba 87
gmoralis 0:0bf2453a67ba 88
gmoralis 0:0bf2453a67ba 89 void Adafruit_ILI9340::writecommand(uint8_t c) {
gmoralis 1:5f8309157018 90 OCLEAR_BIT(dcport);
gmoralis 0:0bf2453a67ba 91 if (!hwSPI)
gmoralis 1:5f8309157018 92 OCLEAR_BIT(clkport);
gmoralis 0:0bf2453a67ba 93
gmoralis 1:5f8309157018 94 OCLEAR_BIT(csport);
gmoralis 0:0bf2453a67ba 95
gmoralis 0:0bf2453a67ba 96 spiwrite(c);
gmoralis 0:0bf2453a67ba 97
gmoralis 1:5f8309157018 98 OSET_BIT(csport);
gmoralis 0:0bf2453a67ba 99 }
gmoralis 0:0bf2453a67ba 100
gmoralis 0:0bf2453a67ba 101
gmoralis 0:0bf2453a67ba 102 void Adafruit_ILI9340::writedata(uint8_t c) {
gmoralis 1:5f8309157018 103 OSET_BIT(dcport);
gmoralis 0:0bf2453a67ba 104 if (!hwSPI)
gmoralis 1:5f8309157018 105 OCLEAR_BIT(clkport);
gmoralis 0:0bf2453a67ba 106
gmoralis 1:5f8309157018 107 OCLEAR_BIT(csport);
gmoralis 0:0bf2453a67ba 108
gmoralis 0:0bf2453a67ba 109
gmoralis 0:0bf2453a67ba 110 spiwrite(c);
gmoralis 0:0bf2453a67ba 111
gmoralis 0:0bf2453a67ba 112
gmoralis 1:5f8309157018 113 OSET_BIT(csport);
gmoralis 0:0bf2453a67ba 114 }
gmoralis 0:0bf2453a67ba 115
gmoralis 0:0bf2453a67ba 116 // Rather than a bazillion writecommand() and writedata() calls, screen
gmoralis 0:0bf2453a67ba 117 // initialization commands and arguments are organized in these tables
gmoralis 0:0bf2453a67ba 118 // stored in PROGMEM. The table may look bulky, but that's mostly the
gmoralis 0:0bf2453a67ba 119 // formatting -- storage-wise this is hundreds of bytes more compact
gmoralis 0:0bf2453a67ba 120 // than the equivalent code. Companion function follows.
gmoralis 0:0bf2453a67ba 121 #define DELAY 0x80
gmoralis 0:0bf2453a67ba 122
gmoralis 0:0bf2453a67ba 123 // Companion code to the above tables. Reads and issues
gmoralis 0:0bf2453a67ba 124 // a series of LCD commands stored in PROGMEM byte array.
gmoralis 0:0bf2453a67ba 125 void Adafruit_ILI9340::commandList(uint8_t *addr) {
gmoralis 0:0bf2453a67ba 126
gmoralis 0:0bf2453a67ba 127 uint8_t numCommands, numArgs;
gmoralis 0:0bf2453a67ba 128 uint16_t ms;
gmoralis 0:0bf2453a67ba 129
gmoralis 0:0bf2453a67ba 130 numCommands = pgm_read_byte(addr++); // Number of commands to follow
gmoralis 0:0bf2453a67ba 131 while(numCommands--) { // For each command...
gmoralis 0:0bf2453a67ba 132 writecommand(pgm_read_byte(addr++)); // Read, issue command
gmoralis 0:0bf2453a67ba 133 numArgs = pgm_read_byte(addr++); // Number of args to follow
gmoralis 0:0bf2453a67ba 134 ms = numArgs & DELAY; // If hibit set, delay follows args
gmoralis 0:0bf2453a67ba 135 numArgs &= ~DELAY; // Mask out delay bit
gmoralis 0:0bf2453a67ba 136 while(numArgs--) { // For each argument...
gmoralis 0:0bf2453a67ba 137 writedata(pgm_read_byte(addr++)); // Read, issue argument
gmoralis 0:0bf2453a67ba 138 }
gmoralis 0:0bf2453a67ba 139
gmoralis 0:0bf2453a67ba 140 if(ms) {
gmoralis 0:0bf2453a67ba 141 ms = pgm_read_byte(addr++); // Read post-command delay time (ms)
gmoralis 0:0bf2453a67ba 142 if(ms == 255) ms = 500; // If 255, delay for 500 ms
gmoralis 0:0bf2453a67ba 143 wait_ms(ms);
gmoralis 0:0bf2453a67ba 144 }
gmoralis 0:0bf2453a67ba 145 }
gmoralis 0:0bf2453a67ba 146 }
gmoralis 0:0bf2453a67ba 147
gmoralis 0:0bf2453a67ba 148
gmoralis 0:0bf2453a67ba 149 void Adafruit_ILI9340::begin(void) {
gmoralis 0:0bf2453a67ba 150
gmoralis 0:0bf2453a67ba 151 digitalWrite(rstport, LOW);
gmoralis 0:0bf2453a67ba 152 if(hwSPI) {
gmoralis 0:0bf2453a67ba 153 hwSPI->frequency(16000000);
gmoralis 0:0bf2453a67ba 154 } else {
gmoralis 1:5f8309157018 155 OCLEAR_BIT(clkport);
gmoralis 1:5f8309157018 156 OCLEAR_BIT(mosiport);
gmoralis 0:0bf2453a67ba 157 }
gmoralis 0:0bf2453a67ba 158 // toggle RST low to reset
gmoralis 0:0bf2453a67ba 159
gmoralis 0:0bf2453a67ba 160 digitalWrite(rstport, HIGH);
gmoralis 0:0bf2453a67ba 161 wait_ms(5);
gmoralis 0:0bf2453a67ba 162 digitalWrite(rstport, LOW);
gmoralis 0:0bf2453a67ba 163 wait_ms(20);
gmoralis 0:0bf2453a67ba 164 digitalWrite(rstport, HIGH);
gmoralis 0:0bf2453a67ba 165 wait_ms(150);
gmoralis 0:0bf2453a67ba 166
gmoralis 0:0bf2453a67ba 167 /*
gmoralis 0:0bf2453a67ba 168 uint8_t x = readcommand8(ILI9340_RDMODE);
gmoralis 0:0bf2453a67ba 169 Serial.print("\nDisplay Power Mode: 0x"); Serial.println(x, HEX);
gmoralis 0:0bf2453a67ba 170 x = readcommand8(ILI9340_RDMADCTL);
gmoralis 0:0bf2453a67ba 171 Serial.print("\nMADCTL Mode: 0x"); Serial.println(x, HEX);
gmoralis 0:0bf2453a67ba 172 x = readcommand8(ILI9340_RDPIXFMT);
gmoralis 0:0bf2453a67ba 173 Serial.print("\nPixel Format: 0x"); Serial.println(x, HEX);
gmoralis 0:0bf2453a67ba 174 x = readcommand8(ILI9340_RDIMGFMT);
gmoralis 0:0bf2453a67ba 175 Serial.print("\nImage Format: 0x"); Serial.println(x, HEX);
gmoralis 0:0bf2453a67ba 176 x = readcommand8(ILI9340_RDSELFDIAG);
gmoralis 0:0bf2453a67ba 177 Serial.print("\nSelf Diagnostic: 0x"); Serial.println(x, HEX);
gmoralis 0:0bf2453a67ba 178 */
gmoralis 0:0bf2453a67ba 179
gmoralis 0:0bf2453a67ba 180 //if(cmdList) commandList(cmdList);
gmoralis 0:0bf2453a67ba 181
gmoralis 0:0bf2453a67ba 182 writecommand(0xEF);
gmoralis 0:0bf2453a67ba 183 writedata(0x03);
gmoralis 0:0bf2453a67ba 184 writedata(0x80);
gmoralis 0:0bf2453a67ba 185 writedata(0x02);
gmoralis 0:0bf2453a67ba 186
gmoralis 0:0bf2453a67ba 187 writecommand(0xCF);
gmoralis 0:0bf2453a67ba 188 writedata(0x00);
gmoralis 0:0bf2453a67ba 189 writedata(0XC1);
gmoralis 0:0bf2453a67ba 190 writedata(0X30);
gmoralis 0:0bf2453a67ba 191
gmoralis 0:0bf2453a67ba 192 writecommand(0xED);
gmoralis 0:0bf2453a67ba 193 writedata(0x64);
gmoralis 0:0bf2453a67ba 194 writedata(0x03);
gmoralis 0:0bf2453a67ba 195 writedata(0X12);
gmoralis 0:0bf2453a67ba 196 writedata(0X81);
gmoralis 0:0bf2453a67ba 197
gmoralis 0:0bf2453a67ba 198 writecommand(0xE8);
gmoralis 0:0bf2453a67ba 199 writedata(0x85);
gmoralis 0:0bf2453a67ba 200 writedata(0x00);
gmoralis 0:0bf2453a67ba 201 writedata(0x78);
gmoralis 0:0bf2453a67ba 202
gmoralis 0:0bf2453a67ba 203 writecommand(0xCB);
gmoralis 0:0bf2453a67ba 204 writedata(0x39);
gmoralis 0:0bf2453a67ba 205 writedata(0x2C);
gmoralis 0:0bf2453a67ba 206 writedata(0x00);
gmoralis 0:0bf2453a67ba 207 writedata(0x34);
gmoralis 0:0bf2453a67ba 208 writedata(0x02);
gmoralis 0:0bf2453a67ba 209
gmoralis 0:0bf2453a67ba 210 writecommand(0xF7);
gmoralis 0:0bf2453a67ba 211 writedata(0x20);
gmoralis 0:0bf2453a67ba 212
gmoralis 0:0bf2453a67ba 213 writecommand(0xEA);
gmoralis 0:0bf2453a67ba 214 writedata(0x00);
gmoralis 0:0bf2453a67ba 215 writedata(0x00);
gmoralis 0:0bf2453a67ba 216
gmoralis 0:0bf2453a67ba 217 writecommand(ILI9340_PWCTR1); //Power control
gmoralis 0:0bf2453a67ba 218 writedata(0x23); //VRH[5:0]
gmoralis 0:0bf2453a67ba 219
gmoralis 0:0bf2453a67ba 220 writecommand(ILI9340_PWCTR2); //Power control
gmoralis 0:0bf2453a67ba 221 writedata(0x10); //SAP[2:0];BT[3:0]
gmoralis 0:0bf2453a67ba 222
gmoralis 0:0bf2453a67ba 223 writecommand(ILI9340_VMCTR1); //VCM control
gmoralis 0:0bf2453a67ba 224 writedata(0x3e); //
gmoralis 0:0bf2453a67ba 225 writedata(0x28);
gmoralis 0:0bf2453a67ba 226
gmoralis 0:0bf2453a67ba 227 writecommand(ILI9340_VMCTR2); //VCM control2
gmoralis 0:0bf2453a67ba 228 writedata(0x86); //--
gmoralis 0:0bf2453a67ba 229
gmoralis 0:0bf2453a67ba 230 writecommand(ILI9340_MADCTL); // Memory Access Control
gmoralis 0:0bf2453a67ba 231 writedata(ILI9340_MADCTL_MX | ILI9340_MADCTL_BGR);
gmoralis 0:0bf2453a67ba 232
gmoralis 0:0bf2453a67ba 233 writecommand(ILI9340_PIXFMT);
gmoralis 0:0bf2453a67ba 234 writedata(0x55);
gmoralis 0:0bf2453a67ba 235
gmoralis 0:0bf2453a67ba 236 writecommand(ILI9340_FRMCTR1);
gmoralis 0:0bf2453a67ba 237 writedata(0x00);
gmoralis 0:0bf2453a67ba 238 writedata(0x18);
gmoralis 0:0bf2453a67ba 239
gmoralis 0:0bf2453a67ba 240 writecommand(ILI9340_DFUNCTR); // Display Function Control
gmoralis 0:0bf2453a67ba 241 writedata(0x08);
gmoralis 0:0bf2453a67ba 242 writedata(0x82);
gmoralis 0:0bf2453a67ba 243 writedata(0x27);
gmoralis 0:0bf2453a67ba 244
gmoralis 0:0bf2453a67ba 245 writecommand(0xF2); // 3Gamma Function Disable
gmoralis 0:0bf2453a67ba 246 writedata(0x00);
gmoralis 0:0bf2453a67ba 247
gmoralis 0:0bf2453a67ba 248 writecommand(ILI9340_GAMMASET); //Gamma curve selected
gmoralis 0:0bf2453a67ba 249 writedata(0x01);
gmoralis 0:0bf2453a67ba 250
gmoralis 0:0bf2453a67ba 251 writecommand(ILI9340_GMCTRP1); //Set Gamma
gmoralis 0:0bf2453a67ba 252 writedata(0x0F);
gmoralis 0:0bf2453a67ba 253 writedata(0x31);
gmoralis 0:0bf2453a67ba 254 writedata(0x2B);
gmoralis 0:0bf2453a67ba 255 writedata(0x0C);
gmoralis 0:0bf2453a67ba 256 writedata(0x0E);
gmoralis 0:0bf2453a67ba 257 writedata(0x08);
gmoralis 0:0bf2453a67ba 258 writedata(0x4E);
gmoralis 0:0bf2453a67ba 259 writedata(0xF1);
gmoralis 0:0bf2453a67ba 260 writedata(0x37);
gmoralis 0:0bf2453a67ba 261 writedata(0x07);
gmoralis 0:0bf2453a67ba 262 writedata(0x10);
gmoralis 0:0bf2453a67ba 263 writedata(0x03);
gmoralis 0:0bf2453a67ba 264 writedata(0x0E);
gmoralis 0:0bf2453a67ba 265 writedata(0x09);
gmoralis 0:0bf2453a67ba 266 writedata(0x00);
gmoralis 0:0bf2453a67ba 267
gmoralis 0:0bf2453a67ba 268 writecommand(ILI9340_GMCTRN1); //Set Gamma
gmoralis 0:0bf2453a67ba 269 writedata(0x00);
gmoralis 0:0bf2453a67ba 270 writedata(0x0E);
gmoralis 0:0bf2453a67ba 271 writedata(0x14);
gmoralis 0:0bf2453a67ba 272 writedata(0x03);
gmoralis 0:0bf2453a67ba 273 writedata(0x11);
gmoralis 0:0bf2453a67ba 274 writedata(0x07);
gmoralis 0:0bf2453a67ba 275 writedata(0x31);
gmoralis 0:0bf2453a67ba 276 writedata(0xC1);
gmoralis 0:0bf2453a67ba 277 writedata(0x48);
gmoralis 0:0bf2453a67ba 278 writedata(0x08);
gmoralis 0:0bf2453a67ba 279 writedata(0x0F);
gmoralis 0:0bf2453a67ba 280 writedata(0x0C);
gmoralis 0:0bf2453a67ba 281 writedata(0x31);
gmoralis 0:0bf2453a67ba 282 writedata(0x36);
gmoralis 0:0bf2453a67ba 283 writedata(0x0F);
gmoralis 0:0bf2453a67ba 284
gmoralis 0:0bf2453a67ba 285 writecommand(ILI9340_SLPOUT); //Exit Sleep
gmoralis 0:0bf2453a67ba 286 wait_ms(120);
gmoralis 0:0bf2453a67ba 287 writecommand(ILI9340_DISPON); //Display on
gmoralis 0:0bf2453a67ba 288 }
gmoralis 0:0bf2453a67ba 289
gmoralis 0:0bf2453a67ba 290
gmoralis 0:0bf2453a67ba 291 void Adafruit_ILI9340::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1,
gmoralis 0:0bf2453a67ba 292 uint16_t y1) {
gmoralis 0:0bf2453a67ba 293
gmoralis 0:0bf2453a67ba 294 writecommand(ILI9340_CASET); // Column addr set
gmoralis 0:0bf2453a67ba 295 writedata(x0 >> 8);
gmoralis 0:0bf2453a67ba 296 writedata(x0 & 0xFF); // XSTART
gmoralis 0:0bf2453a67ba 297 writedata(x1 >> 8);
gmoralis 0:0bf2453a67ba 298 writedata(x1 & 0xFF); // XEND
gmoralis 0:0bf2453a67ba 299
gmoralis 0:0bf2453a67ba 300 writecommand(ILI9340_PASET); // Row addr set
gmoralis 0:0bf2453a67ba 301 writedata(y0>>8);
gmoralis 0:0bf2453a67ba 302 writedata(y0); // YSTART
gmoralis 0:0bf2453a67ba 303 writedata(y1>>8);
gmoralis 0:0bf2453a67ba 304 writedata(y1); // YEND
gmoralis 0:0bf2453a67ba 305
gmoralis 0:0bf2453a67ba 306 writecommand(ILI9340_RAMWR); // write to RAM
gmoralis 0:0bf2453a67ba 307 }
gmoralis 0:0bf2453a67ba 308
gmoralis 0:0bf2453a67ba 309
gmoralis 0:0bf2453a67ba 310 void Adafruit_ILI9340::pushColor(uint16_t color) {
gmoralis 0:0bf2453a67ba 311
gmoralis 1:5f8309157018 312 OSET_BIT(dcport);
gmoralis 0:0bf2453a67ba 313
gmoralis 1:5f8309157018 314 OCLEAR_BIT(csport);
gmoralis 0:0bf2453a67ba 315
gmoralis 0:0bf2453a67ba 316 spiwrite(color >> 8);
gmoralis 0:0bf2453a67ba 317 spiwrite(color);
gmoralis 0:0bf2453a67ba 318
gmoralis 1:5f8309157018 319 OSET_BIT(csport);
gmoralis 0:0bf2453a67ba 320
gmoralis 0:0bf2453a67ba 321 }
gmoralis 0:0bf2453a67ba 322
gmoralis 0:0bf2453a67ba 323 void Adafruit_ILI9340::drawPixel(int16_t x, int16_t y, uint16_t color) {
gmoralis 0:0bf2453a67ba 324
gmoralis 0:0bf2453a67ba 325 if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return;
gmoralis 0:0bf2453a67ba 326
gmoralis 0:0bf2453a67ba 327 setAddrWindow(x,y,x+1,y+1);
gmoralis 0:0bf2453a67ba 328
gmoralis 0:0bf2453a67ba 329
gmoralis 1:5f8309157018 330 OSET_BIT(dcport);
gmoralis 0:0bf2453a67ba 331
gmoralis 1:5f8309157018 332 OCLEAR_BIT(csport);
gmoralis 0:0bf2453a67ba 333
gmoralis 0:0bf2453a67ba 334 spiwrite(color >> 8);
gmoralis 0:0bf2453a67ba 335 spiwrite(color);
gmoralis 0:0bf2453a67ba 336
gmoralis 1:5f8309157018 337 OSET_BIT(csport);
gmoralis 0:0bf2453a67ba 338
gmoralis 0:0bf2453a67ba 339 }
gmoralis 0:0bf2453a67ba 340
gmoralis 0:0bf2453a67ba 341
gmoralis 0:0bf2453a67ba 342 void Adafruit_ILI9340::drawFastVLine(int16_t x, int16_t y, int16_t h,
gmoralis 0:0bf2453a67ba 343 uint16_t color) {
gmoralis 0:0bf2453a67ba 344
gmoralis 0:0bf2453a67ba 345 // Rudimentary clipping
gmoralis 0:0bf2453a67ba 346 if((x >= _width) || (y >= _height)) return;
gmoralis 0:0bf2453a67ba 347
gmoralis 0:0bf2453a67ba 348 if((y+h-1) >= _height)
gmoralis 0:0bf2453a67ba 349 h = _height-y;
gmoralis 0:0bf2453a67ba 350
gmoralis 0:0bf2453a67ba 351 setAddrWindow(x, y, x, y+h-1);
gmoralis 0:0bf2453a67ba 352
gmoralis 0:0bf2453a67ba 353 uint8_t hi = color >> 8, lo = color;
gmoralis 0:0bf2453a67ba 354
gmoralis 1:5f8309157018 355 OSET_BIT(dcport);
gmoralis 0:0bf2453a67ba 356
gmoralis 1:5f8309157018 357 OCLEAR_BIT(csport);
gmoralis 0:0bf2453a67ba 358
gmoralis 0:0bf2453a67ba 359
gmoralis 0:0bf2453a67ba 360 while (h--) {
gmoralis 0:0bf2453a67ba 361 spiwrite(hi);
gmoralis 0:0bf2453a67ba 362 spiwrite(lo);
gmoralis 0:0bf2453a67ba 363 }
gmoralis 1:5f8309157018 364 OSET_BIT(csport);
gmoralis 0:0bf2453a67ba 365
gmoralis 0:0bf2453a67ba 366 }
gmoralis 0:0bf2453a67ba 367
gmoralis 0:0bf2453a67ba 368
gmoralis 0:0bf2453a67ba 369 void Adafruit_ILI9340::drawFastHLine(int16_t x, int16_t y, int16_t w,
gmoralis 0:0bf2453a67ba 370 uint16_t color) {
gmoralis 0:0bf2453a67ba 371
gmoralis 0:0bf2453a67ba 372 // Rudimentary clipping
gmoralis 0:0bf2453a67ba 373 if((x >= _width) || (y >= _height)) return;
gmoralis 0:0bf2453a67ba 374 if((x+w-1) >= _width) w = _width-x;
gmoralis 0:0bf2453a67ba 375 setAddrWindow(x, y, x+w-1, y);
gmoralis 0:0bf2453a67ba 376
gmoralis 0:0bf2453a67ba 377 uint8_t hi = color >> 8, lo = color;
gmoralis 1:5f8309157018 378 OSET_BIT(dcport);
gmoralis 1:5f8309157018 379 OCLEAR_BIT(csport);
gmoralis 0:0bf2453a67ba 380
gmoralis 0:0bf2453a67ba 381 while (w--) {
gmoralis 0:0bf2453a67ba 382 spiwrite(hi);
gmoralis 0:0bf2453a67ba 383 spiwrite(lo);
gmoralis 0:0bf2453a67ba 384 }
gmoralis 1:5f8309157018 385 OSET_BIT(csport);
gmoralis 0:0bf2453a67ba 386
gmoralis 0:0bf2453a67ba 387 }
gmoralis 0:0bf2453a67ba 388
gmoralis 0:0bf2453a67ba 389 void Adafruit_ILI9340::fillScreen(uint16_t color) {
gmoralis 0:0bf2453a67ba 390 fillRect(0, 0, _width, _height, color);
gmoralis 0:0bf2453a67ba 391 }
gmoralis 0:0bf2453a67ba 392
gmoralis 0:0bf2453a67ba 393 // fill a rectangle
gmoralis 0:0bf2453a67ba 394 void Adafruit_ILI9340::fillRect(int16_t x, int16_t y, int16_t w, int16_t h,
gmoralis 0:0bf2453a67ba 395 uint16_t color) {
gmoralis 0:0bf2453a67ba 396
gmoralis 0:0bf2453a67ba 397 // rudimentary clipping (drawChar w/big text requires this)
gmoralis 0:0bf2453a67ba 398 if((x >= _width) || (y >= _height)) return;
gmoralis 0:0bf2453a67ba 399 if((x + w - 1) >= _width) w = _width - x;
gmoralis 0:0bf2453a67ba 400 if((y + h - 1) >= _height) h = _height - y;
gmoralis 0:0bf2453a67ba 401
gmoralis 0:0bf2453a67ba 402 setAddrWindow(x, y, x+w-1, y+h-1);
gmoralis 0:0bf2453a67ba 403
gmoralis 0:0bf2453a67ba 404 uint8_t hi = color >> 8, lo = color;
gmoralis 0:0bf2453a67ba 405
gmoralis 1:5f8309157018 406 OSET_BIT(dcport);
gmoralis 0:0bf2453a67ba 407 //digitalWrite(_dc, HIGH);
gmoralis 1:5f8309157018 408 OCLEAR_BIT(csport);
gmoralis 0:0bf2453a67ba 409 //digitalWrite(_cs, LOW);
gmoralis 0:0bf2453a67ba 410
gmoralis 0:0bf2453a67ba 411 for(y=h; y>0; y--) {
gmoralis 0:0bf2453a67ba 412 for(x=w; x>0; x--) {
gmoralis 0:0bf2453a67ba 413 spiwrite(hi);
gmoralis 0:0bf2453a67ba 414 spiwrite(lo);
gmoralis 0:0bf2453a67ba 415 }
gmoralis 0:0bf2453a67ba 416 }
gmoralis 0:0bf2453a67ba 417 //digitalWrite(_cs, HIGH);
gmoralis 1:5f8309157018 418 OSET_BIT(csport);
gmoralis 0:0bf2453a67ba 419 }
gmoralis 0:0bf2453a67ba 420
gmoralis 0:0bf2453a67ba 421
gmoralis 0:0bf2453a67ba 422 // Pass 8-bit (each) R,G,B, get back 16-bit packed color
gmoralis 0:0bf2453a67ba 423 uint16_t Adafruit_ILI9340::Color565(uint8_t r, uint8_t g, uint8_t b) {
gmoralis 0:0bf2453a67ba 424 return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
gmoralis 0:0bf2453a67ba 425 }
gmoralis 0:0bf2453a67ba 426
gmoralis 0:0bf2453a67ba 427
gmoralis 0:0bf2453a67ba 428 void Adafruit_ILI9340::setRotation(uint8_t m) {
gmoralis 0:0bf2453a67ba 429
gmoralis 0:0bf2453a67ba 430 writecommand(ILI9340_MADCTL);
gmoralis 0:0bf2453a67ba 431 rotation = m % 4; // can't be higher than 3
gmoralis 0:0bf2453a67ba 432 switch (rotation) {
gmoralis 0:0bf2453a67ba 433 case 0:
gmoralis 0:0bf2453a67ba 434 writedata(ILI9340_MADCTL_MX | ILI9340_MADCTL_BGR);
gmoralis 0:0bf2453a67ba 435 _width = ILI9340_TFTWIDTH;
gmoralis 0:0bf2453a67ba 436 _height = ILI9340_TFTHEIGHT;
gmoralis 0:0bf2453a67ba 437 break;
gmoralis 0:0bf2453a67ba 438 case 1:
gmoralis 0:0bf2453a67ba 439 writedata(ILI9340_MADCTL_MV | ILI9340_MADCTL_BGR);
gmoralis 0:0bf2453a67ba 440 _width = ILI9340_TFTHEIGHT;
gmoralis 0:0bf2453a67ba 441 _height = ILI9340_TFTWIDTH;
gmoralis 0:0bf2453a67ba 442 break;
gmoralis 0:0bf2453a67ba 443 case 2:
gmoralis 0:0bf2453a67ba 444 writedata(ILI9340_MADCTL_MY | ILI9340_MADCTL_BGR);
gmoralis 0:0bf2453a67ba 445 _width = ILI9340_TFTWIDTH;
gmoralis 0:0bf2453a67ba 446 _height = ILI9340_TFTHEIGHT;
gmoralis 0:0bf2453a67ba 447 break;
gmoralis 0:0bf2453a67ba 448 case 3:
gmoralis 0:0bf2453a67ba 449 writedata(ILI9340_MADCTL_MV | ILI9340_MADCTL_MY | ILI9340_MADCTL_MX | ILI9340_MADCTL_BGR);
gmoralis 0:0bf2453a67ba 450 _width = ILI9340_TFTHEIGHT;
gmoralis 0:0bf2453a67ba 451 _height = ILI9340_TFTWIDTH;
gmoralis 0:0bf2453a67ba 452 break;
gmoralis 0:0bf2453a67ba 453 }
gmoralis 0:0bf2453a67ba 454 }
gmoralis 0:0bf2453a67ba 455
gmoralis 0:0bf2453a67ba 456
gmoralis 0:0bf2453a67ba 457 void Adafruit_ILI9340::invertDisplay(char i) {
gmoralis 0:0bf2453a67ba 458 writecommand(i ? ILI9340_INVON : ILI9340_INVOFF);
gmoralis 0:0bf2453a67ba 459 }
gmoralis 0:0bf2453a67ba 460
gmoralis 0:0bf2453a67ba 461
gmoralis 0:0bf2453a67ba 462 ////////// stuff not actively being used, but kept for posterity
gmoralis 0:0bf2453a67ba 463
gmoralis 0:0bf2453a67ba 464
gmoralis 0:0bf2453a67ba 465 uint8_t Adafruit_ILI9340::spiread(void) {
gmoralis 0:0bf2453a67ba 466 uint8_t r = 0;
gmoralis 0:0bf2453a67ba 467
gmoralis 0:0bf2453a67ba 468 if (hwSPI)
gmoralis 0:0bf2453a67ba 469 {
gmoralis 0:0bf2453a67ba 470 r = hwSPI->write(0);
gmoralis 0:0bf2453a67ba 471 }
gmoralis 0:0bf2453a67ba 472 else
gmoralis 0:0bf2453a67ba 473 {
gmoralis 0:0bf2453a67ba 474 for (uint8_t i=0; i<8; i++) {
gmoralis 0:0bf2453a67ba 475 digitalWrite(clkport, LOW);
gmoralis 0:0bf2453a67ba 476 digitalWrite(clkport, HIGH);
gmoralis 0:0bf2453a67ba 477 r <<= 1;
gmoralis 0:0bf2453a67ba 478 if (digitalRead(misoport))
gmoralis 0:0bf2453a67ba 479 r |= 0x1;
gmoralis 0:0bf2453a67ba 480 }
gmoralis 0:0bf2453a67ba 481 }
gmoralis 0:0bf2453a67ba 482 return r;
gmoralis 0:0bf2453a67ba 483 }
gmoralis 0:0bf2453a67ba 484
gmoralis 0:0bf2453a67ba 485 uint8_t Adafruit_ILI9340::readdata(void) {
gmoralis 0:0bf2453a67ba 486 digitalWrite(dcport, HIGH);
gmoralis 0:0bf2453a67ba 487 digitalWrite(csport, LOW);
gmoralis 0:0bf2453a67ba 488 uint8_t r = spiread();
gmoralis 0:0bf2453a67ba 489 digitalWrite(csport, HIGH);
gmoralis 0:0bf2453a67ba 490
gmoralis 0:0bf2453a67ba 491 return r;
gmoralis 0:0bf2453a67ba 492 }
gmoralis 0:0bf2453a67ba 493
gmoralis 0:0bf2453a67ba 494
gmoralis 0:0bf2453a67ba 495 uint8_t Adafruit_ILI9340::readcommand8(uint8_t c) {
gmoralis 0:0bf2453a67ba 496 digitalWrite(dcport, LOW);
gmoralis 0:0bf2453a67ba 497 if (!hwSPI)
gmoralis 0:0bf2453a67ba 498 digitalWrite(clkport, LOW);
gmoralis 0:0bf2453a67ba 499 digitalWrite(csport, LOW);
gmoralis 0:0bf2453a67ba 500 spiwrite(c);
gmoralis 0:0bf2453a67ba 501 digitalWrite(dcport, HIGH);
gmoralis 0:0bf2453a67ba 502 uint8_t r = spiread();
gmoralis 0:0bf2453a67ba 503 digitalWrite(csport, HIGH);
gmoralis 0:0bf2453a67ba 504 return r;
gmoralis 0:0bf2453a67ba 505 }
gmoralis 0:0bf2453a67ba 506
gmoralis 0:0bf2453a67ba 507
gmoralis 0:0bf2453a67ba 508
gmoralis 0:0bf2453a67ba 509 /*
gmoralis 0:0bf2453a67ba 510
gmoralis 0:0bf2453a67ba 511 uint16_t Adafruit_ILI9340::readcommand16(uint8_t c) {
gmoralis 0:0bf2453a67ba 512 digitalWrite(_dc, LOW);
gmoralis 0:0bf2453a67ba 513 if (_cs)
gmoralis 0:0bf2453a67ba 514 digitalWrite(_cs, LOW);
gmoralis 0:0bf2453a67ba 515
gmoralis 0:0bf2453a67ba 516 spiwrite(c);
gmoralis 0:0bf2453a67ba 517 pinMode(_sid, INPUT); // input!
gmoralis 0:0bf2453a67ba 518 uint16_t r = spiread();
gmoralis 0:0bf2453a67ba 519 r <<= 8;
gmoralis 0:0bf2453a67ba 520 r |= spiread();
gmoralis 0:0bf2453a67ba 521 if (_cs)
gmoralis 0:0bf2453a67ba 522 digitalWrite(_cs, HIGH);
gmoralis 0:0bf2453a67ba 523
gmoralis 0:0bf2453a67ba 524 pinMode(_sid, OUTPUT); // back to output
gmoralis 0:0bf2453a67ba 525 return r;
gmoralis 0:0bf2453a67ba 526 }
gmoralis 0:0bf2453a67ba 527
gmoralis 0:0bf2453a67ba 528 uint32_t Adafruit_ILI9340::readcommand32(uint8_t c) {
gmoralis 0:0bf2453a67ba 529 digitalWrite(_dc, LOW);
gmoralis 0:0bf2453a67ba 530 if (_cs)
gmoralis 0:0bf2453a67ba 531 digitalWrite(_cs, LOW);
gmoralis 0:0bf2453a67ba 532 spiwrite(c);
gmoralis 0:0bf2453a67ba 533 pinMode(_sid, INPUT); // input!
gmoralis 0:0bf2453a67ba 534
gmoralis 0:0bf2453a67ba 535 dummyclock();
gmoralis 0:0bf2453a67ba 536 dummyclock();
gmoralis 0:0bf2453a67ba 537
gmoralis 0:0bf2453a67ba 538 uint32_t r = spiread();
gmoralis 0:0bf2453a67ba 539 r <<= 8;
gmoralis 0:0bf2453a67ba 540 r |= spiread();
gmoralis 0:0bf2453a67ba 541 r <<= 8;
gmoralis 0:0bf2453a67ba 542 r |= spiread();
gmoralis 0:0bf2453a67ba 543 r <<= 8;
gmoralis 0:0bf2453a67ba 544 r |= spiread();
gmoralis 0:0bf2453a67ba 545 if (_cs)
gmoralis 0:0bf2453a67ba 546 digitalWrite(_cs, HIGH);
gmoralis 0:0bf2453a67ba 547
gmoralis 0:0bf2453a67ba 548 pinMode(_sid, OUTPUT); // back to output
gmoralis 0:0bf2453a67ba 549 return r;
gmoralis 0:0bf2453a67ba 550 }
gmoralis 0:0bf2453a67ba 551
gmoralis 0:0bf2453a67ba 552 */
gmoralis 0:0bf2453a67ba 553