197 lines
5.3 KiB
C++
197 lines
5.3 KiB
C++
#include "ili9341.h"
|
|
|
|
#include "stm32f7xx_ll_spi.h"
|
|
|
|
ILI9341::ILI9341(PinName MOSI, PinName MISO, PinName SCK, PinName DC, PinName RST)
|
|
: dispPort(MOSI, MISO, SCK), rst(RST), dc(DC) {
|
|
// dispPort = new SPI(MOSI, MISO, SCK);
|
|
dispPort.frequency(27000000);
|
|
dispPort.format(8, 3);
|
|
SPIx = spi_get_peripheral_name(MOSI, MISO, SCK);
|
|
|
|
rst = 1;
|
|
|
|
ThisThread::sleep_for(10ms);
|
|
// (void)osDelay(10);
|
|
rst = 0;
|
|
ThisThread::sleep_for(10ms);
|
|
// osDelay(10);
|
|
rst = 1;
|
|
ThisThread::sleep_for(10ms);
|
|
// osDelay(10);
|
|
|
|
LCD_WR_REG(0x01U); //software reset
|
|
ThisThread::sleep_for(50ms);
|
|
// osDelay(50);
|
|
LCD_WR_REG(0x28U);
|
|
// display off
|
|
//---------------------------------------------------------
|
|
// magic?
|
|
LCD_WR_REG(0xcfU);
|
|
LCD_WR_Data(0x00U);
|
|
LCD_WR_Data(0x83U);
|
|
LCD_WR_Data(0x30U);
|
|
|
|
LCD_WR_REG(0xedU);
|
|
LCD_WR_Data(0x64U);
|
|
LCD_WR_Data(0x03U);
|
|
LCD_WR_Data(0x12U);
|
|
LCD_WR_Data(0x81U);
|
|
LCD_WR_REG(0xe8U);
|
|
LCD_WR_Data(0x85U);
|
|
LCD_WR_Data(0x01U);
|
|
LCD_WR_Data(0x79U);
|
|
LCD_WR_REG(0xcbU);
|
|
LCD_WR_Data(0x39U);
|
|
LCD_WR_Data(0x2cU);
|
|
LCD_WR_Data(0x00U);
|
|
LCD_WR_Data(0x34U);
|
|
LCD_WR_Data(0x02U);
|
|
LCD_WR_REG(0xf7U);
|
|
LCD_WR_Data(0x20U);
|
|
LCD_WR_REG(0xeaU);
|
|
LCD_WR_Data(0x00U);
|
|
LCD_WR_Data(0x00U);
|
|
//------------power control------------------------------
|
|
LCD_WR_REG(0xc0U); //power control
|
|
LCD_WR_Data(0x26U);
|
|
LCD_WR_REG(0xc1U); //power control
|
|
LCD_WR_Data(0x11U);
|
|
//--------------VCOM
|
|
LCD_WR_REG(0xc5U); //vcom control
|
|
LCD_WR_Data(0x35U); //35
|
|
LCD_WR_Data(0x3eU); //3E
|
|
LCD_WR_REG(0xc7U); //vcom control
|
|
LCD_WR_Data(0xbeU); // 0x94
|
|
//------------memory access control------------------------
|
|
LCD_WR_REG(0x36U);
|
|
// memory access control
|
|
LCD_WR_Data(0xE8U); //Поворот экрана на 0 градусов
|
|
// LCD_WR_Data(0x28U); //Поворот экрана на 180 градусов
|
|
LCD_WR_REG(0x3aU); // pixel format set
|
|
LCD_WR_Data(0x55U); //16bit /pixel
|
|
|
|
//----------------- frame rate------------------------------
|
|
LCD_WR_REG(0xb1U);
|
|
// frame rate
|
|
LCD_WR_Data(0x00U);
|
|
LCD_WR_Data(0x1BU); //70
|
|
//----------------Gamma---------------------------------
|
|
LCD_WR_REG(0xf2U); // 3Gamma Function Disable
|
|
LCD_WR_Data(0x08U);
|
|
LCD_WR_REG(0x26U);
|
|
LCD_WR_Data(0x01U); // gamma set 4 gamma curve 01/02/04/08
|
|
|
|
LCD_WR_REG(0xE0U); //positive gamma correction
|
|
LCD_WR_Data(0x1fU);
|
|
LCD_WR_Data(0x1aU);
|
|
LCD_WR_Data(0x18U);
|
|
LCD_WR_Data(0x0aU);
|
|
LCD_WR_Data(0x0fU);
|
|
LCD_WR_Data(0x06U);
|
|
LCD_WR_Data(0x45U);
|
|
LCD_WR_Data(0x87U);
|
|
LCD_WR_Data(0x32U);
|
|
LCD_WR_Data(0x0aU);
|
|
LCD_WR_Data(0x07U);
|
|
LCD_WR_Data(0x02U);
|
|
LCD_WR_Data(0x07U);
|
|
LCD_WR_Data(0x05U);
|
|
LCD_WR_Data(0x00U);
|
|
LCD_WR_REG(0xE1U); //negamma correction
|
|
LCD_WR_Data(0x00U);
|
|
LCD_WR_Data(0x25U);
|
|
LCD_WR_Data(0x27U);
|
|
LCD_WR_Data(0x05U);
|
|
LCD_WR_Data(0x10U);
|
|
LCD_WR_Data(0x09U);
|
|
LCD_WR_Data(0x3aU);
|
|
LCD_WR_Data(0x78U);
|
|
LCD_WR_Data(0x4dU);
|
|
LCD_WR_Data(0x05U);
|
|
LCD_WR_Data(0x18U);
|
|
LCD_WR_Data(0x0dU);
|
|
LCD_WR_Data(0x38U);
|
|
LCD_WR_Data(0x3aU);
|
|
LCD_WR_Data(0x1fU);
|
|
//--------------ddram ---------------------
|
|
LCD_WR_REG(0x2aU);
|
|
// column set
|
|
// size = 239
|
|
LCD_WR_Data(0x00U);
|
|
LCD_WR_Data(0x00U);
|
|
LCD_WR_Data(0x00U);
|
|
LCD_WR_Data(0xEFU);
|
|
LCD_WR_REG(0x2bU);
|
|
// page address set
|
|
// size = 319
|
|
LCD_WR_Data(0x00U);
|
|
LCD_WR_Data(0x00U);
|
|
LCD_WR_Data(0x01U);
|
|
LCD_WR_Data(0x3FU);
|
|
// LCD_WR_REG(0x34);
|
|
//LCD_WR_REG(0x35);
|
|
// tearing effect off
|
|
// tearing effect on
|
|
// LCD_WR_REG(0xb4); // display inversion
|
|
// LCD_WR_Data(0x00);
|
|
LCD_WR_REG(0xb7U); //entry mode set
|
|
LCD_WR_Data(0x07U);
|
|
//-----------------display---------------------
|
|
LCD_WR_REG(0xb6U);
|
|
// display function control
|
|
LCD_WR_Data(0x0aU);
|
|
LCD_WR_Data(0x82U);
|
|
LCD_WR_Data(0x27U);
|
|
LCD_WR_Data(0x00U);
|
|
LCD_WR_REG(0x11U); //sleep out
|
|
ThisThread::sleep_for(100ms);
|
|
LCD_WR_REG(0x29U); // display on
|
|
}
|
|
|
|
void ILI9341::LCD_WR_Data(uint8_t Data) {
|
|
dc = 1;
|
|
(void)dispPort.write(static_cast<int>(Data));
|
|
}
|
|
|
|
void ILI9341::LCD_WR_REG(uint8_t Reg) {
|
|
dc = 0;
|
|
(void)dispPort.write(static_cast<int>(Reg));
|
|
}
|
|
|
|
void
|
|
ILI9341::LCD_setaddress(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) //set coordinate for print or other function
|
|
{
|
|
LCD_WR_REG(0x2AU);
|
|
LCD_WR_Data(x1 >> 8U);
|
|
LCD_WR_Data(static_cast<uint8_t>(x1));
|
|
LCD_WR_Data(x2 >> 8U);
|
|
LCD_WR_Data(static_cast<uint8_t>(x2));
|
|
|
|
LCD_WR_REG(0x2BU);
|
|
LCD_WR_Data(y1 >> 8U);
|
|
LCD_WR_Data(static_cast<uint8_t>(y1));
|
|
LCD_WR_Data(y2 >> 8U);
|
|
LCD_WR_Data(static_cast<uint8_t>(y2));
|
|
|
|
LCD_WR_REG(0x2CU); //memory write
|
|
}
|
|
|
|
void ILI9341::transmitData(const uint8_t *pixels, uint16_t x, uint16_t y, uint16_t w, uint16_t h) {
|
|
uint32_t n_bytes = w * h;
|
|
|
|
LCD_setaddress(x, y, x + w - 1U, y + h - 1U);
|
|
dc = 1;
|
|
dispPort.format(16, 3);
|
|
while (n_bytes) {
|
|
uint8_t lo = *pixels++;
|
|
uint8_t hi = *pixels++;
|
|
while (!LL_SPI_IsActiveFlag_TXE(SPI1)) {
|
|
}
|
|
LL_SPI_TransmitData16(reinterpret_cast<SPI_TypeDef *>(SPIx), hi << 8 | lo);
|
|
|
|
n_bytes--;
|
|
}
|
|
dispPort.format(8, 3);
|
|
}
|