sensor_main/include/tft.hpp
2025-06-12 10:04:45 +02:00

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;
};