#pragma once extern "C" { #include #include } class TFT { public: TFT(uint cs, uint dc, uint rst, uint sck, uint sda) : PinCs(cs), PinDc(dc), PinRst(rst), PinSck(sck), PinSda(sda) {} ~TFT() = default; enum class CMD : uint8_t { NOP = 0x00, SWRESET = 0x01, SLPIN = 0x10, SLPOUT = 0x11, INVOFF = 0x20, INVON = 0x21, DISPON = 0x29, CASET = 0x2A, RASET = 0x2B, RAMWR = 0x2C, MADCTL = 0x36, COLMOD = 0x3A, FRMCTR1 = 0xB1, FRMCTR2 = 0xB2, FRMCTR3 = 0xB3, INVCTR = 0xB4, PWCTR1 = 0xC0, PWCTR2 = 0xC1, PWCTR3 = 0xC2, PWCTR4 = 0xC3, PWCTR5 = 0xC4, VMCTR1 = 0xC5, GMCTRP1 = 0xE0, GMCTRN1 = 0xE1, NORON = 0x13, }; void Init() { spi_init(spi0, 20 * 1000 * 1000); gpio_set_function(PinSck, GPIO_FUNC_SPI); gpio_set_function(PinSda, GPIO_FUNC_SPI); gpio_init(PinCs); gpio_init(PinDc); gpio_init(PinRst); gpio_set_dir(PinCs, GPIO_OUT); gpio_set_dir(PinDc, GPIO_OUT); gpio_set_dir(PinRst, GPIO_OUT); gpio_put(PinCs, 1); gpio_put(PinDc, 1); gpio_put(PinRst, 1); Reset(); // Init sequence Oder so WriteCmd(CMD::SWRESET); sleep_ms(150); WriteCmd(CMD::SLPOUT); sleep_ms(150); WriteCmd(CMD::FRMCTR1); WriteData(0x01); WriteData(0x2C); WriteData(0x2D); WriteCmd(CMD::FRMCTR2); WriteData(0x01); WriteData(0x2C); WriteData(0x2D); WriteCmd(CMD::FRMCTR3); WriteData(0x01); WriteData(0x2C); WriteData(0x2D); WriteData(0x01); WriteData(0x2C); WriteData(0x2D); WriteCmd(CMD::INVCTR); WriteData(0x07); WriteCmd(CMD::PWCTR1); WriteData(0xA2); WriteData(0x02); WriteData(0x84); WriteCmd(CMD::PWCTR2); WriteData(0xC5); WriteCmd(CMD::PWCTR3); WriteData(0x0A); WriteData(0x00); WriteCmd(CMD::PWCTR4); WriteData(0x8A); WriteData(0x2A); WriteCmd(CMD::PWCTR5); WriteData(0x8A); WriteData(0xEE); WriteCmd(CMD::VMCTR1); WriteData(0x0E); WriteCmd(CMD::INVOFF); WriteCmd(CMD::MADCTL); WriteData(0xC8); WriteCmd(CMD::COLMOD); WriteData(0x05); // 16-bit color WriteCmd(CMD::CASET); WriteData(0); WriteData(0); WriteData(0); WriteData(127); WriteCmd(CMD::RASET); WriteData(0); WriteData(0); WriteData(0); WriteData(159); WriteCmd(CMD::GMCTRP1); WriteData(0x02); WriteData(0x1c); WriteData(0x07); WriteData(0x12); WriteData(0x37); WriteData(0x32); WriteData(0x29); WriteData(0x2d); WriteData(0x29); WriteData(0x25); WriteData(0x2B); WriteData(0x39); WriteData(0x00); WriteData(0x01); WriteData(0x03); WriteData(0x10); WriteCmd(CMD::GMCTRN1); WriteData(0x03); WriteData(0x1d); WriteData(0x07); WriteData(0x06); WriteData(0x2E); WriteData(0x2C); WriteData(0x29); WriteData(0x2D); WriteData(0x2E); WriteData(0x2E); WriteData(0x37); WriteData(0x3F); WriteData(0x00); WriteData(0x00); WriteData(0x02); WriteData(0x10); WriteCmd(CMD::NORON); sleep_ms(10); WriteCmd(CMD::DISPON); sleep_ms(100); } void SetWindow(uint8_t x, uint8_t y, uint8_t x1, uint8_t y1) { WriteCmd(CMD::CASET); WriteData(0x00); WriteData(x); WriteData(0x00); WriteData(x1); WriteCmd(CMD::RASET); WriteData(0x00); WriteData(y); WriteData(0x00); WriteData(y1); WriteCmd(CMD::RAMWR); } void DrawPixel(uint8_t x, uint8_t y, uint16_t color) { SetWindow(x, y, x, y); WriteData16(color); } void DrawRect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint16_t color) { SetWindow(x, y, w, h); for (int i = 0; i < w * h; i++) { WriteData16(color); } } void Reset() { gpio_put(PinRst, 0); sleep_ms(50); gpio_put(PinRst, 1); sleep_ms(50); } void WriteCmd(CMD cmd) { WriteCmd((uint8_t)cmd); } void WriteCmd(uint8_t cmd) { gpio_put(PinDc, 0); // Command Mode gpio_put(PinCs, 0); spi_write_blocking(spi0, &cmd, 1); gpio_put(PinCs, 1); } void WriteData(uint8_t data) { gpio_put(PinDc, 1); // Data Mode gpio_put(PinCs, 0); spi_write_blocking(spi0, &data, 1); gpio_put(PinCs, 1); } void WriteData16(uint16_t data) { uint8_t d8[2] = {uint8_t(data >> 8), uint8_t(data & 0xff)}; gpio_put(PinDc, 1); // Data Mode gpio_put(PinCs, 0); spi_write_blocking(spi0, d8, 2); gpio_put(PinCs, 1); } uint PinCs = 0; uint PinDc = 0; uint PinRst = 0; uint PinSck = 0; uint PinSda = 0; };