147 lines
3.1 KiB
C++
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);
|
|
}
|