216 lines
4.5 KiB
C++
216 lines
4.5 KiB
C++
#pragma once
|
|
|
|
extern "C" {
|
|
#include <hardware/spi.h>
|
|
#include <pico/stdlib.h>
|
|
}
|
|
|
|
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;
|
|
}; |