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