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
Adafruit_ILI9340.cpp@2:effcedd42f1b, 2014-12-17 (annotated)
- 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?
User | Revision | Line number | New 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 |