#include "Adafruit_ILI9341.h" #include "Adafruit_GFX.h" extern "C"{ #include #include #include #include "driver/hspi.h" } #define SWAPBYTES(i) ((i>>8) | (i<<8)) void Adafruit_ILI9341::transmitCmdData(uint8_t cmd, const uint8_t *data, uint8_t numDataByte) { spi_wait_ready(); TFT_DC_COMMAND; spi_send_uint8(cmd); spi_wait_ready(); TFT_DC_DATA; spi_send_data(data, numDataByte); } void Adafruit_ILI9341::begin() { //Set communication using HW SPI Port config = spi_init(HSPI, 1, spi_mode_tx); TFT_DC_INIT; delay(1); uint8_t data[15] = {0}; data[0] = 0x39; data[1] = 0x2C; data[2] = 0x00; data[3] = 0x34; data[4] = 0x02; transmitCmdData(0xCB, data, 5); data[0] = 0x00; data[1] = 0XC1; data[2] = 0X30; transmitCmdData(0xCF, data, 3); data[0] = 0x85; data[1] = 0x00; data[2] = 0x78; transmitCmdData(0xE8, data, 3); data[0] = 0x00; data[1] = 0x00; transmitCmdData(0xEA, data, 2); data[0] = 0x64; data[1] = 0x03; data[2] = 0X12; data[3] = 0X81; transmitCmdData(0xED, data, 4); data[0] = 0x20; transmitCmdData(0xF7, data, 1); data[0] = 0x23; //VRH[5:0] transmitCmdData(0xC0, data, 1); //Power control data[0] = 0x10; //SAP[2:0];BT[3:0] transmitCmdData(0xC1, data, 1); //Power control data[0] = 0x3e; //Contrast data[1] = 0x28; transmitCmdData(0xC5, data, 2); //VCM control data[0] = 0x86; //-- transmitCmdData(0xC7, data, 1); //VCM control2 data[0] = 0x48; //C8 transmitCmdData(0x36, data, 1); // Memory Access Control data[0] = 0x55; transmitCmdData(0x3A, data, 1); data[0] = 0x00; data[1] = 0x18; transmitCmdData(0xB1, data, 2); data[0] = 0x08; data[1] = 0x82; data[2] = 0x27; transmitCmdData(0xB6, data, 3); // Display Function Control data[0] = 0x00; transmitCmdData(0xF2, data, 1); // 3Gamma Function Disable data[0] = 0x01; transmitCmdData(0x26, data, 1); //Gamma curve selected data[0] = 0x0F; data[1] = 0x31; data[2] = 0x2B; data[3] = 0x0C; data[4] = 0x0E; data[5] = 0x08; data[6] = 0x4E; data[7] = 0xF1; data[8] = 0x37; data[9] = 0x07; data[10] = 0x10; data[11] = 0x03; data[12] = 0x0E; data[13] = 0x09; data[14] = 0x00; transmitCmdData(0xE0, data, 15); //Set Gamma data[0] = 0x00; data[1] = 0x0E; data[2] = 0x14; data[3] = 0x03; data[4] = 0x11; data[5] = 0x07; data[6] = 0x31; data[7] = 0xC1; data[8] = 0x48; data[9] = 0x08; data[10] = 0x0F; data[11] = 0x0C; data[12] = 0x31; data[13] = 0x36; data[14] = 0x0F; transmitCmdData(0xE1, data, 15); //Set Gamma transmitCmd(0x11); //Exit Sleep delay(120); transmitCmd(0x29); //Display on transmitCmd(0x2c); spi_wait_ready(); } void Adafruit_ILI9341::drawPixel(int16_t x, int16_t y, uint16_t color) { if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return; setAddrWindow(x,y,x+1,y+1); transmitData(SWAPBYTES(color)); } void Adafruit_ILI9341::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) { // Rudimentary clipping if((x >= _width) || (y >= _height)) return; if((y+h-1) >= _height) h = _height-y; setAddrWindow(x, y, x, y+h-1); transmitData(SWAPBYTES(color), h); } void Adafruit_ILI9341::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) { // Rudimentary clipping if((x >= _width) || (y >= _height)) return; if((x+w-1) >= _width) w = _width-x; setAddrWindow(x, y, x+w-1, y); transmitData(SWAPBYTES(color), w); } void Adafruit_ILI9341::fillScreen(uint16_t color) { fillRect(0, 0, _width, _height, color); } // fill a rectangle void Adafruit_ILI9341::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) { // rudimentary clipping (drawChar w/big text requires this) if((x >= _width) || (y >= _height)) return; if((x + w - 1) >= _width) w = _width - x; if((y + h - 1) >= _height) h = _height - y; setAddrWindow(x, y, x+w-1, y+h-1); transmitData(SWAPBYTES(color), h*w); } // Pass 8-bit (each) R,G,B, get back 16-bit packed color uint16_t Adafruit_ILI9341::color565(uint8_t r, uint8_t g, uint8_t b) { return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); } #define MADCTL_MY 0x80 #define MADCTL_MX 0x40 #define MADCTL_MV 0x20 #define MADCTL_ML 0x10 #define MADCTL_RGB 0x00 #define MADCTL_BGR 0x08 #define MADCTL_MH 0x04 void Adafruit_ILI9341::setRotation(uint8_t m) { uint8_t data; rotation = m % 4; // can't be higher than 3 switch (rotation) { case 0: data = MADCTL_MX | MADCTL_BGR; _width = ILI9341_TFTWIDTH; _height = ILI9341_TFTHEIGHT; break; case 1: data = MADCTL_MV | MADCTL_BGR; _width = ILI9341_TFTHEIGHT; _height = ILI9341_TFTWIDTH; break; case 2: data = MADCTL_MY | MADCTL_BGR; _width = ILI9341_TFTWIDTH; _height = ILI9341_TFTHEIGHT; break; case 3: data = MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR; _width = ILI9341_TFTHEIGHT; _height = ILI9341_TFTWIDTH; break; } transmitCmdData(ILI9341_MADCTL, &data, 1); } void Adafruit_ILI9341::invertDisplay(boolean i) { transmitCmd(i ? ILI9341_INVON : ILI9341_INVOFF); }