#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; osDelay(10); rst = 0; osDelay(10); rst = 1; osDelay(10); LCD_WR_REG(0x01); //software reset osDelay(50); LCD_WR_REG(0x28); // display off //--------------------------------------------------------- // magic? LCD_WR_REG(0xcf); LCD_WR_Data(0x00); LCD_WR_Data(0x83); LCD_WR_Data(0x30); LCD_WR_REG(0xed); LCD_WR_Data(0x64); LCD_WR_Data(0x03); LCD_WR_Data(0x12); LCD_WR_Data(0x81); LCD_WR_REG(0xe8); LCD_WR_Data(0x85); LCD_WR_Data(0x01); LCD_WR_Data(0x79); LCD_WR_REG(0xcb); LCD_WR_Data(0x39); LCD_WR_Data(0x2c); LCD_WR_Data(0x00); LCD_WR_Data(0x34); LCD_WR_Data(0x02); LCD_WR_REG(0xf7); LCD_WR_Data(0x20); LCD_WR_REG(0xea); LCD_WR_Data(0x00); LCD_WR_Data(0x00); //------------power control------------------------------ LCD_WR_REG(0xc0); //power control LCD_WR_Data(0x26); LCD_WR_REG(0xc1); //power control LCD_WR_Data(0x11); //--------------VCOM LCD_WR_REG(0xc5); //vcom control LCD_WR_Data(0x35); //35 LCD_WR_Data(0x3e); //3E LCD_WR_REG(0xc7); //vcom control LCD_WR_Data(0xbe); // 0x94 //------------memory access control------------------------ LCD_WR_REG(0x36); // memory access control LCD_WR_Data(0xE8U); //Поворот экрана на 0 градусов // LCD_WR_Data(0x28U); //Поворот экрана на 180 градусов LCD_WR_REG(0x3a); // pixel format set LCD_WR_Data(0x55); //16bit /pixel //----------------- frame rate------------------------------ LCD_WR_REG(0xb1); // frame rate LCD_WR_Data(0x00U); LCD_WR_Data(0x1BU); //70 //----------------Gamma--------------------------------- LCD_WR_REG(0xf2); // 3Gamma Function Disable LCD_WR_Data(0x08); LCD_WR_REG(0x26); LCD_WR_Data(0x01); // gamma set 4 gamma curve 01/02/04/08 LCD_WR_REG(0xE0); //positive gamma correction LCD_WR_Data(0x1f); LCD_WR_Data(0x1a); LCD_WR_Data(0x18); LCD_WR_Data(0x0a); LCD_WR_Data(0x0f); LCD_WR_Data(0x06); LCD_WR_Data(0x45); LCD_WR_Data(0x87); LCD_WR_Data(0x32); LCD_WR_Data(0x0a); LCD_WR_Data(0x07); LCD_WR_Data(0x02); LCD_WR_Data(0x07); LCD_WR_Data(0x05); LCD_WR_Data(0x00); LCD_WR_REG(0xE1); //negamma correction LCD_WR_Data(0x00); LCD_WR_Data(0x25); LCD_WR_Data(0x27); LCD_WR_Data(0x05); LCD_WR_Data(0x10); LCD_WR_Data(0x09); LCD_WR_Data(0x3a); LCD_WR_Data(0x78); LCD_WR_Data(0x4d); LCD_WR_Data(0x05); LCD_WR_Data(0x18); LCD_WR_Data(0x0d); LCD_WR_Data(0x38); LCD_WR_Data(0x3a); LCD_WR_Data(0x1f); //--------------ddram --------------------- LCD_WR_REG(0x2a); // column set // size = 239 LCD_WR_Data(0x00); LCD_WR_Data(0x00); LCD_WR_Data(0x00); LCD_WR_Data(0xEF); LCD_WR_REG(0x2b); // page address set // size = 319 LCD_WR_Data(0x00); LCD_WR_Data(0x00); LCD_WR_Data(0x01); LCD_WR_Data(0x3F); // 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(0xb7); //entry mode set LCD_WR_Data(0x07); //-----------------display--------------------- LCD_WR_REG(0xb6); // display function control LCD_WR_Data(0x0a); LCD_WR_Data(0x82); LCD_WR_Data(0x27); LCD_WR_Data(0x00); LCD_WR_REG(0x11); //sleep out osDelay(100); LCD_WR_REG(0x29); // display on } void ILI9341::LCD_WR_Data(uint8_t Data) { dc = 1; dispPort.write(Data); } void ILI9341::LCD_WR_REG(uint8_t Reg) { dc = 0; dispPort.write(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(0x2A); LCD_WR_Data(x1 >> 8); LCD_WR_Data(x1); LCD_WR_Data(x2 >> 8); LCD_WR_Data(x2); LCD_WR_REG(0x2B); LCD_WR_Data(y1 >> 8); LCD_WR_Data(y1); LCD_WR_Data(y2 >> 8); LCD_WR_Data(y2); LCD_WR_REG(0x2C); //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); }