narf52/src/st7789.cc
2020-03-29 23:42:19 +02:00

147 lines
3.1 KiB
C++

#include <cstdint>
#include "delay.h"
#include "st7789.h"
St7789::St7789(interfaces::SpiInterface & spi_if,
interfaces::GpioInterface & rst,
interfaces::GpioInterface & dc,
interfaces::GpioInterface & bl)
: spi(spi_if)
, reset(rst)
, data_command(dc)
, backlight(bl)
{
this->reset.set();
this->data_command.set();
this->backlight.set();
// hard reset
this->reset.clear();
delay_ms(100);
this->reset.set();
delay_ms(100);
}
void St7789::init()
{
send_cmd(0x36);
send_data(0x00);
send_cmd(0x3A);
send_data(0x05);
send_cmd(0xB2);
send_data(0x0C);
send_data(0x0C);
send_data(0x00);
send_data(0x33);
send_data(0x33);
send_cmd(0xB7); //Gate Control
send_data(0x35);
send_cmd(0xBB); //VCOM Setting
send_data(0x19);
send_cmd(0xC0); //LCM Control
send_data(0x2C);
send_cmd(0xC2); //VDV and VRH Command Enable
send_data(0x01);
send_cmd(0xC3); //VRH Set
send_data(0x12);
send_cmd(0xC4); //VDV Set
send_data(0x20);
send_cmd(0xC6); //Frame Rate Control in Normal Mode
send_data(0x0F);
send_cmd(0xD0); // Power Control 1
send_data(0xA4);
send_data(0xA1);
send_cmd(0xE0); //Positive Voltage Gamma Control
send_data(0xD0);
send_data(0x04);
send_data(0x0D);
send_data(0x11);
send_data(0x13);
send_data(0x2B);
send_data(0x3F);
send_data(0x54);
send_data(0x4C);
send_data(0x18);
send_data(0x0D);
send_data(0x0B);
send_data(0x1F);
send_data(0x23);
send_cmd(0xE1); //Negative Voltage Gamma Control
send_data(0xD0);
send_data(0x04);
send_data(0x0C);
send_data(0x11);
send_data(0x13);
send_data(0x2C);
send_data(0x3F);
send_data(0x44);
send_data(0x51);
send_data(0x2F);
send_data(0x1F);
send_data(0x1F);
send_data(0x20);
send_data(0x23);
send_cmd(0x21); //Display Inversion On
send_cmd(0x11); //Sleep Out
send_cmd(0x29); //Display On
}
void St7789::send_cmd(uint8_t cmd)
{
this->data_command.clear();
this->spi.send(&cmd, 1);
}
void St7789::send_data(uint8_t data)
{
this->data_command.set();
this->spi.send(&data, 1);
}
void St7789::clear(uint16_t Color)
{
unsigned int i,j;
set_windows(0, 0, 240, 240);
this->data_command.set();
for(i = 0; i < 240; i++) {
for(j = 0; j < 240; j++){
uint8_t c = (Color >> 8) & 0xff;
this->spi.send(&c, 1);
c = Color & 0xff;
this->spi.send(&c, 1);
}
}
}
void St7789::set_windows(uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end)
{
//set the X coordinates
send_cmd(0x2A);
send_data((x_start >> 8) & 0xFF);
send_data(x_start & 0xFF);
send_data(((x_end - 1) >> 8) & 0xFF);
send_data((x_end - 1) & 0xFF);
//set the Y coordinates
send_cmd(0x2B);
send_data((y_start >> 8) & 0xFF);
send_data(y_start & 0xFF);
send_data(((y_end - 1) >> 8) & 0xFF);
send_data((y_end - 1) & 0xFF);
send_cmd(0X2C);
}