#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(Data)); } void ILI9341::LCD_WR_REG(uint8_t Reg) { dc = 0; (void)dispPort.write(static_cast(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(x1)); LCD_WR_Data(x2 >> 8U); LCD_WR_Data(static_cast(x2)); LCD_WR_REG(0x2BU); LCD_WR_Data(y1 >> 8U); LCD_WR_Data(static_cast(y1)); LCD_WR_Data(y2 >> 8U); LCD_WR_Data(static_cast(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(SPIx), hi << 8 | lo); n_bytes--; } dispPort.format(8, 3); }