Files
sunflower-picture-app/sound_picture_app/Display_ST7789.cpp

312 lines
7.9 KiB
C++

#include "Display_ST7789.h"
SPIClass LCDspi(FSPI);
#define SPI_WRITE(_dat) LCDspi.transfer(_dat)
#define SPI_WRITE_Word(_dat) LCDspi.transfer16(_dat)
void SPI_Init()
{
LCDspi.begin(EXAMPLE_PIN_NUM_SCLK,EXAMPLE_PIN_NUM_MISO,EXAMPLE_PIN_NUM_MOSI);
}
void LCD_WriteCommand(uint8_t Cmd)
{
LCDspi.beginTransaction(SPISettings(SPIFreq, MSBFIRST, SPI_MODE0));
digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, LOW);
digitalWrite(EXAMPLE_PIN_NUM_LCD_DC, LOW);
SPI_WRITE(Cmd);
digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, HIGH);
LCDspi.endTransaction();
}
void LCD_WriteData(uint8_t Data)
{
LCDspi.beginTransaction(SPISettings(SPIFreq, MSBFIRST, SPI_MODE0));
digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, LOW);
digitalWrite(EXAMPLE_PIN_NUM_LCD_DC, HIGH);
SPI_WRITE(Data);
digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, HIGH);
LCDspi.endTransaction();
}
void LCD_WriteData_Word(uint16_t Data)
{
LCDspi.beginTransaction(SPISettings(SPIFreq, MSBFIRST, SPI_MODE0));
digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, LOW);
digitalWrite(EXAMPLE_PIN_NUM_LCD_DC, HIGH);
SPI_WRITE_Word(Data);
digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, HIGH);
LCDspi.endTransaction();
}
void LCD_WriteData_nbyte(uint8_t* SetData,uint8_t* ReadData,uint32_t Size)
{
LCDspi.beginTransaction(SPISettings(SPIFreq, MSBFIRST, SPI_MODE0));
digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, LOW);
digitalWrite(EXAMPLE_PIN_NUM_LCD_DC, HIGH);
LCDspi.transferBytes(SetData, ReadData, Size);
digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, HIGH);
LCDspi.endTransaction();
}
void LCD_Reset(void)
{
digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, LOW);
delay(50);
digitalWrite(EXAMPLE_PIN_NUM_LCD_RST, LOW);
delay(50);
digitalWrite(EXAMPLE_PIN_NUM_LCD_RST, HIGH);
delay(50);
}
void LCD_Init(void)
{
pinMode(EXAMPLE_PIN_NUM_LCD_CS, OUTPUT);
pinMode(EXAMPLE_PIN_NUM_LCD_DC, OUTPUT);
pinMode(EXAMPLE_PIN_NUM_LCD_RST, OUTPUT);
Backlight_Init();
SPI_Init();
// Reset LCD
digitalWrite(EXAMPLE_PIN_NUM_LCD_RST, LOW);
delay(10);
digitalWrite(EXAMPLE_PIN_NUM_LCD_RST, HIGH);
delay(50);
//************* JD9853 Start Initial Sequence **********//
LCD_WriteCommand(0x11); // Sleep Out
delay(120);
LCD_WriteCommand(0xDF);
LCD_WriteData(0x98);
LCD_WriteData(0x53);
LCD_WriteCommand(0xB2);
LCD_WriteData(0x23);
LCD_WriteCommand(0xB7);
LCD_WriteData(0x00);
LCD_WriteData(0x47);
LCD_WriteData(0x00);
LCD_WriteData(0x6F);
LCD_WriteCommand(0xBB);
LCD_WriteData(0x1C);
LCD_WriteData(0x1A);
LCD_WriteData(0x55);
LCD_WriteData(0x73);
LCD_WriteData(0x63);
LCD_WriteData(0xF0);
LCD_WriteCommand(0xC0);
LCD_WriteData(0x44);
LCD_WriteData(0xA4);
LCD_WriteCommand(0xC1);
LCD_WriteData(0x16);
LCD_WriteCommand(0xC3);
LCD_WriteData(0x7D);
LCD_WriteData(0x07);
LCD_WriteData(0x14);
LCD_WriteData(0x06);
LCD_WriteData(0xCF);
LCD_WriteData(0x71);
LCD_WriteData(0x72);
LCD_WriteData(0x77);
LCD_WriteCommand(0xC4);
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteData(0xA0);
LCD_WriteData(0x79);
LCD_WriteData(0x0B);
LCD_WriteData(0x0A);
LCD_WriteData(0x16);
LCD_WriteData(0x79);
LCD_WriteData(0x0B);
LCD_WriteData(0x0A);
LCD_WriteData(0x16);
LCD_WriteData(0x82);
LCD_WriteCommand(0xC8);
const uint8_t c8_data[] = {
0x3F, 0x32, 0x29, 0x29, 0x27, 0x2B, 0x27, 0x28, 0x28, 0x26, 0x25, 0x17, 0x12, 0x0D, 0x04, 0x00,
0x3F, 0x32, 0x29, 0x29, 0x27, 0x2B, 0x27, 0x28, 0x28, 0x26, 0x25, 0x17, 0x12, 0x0D, 0x04, 0x00
};
for (int i = 0; i < 32; i++) {
LCD_WriteData(c8_data[i]);
}
LCD_WriteCommand(0xD0);
LCD_WriteData(0x04);
LCD_WriteData(0x06);
LCD_WriteData(0x6B);
LCD_WriteData(0x0F);
LCD_WriteData(0x00);
LCD_WriteCommand(0xD7);
LCD_WriteData(0x00);
LCD_WriteData(0x30);
LCD_WriteCommand(0xE6);
LCD_WriteData(0x14);
LCD_WriteCommand(0xDE);
LCD_WriteData(0x01);
LCD_WriteCommand(0xB7);
LCD_WriteData(0x03);
LCD_WriteData(0x13);
LCD_WriteData(0xEF);
LCD_WriteData(0x35);
LCD_WriteData(0x35);
LCD_WriteCommand(0xC1);
LCD_WriteData(0x14);
LCD_WriteData(0x15);
LCD_WriteData(0xC0);
LCD_WriteCommand(0xC2);
LCD_WriteData(0x06);
LCD_WriteData(0x3A);
LCD_WriteCommand(0xC4);
LCD_WriteData(0x72);
LCD_WriteData(0x12);
LCD_WriteCommand(0xBE);
LCD_WriteData(0x00);
LCD_WriteCommand(0xDE);
LCD_WriteData(0x02);
LCD_WriteCommand(0xE5);
LCD_WriteData(0x00);
LCD_WriteData(0x02);
LCD_WriteData(0x00);
LCD_WriteCommand(0xE5);
LCD_WriteData(0x01);
LCD_WriteData(0x02);
LCD_WriteData(0x00);
LCD_WriteCommand(0xDE);
LCD_WriteData(0x00);
LCD_WriteCommand(0x35);
LCD_WriteData(0x00);
LCD_WriteCommand(0x3A);
LCD_WriteData(0x05);
LCD_WriteCommand(0x2A);
LCD_WriteData(0x00);
LCD_WriteData(0x22);
LCD_WriteData(0x00);
LCD_WriteData(0xCD);
LCD_WriteCommand(0x2B);
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteData(0x01);
LCD_WriteData(0x3F);
LCD_WriteCommand(0xDE);
LCD_WriteData(0x02);
LCD_WriteCommand(0xE5);
LCD_WriteData(0x00);
LCD_WriteData(0x02);
LCD_WriteData(0x00);
LCD_WriteCommand(0xDE);
LCD_WriteData(0x00);
LCD_WriteCommand(0x36); // Rotation control
if (HORIZONTAL)
LCD_WriteData(0x00);
else
LCD_WriteData(0x70);
LCD_WriteCommand(0x21); // Display Inversion On
delay(10);
LCD_WriteCommand(0x29); // Display On
}
/******************************************************************************
function: Set the cursor position
parameter :
Xstart: Start uint16_t x coordinate
Ystart: Start uint16_t y coordinate
Xend : End uint16_t coordinates
Yend : End uint16_t coordinatesen
******************************************************************************/
void LCD_SetCursor(uint16_t Xstart, uint16_t Ystart, uint16_t Xend, uint16_t Yend)
{
if (HORIZONTAL) {
// set the X coordinates
LCD_WriteCommand(0x2A);
LCD_WriteData(Xstart >> 8);
LCD_WriteData(Xstart + Offset_X);
LCD_WriteData(Xend >> 8);
LCD_WriteData(Xend + Offset_X);
// set the Y coordinates
LCD_WriteCommand(0x2B);
LCD_WriteData(Ystart >> 8);
LCD_WriteData(Ystart + Offset_Y);
LCD_WriteData(Yend >> 8);
LCD_WriteData(Yend + Offset_Y);
}
else {
// set the X coordinates
LCD_WriteCommand(0x2A);
LCD_WriteData(Ystart >> 8);
LCD_WriteData(Ystart + Offset_Y);
LCD_WriteData(Yend >> 8);
LCD_WriteData(Yend + Offset_Y);
// set the Y coordinates
LCD_WriteCommand(0x2B);
LCD_WriteData(Xstart >> 8);
LCD_WriteData(Xstart + Offset_X);
LCD_WriteData(Xend >> 8);
LCD_WriteData(Xend + Offset_X);
}
LCD_WriteCommand(0x2C);
}
/******************************************************************************
function: Refresh the image in an area
parameter :
Xstart: Start uint16_t x coordinate
Ystart: Start uint16_t y coordinate
Xend : End uint16_t coordinates
Yend : End uint16_t coordinates
color : Set the color
******************************************************************************/
void LCD_addWindow(uint16_t Xstart, uint16_t Ystart, uint16_t Xend, uint16_t Yend, uint16_t* color)
{
uint16_t Show_Width = Xend - Xstart + 1;
uint16_t Show_Height = Yend - Ystart + 1;
uint32_t numBytes = Show_Width * Show_Height * sizeof(uint16_t);
LCD_SetCursor(Xstart, Ystart, Xend, Yend);
LCDspi.beginTransaction(SPISettings(SPIFreq, MSBFIRST, SPI_MODE0));
digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, LOW);
digitalWrite(EXAMPLE_PIN_NUM_LCD_DC, HIGH);
LCDspi.writeBytes((uint8_t*)color, numBytes);
digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, HIGH);
LCDspi.endTransaction();
}
// backlight
void Backlight_Init(void)
{
pinMode(EXAMPLE_PIN_NUM_BK_LIGHT, OUTPUT);
digitalWrite(EXAMPLE_PIN_NUM_BK_LIGHT, HIGH); // Set backlight to full brightness
}
void Set_Backlight(uint8_t Light) //
{
pinMode(EXAMPLE_PIN_NUM_BK_LIGHT, OUTPUT);
if (Light > 0) {
digitalWrite(EXAMPLE_PIN_NUM_BK_LIGHT, HIGH);
} else {
digitalWrite(EXAMPLE_PIN_NUM_BK_LIGHT, LOW);
}
}