【ESP32+LVGL】1.69寸ST7789+CST816触摸屏之Vscode+platformio开发例程搭建移植
文章目录
所需组件
- ESP32开发板(本文以乐鑫系列ESP32-WROOM-32U为例,基本espressif系列的ESP32都行)
- ST7789+CST816驱动的触摸屏(这里以中景园1.69寸240*280的触摸屏为例)
- Vscode+platformio插件
- 触摸屏转接板(最好有,比较方便接线,直接连线问题应该也不大)
一、工程搭建
在Vscode下,使用platformio插件新建一个工程项目,选择espressif ESP32
查看工程配置,如下则说明配置正确
二、库添加
利用platformio插件,分别搜索lvgl,TFT_eSPI和CST816S库,并把它们添加到新建好的工程中
添加lvgl库
添加TFT_eSPI库
添加CST816S库
三、引脚配置
在TFT_eSPI库下找到User_Setup.h文件并对其进行对应的修改
修改前,代码如下:
// USER DEFINED SETTINGS// Set driver type, fonts to be loaded, pins used and SPI control method etc//// See the User_Setup_Select.h file if you wish to be able to define multiple// setups and then easily select which setup file is used by the compiler.//// If this file is edited correctly then all the library example sketches should// run without the need to make any more changes for a particular hardware setup!// Note that some sketches are designed for a particular TFT pixel width/height// User defined information reported by "Read_User_Setup" test & diagnostics example#defineUSER_SETUP_INFO"User_Setup"// Define to disable all #warnings in library (can be put in User_Setup_Select.h)//#define DISABLE_ALL_LIBRARY_WARNINGS// ##################################################################################//// Section 1. Call up the right driver file and any options for it//// ##################################################################################// Define STM32 to invoke optimised processor support (only for STM32)//#define STM32// Defining the STM32 board allows the library to optimise the performance// for UNO compatible "MCUfriend" style shields//#define NUCLEO_64_TFT//#define NUCLEO_144_TFT// STM32 8 bit parallel only:// If STN32 Port A or B pins 0-7 are used for 8 bit parallel data bus bits 0-7// then this will improve rendering performance by a factor of ~8x//#define STM_PORTA_DATA_BUS//#define STM_PORTB_DATA_BUS// Tell the library to use parallel mode (otherwise SPI is assumed)//#define TFT_PARALLEL_8_BIT//#defined TFT_PARALLEL_16_BIT // **** 16 bit parallel ONLY for RP2040 processor ****// Display type - only define if RPi display//#define RPI_DISPLAY_TYPE // 20MHz maximum SPI// Only define one driver, the other ones must be commented out#defineILI9341_DRIVER// Generic driver for common displays//#define ILI9341_2_DRIVER // Alternative ILI9341 driver, see https://github.com/Bodmer/TFT_eSPI/issues/1172//#define ST7735_DRIVER // Define additional parameters below for this display//#define ILI9163_DRIVER // Define additional parameters below for this display//#define S6D02A1_DRIVER//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI//#define HX8357D_DRIVER//#define ILI9481_DRIVER//#define ILI9486_DRIVER//#define ILI9488_DRIVER // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high)//#define ST7789_DRIVER // Full configuration option, define additional parameters below for this display//#define ST7789_2_DRIVER // Minimal configuration option, define additional parameters below for this display//#define R61581_DRIVER//#define RM68140_DRIVER//#define ST7796_DRIVER//#define SSD1351_DRIVER//#define SSD1963_480_DRIVER//#define SSD1963_800_DRIVER//#define SSD1963_800ALT_DRIVER//#define ILI9225_DRIVER//#define GC9A01_DRIVER// Some displays support SPI reads via the MISO pin, other displays have a single// bi-directional SDA pin and the library will try to read this via the MOSI line.// To use the SDA line for reading data from the TFT uncomment the following line:// #define TFT_SDA_READ // This option is for ESP32 ONLY, tested with ST7789 and GC9A01 display only// For ST7735, ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display// Try ONE option at a time to find the correct colour order for your display// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red// For M5Stack ESP32 module with integrated ILI9341 display ONLY, remove // in line below// #define M5STACK// For ST7789, ST7735, ILI9163 and GC9A01 ONLY, define the pixel width and height in portrait orientation// #define TFT_WIDTH 80// #define TFT_WIDTH 128// #define TFT_WIDTH 172 // ST7789 172 x 320// #define TFT_WIDTH 170 // ST7789 170 x 320// #define TFT_WIDTH 240 // ST7789 240 x 240 and 240 x 320// #define TFT_HEIGHT 160// #define TFT_HEIGHT 128// #define TFT_HEIGHT 240 // ST7789 240 x 240// #define TFT_HEIGHT 320 // ST7789 240 x 320// #define TFT_HEIGHT 240 // GC9A01 240 x 240// For ST7735 ONLY, define the type of display, originally this was based on the// colour of the tab on the screen protector film but this is not always true, so try// out the different options below if the screen does not display graphics correctly,// e.g. colours wrong, mirror images, or stray pixels at the edges.// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this// this User_Setup file, then rebuild and upload the sketch to the board again:// #define ST7735_INITB// #define ST7735_GREENTAB// #define ST7735_GREENTAB2// #define ST7735_GREENTAB3// #define ST7735_GREENTAB128 // For 128 x 128 display// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset)// #define ST7735_ROBOTLCD // For some RobotLCD arduino shields (128x160, BGR, https://docs.arduino.cc/retired/getting-started-guides/TFT)// #define ST7735_REDTAB// #define ST7735_BLACKTAB// #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset// If colours are inverted (white shows as black) then uncomment one of the next// 2 lines try both options, one of the options should correct the inversion.// #define TFT_INVERSION_ON// #define TFT_INVERSION_OFF// ##################################################################################//// Section 2. Define the pins that are used to interface with the display here//// ##################################################################################// If a backlight control signal is available then define the TFT_BL pin in Section 2// below. The backlight will be turned ON when tft.begin() is called, but the library// needs to know if the LEDs are ON with the pin HIGH or LOW. If the LEDs are to be// driven with a PWM signal or turned OFF/ON then this must be handled by the user// sketch. e.g. with digitalWrite(TFT_BL, LOW);// #define TFT_BL 32 // LED back-light control pin// #define TFT_BACKLIGHT_ON HIGH // Level to turn ON back-light (HIGH or LOW)// We must use hardware SPI, a minimum of 3 GPIO pins is needed.// Typical setup for ESP8266 NodeMCU ESP-12 is ://// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT)// Display LED to NodeMCU pin VIN (or 5V, see below)// Display SCK to NodeMCU pin D5// Display SDI/MOSI to NodeMCU pin D7// Display DC (RS/AO)to NodeMCU pin D3// Display RESET to NodeMCU pin D4 (or RST, see below)// Display CS to NodeMCU pin D8 (or GND, see below)// Display GND to NodeMCU pin GND (0V)// Display VCC to NodeMCU 5V or 3.3V//// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin//// The DC (Data Command) pin may be labelled AO or RS (Register Select)//// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more// SPI devices (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected.//// The NodeMCU D0 pin can be used for RST////// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin// If 5V is not available at a pin you can use 3.3V but backlight brightness// will be lower.// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP8266 SETUP ######// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation#defineTFT_MISOPIN_D6 // Automatically assigned with ESP8266 if not defined#defineTFT_MOSIPIN_D7 // Automatically assigned with ESP8266 if not defined#defineTFT_SCLKPIN_D5 // Automatically assigned with ESP8266 if not defined#defineTFT_CSPIN_D8 // Chip select control pin D8#defineTFT_DCPIN_D3 // Data Command control pin#defineTFT_RSTPIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V//#define TFT_BL PIN_D1 // LED back-light (only for ST7789 with backlight control pin)//#define TOUCH_CS PIN_D2 // Chip select pin (T_CS) of touch screen//#define TFT_WR PIN_D2 // Write strobe for modified Raspberry Pi TFT only// ###### FOR ESP8266 OVERLAP MODE EDIT THE PIN NUMBERS IN THE FOLLOWING LINES ######// Overlap mode shares the ESP8266 FLASH SPI bus with the TFT so has a performance impact// but saves pins for other functions. It is best not to connect MISO as some displays// do not tristate that line when chip select is high!// Note: Only one SPI device can share the FLASH SPI lines, so a SPI touch controller// cannot be connected as well to the same SPI signals.// On NodeMCU 1.0 SD0=MISO, SD1=MOSI, CLK=SCLK to connect to TFT in overlap mode// On NodeMCU V3 S0 =MISO, S1 =MOSI, S2 =SCLK// In ESP8266 overlap mode the following must be defined//#define TFT_SPI_OVERLAP// In ESP8266 overlap mode the TFT chip select MUST connect to pin D3//#define TFT_CS PIN_D3//#define TFT_DC PIN_D5 // Data Command control pin//#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP ######// For ESP32 Dev board (only tested with ILI9341 display)// The hardware SPI can be mapped to any pins//#define TFT_MISO 19//#define TFT_MOSI 23//#define TFT_SCLK 18//#define TFT_CS 15 // Chip select control pin//#define TFT_DC 2 // Data Command control pin//#define TFT_RST 4 // Reset pin (could connect to RST pin)//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST// For ESP32 Dev board (only tested with GC9A01 display)// The hardware SPI can be mapped to any pins//#define TFT_MOSI 15 // In some display driver board, it might be written as "SDA" and so on.//#define TFT_SCLK 14//#define TFT_CS 5 // Chip select control pin//#define TFT_DC 27 // Data Command control pin//#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin)//#define TFT_BL 22 // LED back-light//#define TOUCH_CS 21 // Chip select pin (T_CS) of touch screen//#define TFT_WR 22 // Write strobe for modified Raspberry Pi TFT only// For the M5Stack module use these #define lines//#define TFT_MISO 19//#define TFT_MOSI 23//#define TFT_SCLK 18//#define TFT_CS 14 // Chip select control pin//#define TFT_DC 27 // Data Command control pin//#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin)//#define TFT_BL 32 // LED back-light (required for M5Stack)// ###### EDIT THE PINs BELOW TO SUIT YOUR ESP32 PARALLEL TFT SETUP ######// The library supports 8 bit parallel TFTs with the ESP32, the pin// selection below is compatible with ESP32 boards in UNO format.// Wemos D32 boards need to be modified, see diagram in Tools folder.// Only ILI9481 and ILI9341 based displays have been tested!// Parallel bus is only supported for the STM32 and ESP32// Example below is for ESP32 Parallel interface with UNO displays// Tell the library to use 8 bit parallel mode (otherwise SPI is assumed)//#define TFT_PARALLEL_8_BIT// The ESP32 and TFT the pins used for testing are://#define TFT_CS 33 // Chip select control pin (library pulls permanently low//#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31//#define TFT_RST 32 // Reset pin, toggles on startup//#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31//#define TFT_RD 2 // Read strobe control pin//#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus//#define TFT_D1 13 // so a single register write sets/clears all bits.//#define TFT_D2 26 // Pins can be randomly assigned, this does not affect//#define TFT_D3 25 // TFT screen update performance.//#define TFT_D4 17//#define TFT_D5 16//#define TFT_D6 27//#define TFT_D7 14// ###### EDIT THE PINs BELOW TO SUIT YOUR STM32 SPI TFT SETUP ######// The TFT can be connected to SPI port 1 or 2//#define TFT_SPI_PORT 1 // SPI port 1 maximum clock rate is 55MHz//#define TFT_MOSI PA7//#define TFT_MISO PA6//#define TFT_SCLK PA5//#define TFT_SPI_PORT 2 // SPI port 2 maximum clock rate is 27MHz//#define TFT_MOSI PB15//#define TFT_MISO PB14//#define TFT_SCLK PB13// Can use Ardiuno pin references, arbitrary allocation, TFT_eSPI controls chip select//#define TFT_CS D5 // Chip select control pin to TFT CS//#define TFT_DC D6 // Data Command control pin to TFT DC (may be labelled RS = Register Select)//#define TFT_RST D7 // Reset pin to TFT RST (or RESET)// OR alternatively, we can use STM32 port reference names PXnn//#define TFT_CS PE11 // Nucleo-F767ZI equivalent of D5//#define TFT_DC PE9 // Nucleo-F767ZI equivalent of D6//#define TFT_RST PF13 // Nucleo-F767ZI equivalent of D7//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to processor reset// Use an Arduino pin for initial testing as connecting to processor reset// may not work (pulse too short at power up?)// ##################################################################################//// Section 3. Define the fonts that are to be used here//// ##################################################################################// Comment out the #defines below with // to stop that font being loaded// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not// normally necessary. If all fonts are loaded the extra FLASH space required is// about 17Kbytes. To save FLASH space only enable the fonts you need!#defineLOAD_GLCD// Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH#defineLOAD_FONT2// Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters#defineLOAD_FONT4// Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters#defineLOAD_FONT6// Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm#defineLOAD_FONT7// Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.#defineLOAD_FONT8// Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT#defineLOAD_GFXFF// FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded// this will save ~20kbytes of FLASH#defineSMOOTH_FONT// ##################################################################################//// Section 4. Other options//// ##################################################################################// For RP2040 processor and SPI displays, uncomment the following line to use the PIO interface.//#define RP2040_PIO_SPI // Leave commented out to use standard RP2040 SPI port interface// For RP2040 processor and 8 or 16 bit parallel displays:// The parallel interface write cycle period is derived from a division of the CPU clock// speed so scales with the processor clock. This means that the divider ratio may need// to be increased when overclocking. It may also need to be adjusted dependant on the// display controller type (ILI94341, HX8357C etc). If RP2040_PIO_CLK_DIV is not defined// the library will set default values which may not suit your display.// The display controller data sheet will specify the minimum write cycle period. The// controllers often work reliably for shorter periods, however if the period is too short// the display may not initialise or graphics will become corrupted.// PIO write cycle frequency = (CPU clock/(4 * RP2040_PIO_CLK_DIV))//#define RP2040_PIO_CLK_DIV 1 // 32ns write cycle at 125MHz CPU clock//#define RP2040_PIO_CLK_DIV 2 // 64ns write cycle at 125MHz CPU clock//#define RP2040_PIO_CLK_DIV 3 // 96ns write cycle at 125MHz CPU clock// For the RP2040 processor define the SPI port channel used (default 0 if undefined)//#define TFT_SPI_PORT 1 // Set to 0 if SPI0 pins are used, or 1 if spi1 pins used// For the STM32 processor define the SPI port channel used (default 1 if undefined)//#define TFT_SPI_PORT 2 // Set to 1 for SPI port 1, or 2 for SPI port 2// Define the SPI clock frequency, this affects the graphics rendering speed. Too// fast and the TFT driver will not keep up and display corruption appears.// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)// With an ILI9163 display 27 MHz works OK.// #define SPI_FREQUENCY 1000000// #define SPI_FREQUENCY 5000000// #define SPI_FREQUENCY 10000000// #define SPI_FREQUENCY 20000000#defineSPI_FREQUENCY27000000// #define SPI_FREQUENCY 40000000// #define SPI_FREQUENCY 55000000 // STM32 SPI1 only (SPI2 maximum is 27MHz)// #define SPI_FREQUENCY 80000000// Optional reduced SPI frequency for reading TFT#defineSPI_READ_FREQUENCY20000000// The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here:#defineSPI_TOUCH_FREQUENCY2500000// The ESP32 has 2 free SPI ports i.e. VSPI and HSPI, the VSPI is the default.// If the VSPI port is in use and pins are not accessible (e.g. TTGO T-Beam)// then uncomment the following line://#define USE_HSPI_PORT// Comment out the following #define if "SPI Transactions" do not need to be// supported. When commented out the code size will be smaller and sketches will// run slightly faster, so leave it commented out unless you need it!// Transaction support is needed to work with SD library but not needed with TFT_SdFat// Transaction support is required if other SPI devices are connected.// Transactions are automatically enabled by the library for an ESP32 (to use HAL mutex)// so changing it here has no effect// #define SUPPORT_TRANSACTIONS
修改后,代码如下:
// USER DEFINED SETTINGS// Set driver type, fonts to be loaded, pins used and SPI control method etc//// See the User_Setup_Select.h file if you wish to be able to define multiple// setups and then easily select which setup file is used by the compiler.//// If this file is edited correctly then all the library example sketches should// run without the need to make any more changes for a particular hardware setup!// Note that some sketches are designed for a particular TFT pixel width/height// User defined information reported by "Read_User_Setup" test & diagnostics example#defineUSER_SETUP_INFO"User_Setup"// Define to disable all #warnings in library (can be put in User_Setup_Select.h)//#define DISABLE_ALL_LIBRARY_WARNINGS// ##################################################################################//// Section 1. Call up the right driver file and any options for it//// ##################################################################################// Define STM32 to invoke optimised processor support (only for STM32)//#define STM32// Defining the STM32 board allows the library to optimise the performance// for UNO compatible "MCUfriend" style shields//#define NUCLEO_64_TFT//#define NUCLEO_144_TFT// STM32 8 bit parallel only:// If STN32 Port A or B pins 0-7 are used for 8 bit parallel data bus bits 0-7// then this will improve rendering performance by a factor of ~8x//#define STM_PORTA_DATA_BUS//#define STM_PORTB_DATA_BUS// Tell the library to use parallel mode (otherwise SPI is assumed)//#define TFT_PARALLEL_8_BIT//#defined TFT_PARALLEL_16_BIT // **** 16 bit parallel ONLY for RP2040 processor ****// Display type - only define if RPi display//#define RPI_DISPLAY_TYPE // 20MHz maximum SPI// Only define one driver, the other ones must be commented out//#define ILI9341_DRIVER // Generic driver for common displays//#define ILI9341_2_DRIVER // Alternative ILI9341 driver, see https://github.com/Bodmer/TFT_eSPI/issues/1172//#define ST7735_DRIVER // Define additional parameters below for this display//#define ILI9163_DRIVER // Define additional parameters below for this display//#define S6D02A1_DRIVER//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI//#define HX8357D_DRIVER//#define ILI9481_DRIVER//#define ILI9486_DRIVER//#define ILI9488_DRIVER // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high)#defineST7789_DRIVER// Full configuration option, define additional parameters below for this display//#define ST7789_2_DRIVER // Minimal configuration option, define additional parameters below for this display//#define R61581_DRIVER//#define RM68140_DRIVER//#define ST7796_DRIVER//#define SSD1351_DRIVER//#define SSD1963_480_DRIVER//#define SSD1963_800_DRIVER//#define SSD1963_800ALT_DRIVER//#define ILI9225_DRIVER//#define GC9A01_DRIVER// Some displays support SPI reads via the MISO pin, other displays have a single// bi-directional SDA pin and the library will try to read this via the MOSI line.// To use the SDA line for reading data from the TFT uncomment the following line:#defineTFT_SDA_READ// This option is for ESP32 ONLY, tested with ST7789 and GC9A01 display only// For ST7735, ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display// Try ONE option at a time to find the correct colour order for your display#defineTFT_RGB_ORDERTFT_RGB // Colour order Red-Green-Blue// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red// For M5Stack ESP32 module with integrated ILI9341 display ONLY, remove // in line below// #define M5STACK// For ST7789, ST7735, ILI9163 and GC9A01 ONLY, define the pixel width and height in portrait orientation// #define TFT_WIDTH 80// #define TFT_WIDTH 128// #define TFT_WIDTH 172 // ST7789 172 x 320// #define TFT_WIDTH 170 // ST7789 170 x 320#defineTFT_WIDTH240// ST7789 240 x 240 and 240 x 320// #define TFT_HEIGHT 160// #define TFT_HEIGHT 128#defineTFT_HEIGHT280// ST7789 240 x 240// #define TFT_HEIGHT 320 // ST7789 240 x 320// #define TFT_HEIGHT 240 // GC9A01 240 x 240// For ST7735 ONLY, define the type of display, originally this was based on the// colour of the tab on the screen protector film but this is not always true, so try// out the different options below if the screen does not display graphics correctly,// e.g. colours wrong, mirror images, or stray pixels at the edges.// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this// this User_Setup file, then rebuild and upload the sketch to the board again:// #define ST7735_INITB// #define ST7735_GREENTAB// #define ST7735_GREENTAB2// #define ST7735_GREENTAB3// #define ST7735_GREENTAB128 // For 128 x 128 display// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset)// #define ST7735_ROBOTLCD // For some RobotLCD arduino shields (128x160, BGR, https://docs.arduino.cc/retired/getting-started-guides/TFT)// #define ST7735_REDTAB// #define ST7735_BLACKTAB// #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset// If colours are inverted (white shows as black) then uncomment one of the next// 2 lines try both options, one of the options should correct the inversion.// #define TFT_INVERSION_ON// #define TFT_INVERSION_OFF// ##################################################################################//// Section 2. Define the pins that are used to interface with the display here//// ##################################################################################// If a backlight control signal is available then define the TFT_BL pin in Section 2// below. The backlight will be turned ON when tft.begin() is called, but the library// needs to know if the LEDs are ON with the pin HIGH or LOW. If the LEDs are to be// driven with a PWM signal or turned OFF/ON then this must be handled by the user// sketch. e.g. with digitalWrite(TFT_BL, LOW);// #define TFT_BL 32 // LED back-light control pin// #define TFT_BACKLIGHT_ON HIGH // Level to turn ON back-light (HIGH or LOW)// We must use hardware SPI, a minimum of 3 GPIO pins is needed.// Typical setup for ESP8266 NodeMCU ESP-12 is ://// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT)// Display LED to NodeMCU pin VIN (or 5V, see below)// Display SCK to NodeMCU pin D5// Display SDI/MOSI to NodeMCU pin D7// Display DC (RS/AO)to NodeMCU pin D3// Display RESET to NodeMCU pin D4 (or RST, see below)// Display CS to NodeMCU pin D8 (or GND, see below)// Display GND to NodeMCU pin GND (0V)// Display VCC to NodeMCU 5V or 3.3V//// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin//// The DC (Data Command) pin may be labelled AO or RS (Register Select)//// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more// SPI devices (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected.//// The NodeMCU D0 pin can be used for RST////// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin// If 5V is not available at a pin you can use 3.3V but backlight brightness// will be lower.// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP8266 SETUP ######// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation#defineTFT_MISOPIN_D6 // Automatically assigned with ESP8266 if not defined#defineTFT_MOSIPIN_D7 // Automatically assigned with ESP8266 if not defined#defineTFT_SCLKPIN_D5 // Automatically assigned with ESP8266 if not defined#defineTFT_CSPIN_D8 // Chip select control pin D8#defineTFT_DCPIN_D3 // Data Command control pin#defineTFT_RSTPIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V//#define TFT_BL PIN_D1 // LED back-light (only for ST7789 with backlight control pin)//#define TOUCH_CS PIN_D2 // Chip select pin (T_CS) of touch screen//#define TFT_WR PIN_D2 // Write strobe for modified Raspberry Pi TFT only// ###### FOR ESP8266 OVERLAP MODE EDIT THE PIN NUMBERS IN THE FOLLOWING LINES ######// Overlap mode shares the ESP8266 FLASH SPI bus with the TFT so has a performance impact// but saves pins for other functions. It is best not to connect MISO as some displays// do not tristate that line when chip select is high!// Note: Only one SPI device can share the FLASH SPI lines, so a SPI touch controller// cannot be connected as well to the same SPI signals.// On NodeMCU 1.0 SD0=MISO, SD1=MOSI, CLK=SCLK to connect to TFT in overlap mode// On NodeMCU V3 S0 =MISO, S1 =MOSI, S2 =SCLK// In ESP8266 overlap mode the following must be defined//#define TFT_SPI_OVERLAP// In ESP8266 overlap mode the TFT chip select MUST connect to pin D3//#define TFT_CS PIN_D3//#define TFT_DC PIN_D5 // Data Command control pin//#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP ######// For ESP32 Dev board (only tested with ILI9341 display)// The hardware SPI can be mapped to any pins// #define TFT_MISO 19#defineTFT_MOSI17#defineTFT_SCLK16#defineTFT_CS27// Chip select control pin#defineTFT_DC26// Data Command control pin#defineTFT_RST13// Reset pin (could connect to RST pin)//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST// For ESP32 Dev board (only tested with GC9A01 display)// The hardware SPI can be mapped to any pins//#define TFT_MOSI 15 // In some display driver board, it might be written as "SDA" and so on.//#define TFT_SCLK 14//#define TFT_CS 5 // Chip select control pin//#define TFT_DC 27 // Data Command control pin//#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin)#defineTFT_BL14// LED back-light#defineTOUCH_CS-1// Chip select pin (T_CS) of touch screen//#define TFT_WR 22 // Write strobe for modified Raspberry Pi TFT only// For the M5Stack module use these #define lines//#define TFT_MISO 19//#define TFT_MOSI 23//#define TFT_SCLK 18//#define TFT_CS 14 // Chip select control pin//#define TFT_DC 27 // Data Command control pin//#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin)//#define TFT_BL 32 // LED back-light (required for M5Stack)// ###### EDIT THE PINs BELOW TO SUIT YOUR ESP32 PARALLEL TFT SETUP ######// The library supports 8 bit parallel TFTs with the ESP32, the pin// selection below is compatible with ESP32 boards in UNO format.// Wemos D32 boards need to be modified, see diagram in Tools folder.// Only ILI9481 and ILI9341 based displays have been tested!// Parallel bus is only supported for the STM32 and ESP32// Example below is for ESP32 Parallel interface with UNO displays// Tell the library to use 8 bit parallel mode (otherwise SPI is assumed)//#define TFT_PARALLEL_8_BIT// The ESP32 and TFT the pins used for testing are://#define TFT_CS 33 // Chip select control pin (library pulls permanently low//#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31//#define TFT_RST 32 // Reset pin, toggles on startup//#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31//#define TFT_RD 2 // Read strobe control pin//#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus//#define TFT_D1 13 // so a single register write sets/clears all bits.//#define TFT_D2 26 // Pins can be randomly assigned, this does not affect//#define TFT_D3 25 // TFT screen update performance.//#define TFT_D4 17//#define TFT_D5 16//#define TFT_D6 27//#define TFT_D7 14// ###### EDIT THE PINs BELOW TO SUIT YOUR STM32 SPI TFT SETUP ######// The TFT can be connected to SPI port 1 or 2//#define TFT_SPI_PORT 1 // SPI port 1 maximum clock rate is 55MHz//#define TFT_MOSI PA7//#define TFT_MISO PA6//#define TFT_SCLK PA5//#define TFT_SPI_PORT 2 // SPI port 2 maximum clock rate is 27MHz//#define TFT_MOSI PB15//#define TFT_MISO PB14//#define TFT_SCLK PB13// Can use Ardiuno pin references, arbitrary allocation, TFT_eSPI controls chip select//#define TFT_CS D5 // Chip select control pin to TFT CS//#define TFT_DC D6 // Data Command control pin to TFT DC (may be labelled RS = Register Select)//#define TFT_RST D7 // Reset pin to TFT RST (or RESET)// OR alternatively, we can use STM32 port reference names PXnn//#define TFT_CS PE11 // Nucleo-F767ZI equivalent of D5//#define TFT_DC PE9 // Nucleo-F767ZI equivalent of D6//#define TFT_RST PF13 // Nucleo-F767ZI equivalent of D7//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to processor reset// Use an Arduino pin for initial testing as connecting to processor reset// may not work (pulse too short at power up?)// ##################################################################################//// Section 3. Define the fonts that are to be used here//// ##################################################################################// Comment out the #defines below with // to stop that font being loaded// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not// normally necessary. If all fonts are loaded the extra FLASH space required is// about 17Kbytes. To save FLASH space only enable the fonts you need!#defineLOAD_GLCD// Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH#defineLOAD_FONT2// Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters#defineLOAD_FONT4// Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters#defineLOAD_FONT6// Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm#defineLOAD_FONT7// Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.#defineLOAD_FONT8// Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT#defineLOAD_GFXFF// FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded// this will save ~20kbytes of FLASH#defineSMOOTH_FONT// ##################################################################################//// Section 4. Other options//// ##################################################################################// For RP2040 processor and SPI displays, uncomment the following line to use the PIO interface.//#define RP2040_PIO_SPI // Leave commented out to use standard RP2040 SPI port interface// For RP2040 processor and 8 or 16 bit parallel displays:// The parallel interface write cycle period is derived from a division of the CPU clock// speed so scales with the processor clock. This means that the divider ratio may need// to be increased when overclocking. It may also need to be adjusted dependant on the// display controller type (ILI94341, HX8357C etc). If RP2040_PIO_CLK_DIV is not defined// the library will set default values which may not suit your display.// The display controller data sheet will specify the minimum write cycle period. The// controllers often work reliably for shorter periods, however if the period is too short// the display may not initialise or graphics will become corrupted.// PIO write cycle frequency = (CPU clock/(4 * RP2040_PIO_CLK_DIV))//#define RP2040_PIO_CLK_DIV 1 // 32ns write cycle at 125MHz CPU clock//#define RP2040_PIO_CLK_DIV 2 // 64ns write cycle at 125MHz CPU clock//#define RP2040_PIO_CLK_DIV 3 // 96ns write cycle at 125MHz CPU clock// For the RP2040 processor define the SPI port channel used (default 0 if undefined)//#define TFT_SPI_PORT 1 // Set to 0 if SPI0 pins are used, or 1 if spi1 pins used// For the STM32 processor define the SPI port channel used (default 1 if undefined)//#define TFT_SPI_PORT 2 // Set to 1 for SPI port 1, or 2 for SPI port 2// Define the SPI clock frequency, this affects the graphics rendering speed. Too// fast and the TFT driver will not keep up and display corruption appears.// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)// With an ILI9163 display 27 MHz works OK.// #define SPI_FREQUENCY 1000000// #define SPI_FREQUENCY 5000000// #define SPI_FREQUENCY 10000000// #define SPI_FREQUENCY 20000000#defineSPI_FREQUENCY27000000// #define SPI_FREQUENCY 40000000// #define SPI_FREQUENCY 55000000 // STM32 SPI1 only (SPI2 maximum is 27MHz)// #define SPI_FREQUENCY 80000000// Optional reduced SPI frequency for reading TFT#defineSPI_READ_FREQUENCY20000000// The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here:#defineSPI_TOUCH_FREQUENCY2500000// The ESP32 has 2 free SPI ports i.e. VSPI and HSPI, the VSPI is the default.// If the VSPI port is in use and pins are not accessible (e.g. TTGO T-Beam)// then uncomment the following line://#define USE_HSPI_PORT// Comment out the following #define if "SPI Transactions" do not need to be// supported. When commented out the code size will be smaller and sketches will// run slightly faster, so leave it commented out unless you need it!// Transaction support is needed to work with SD library but not needed with TFT_SdFat// Transaction support is required if other SPI devices are connected.// Transactions are automatically enabled by the library for an ESP32 (to use HAL mutex)// so changing it here has no effect// #define SUPPORT_TRANSACTIONS
转接板接线原理图
接线表
ESP32开发板(GPIO引脚)1.69寸触摸屏17TFT_MOSI16TFT_SCLK27TFT_CS26TFT_DC13TFT_RST14(背光直连可能会因电流不够导致屏幕不亮,如上述原理图加点东西)TFT_BL21Touch_SDA22Touch_SCL5Touch_RST32Touch_IRQ-1(不接)Touch_CS3.3V3.3VGNDGND
四、代码调试
①添加lv_conf.h
先在lvgl库下找到lv_conf_template.h复制一份另取名为lv_conf.h
放在库文件同等位置
②修改lv_conf.h
然后对lv_conf.h内容进行修改,修改前如下(完全是lv_conf_template.h的内容):
/**
* @file lv_conf.h
* Configuration file for v8.2.0
*//*
* Copy this file as `lv_conf.h`
* 1. simply next to the `lvgl` folder
* 2. or any other places and
* - define `LV_CONF_INCLUDE_SIMPLE`
* - add the path as include path
*//* clang-format off */#if0/*Set it to "1" to enable content*/#ifndefLV_CONF_H#defineLV_CONF_H#include<stdint.h>/*====================
COLOR SETTINGS
*====================*//*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/#defineLV_COLOR_DEPTH16/*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/#defineLV_COLOR_16_SWAP0/*Enable more complex drawing routines to manage screens transparency.
*Can be used if the UI is above another layer, e.g. an OSD menu or video player.
*Requires `LV_COLOR_DEPTH = 32` colors and the screen's `bg_opa` should be set to non LV_OPA_COVER value*/#defineLV_COLOR_SCREEN_TRANSP0/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently.
* 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */#defineLV_COLOR_MIX_ROUND_OFS(LV_COLOR_DEPTH ==32?0:128)/*Images pixels with this color will not be drawn if they are chroma keyed)*/#defineLV_COLOR_CHROMA_KEYlv_color_hex(0x00ff00)/*pure green*//*=========================
MEMORY SETTINGS
*=========================*//*1: use custom malloc/free, 0: use the built-in `lv_mem_alloc()` and `lv_mem_free()`*/#defineLV_MEM_CUSTOM0#ifLV_MEM_CUSTOM ==0/*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/#defineLV_MEM_SIZE(48U*1024U)/*[bytes]*//*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/#defineLV_MEM_ADR0/*0: unused*//*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/#ifLV_MEM_ADR ==0//#define LV_MEM_POOL_INCLUDE your_alloc_library /* Uncomment if using an external allocator*///#define LV_MEM_POOL_ALLOC your_alloc /* Uncomment if using an external allocator*/#endif#else/*LV_MEM_CUSTOM*/#defineLV_MEM_CUSTOM_INCLUDE<stdlib.h>/*Header for the dynamic memory function*/#defineLV_MEM_CUSTOM_ALLOCmalloc#defineLV_MEM_CUSTOM_FREEfree#defineLV_MEM_CUSTOM_REALLOCrealloc#endif/*LV_MEM_CUSTOM*//*Number of the intermediate memory buffer used during rendering and other internal processing mechanisms.
*You will see an error log message if there wasn't enough buffers. */#defineLV_MEM_BUF_MAX_NUM16/*Use the standard `memcpy` and `memset` instead of LVGL's own functions. (Might or might not be faster).*/#defineLV_MEMCPY_MEMSET_STD0/*====================
HAL SETTINGS
*====================*//*Default display refresh period. LVG will redraw changed areas with this period time*/#defineLV_DISP_DEF_REFR_PERIOD30/*[ms]*//*Input device read period in milliseconds*/#defineLV_INDEV_DEF_READ_PERIOD30/*[ms]*//*Use a custom tick source that tells the elapsed time in milliseconds.
*It removes the need to manually update the tick with `lv_tick_inc()`)*/#defineLV_TICK_CUSTOM0#ifLV_TICK_CUSTOM#defineLV_TICK_CUSTOM_INCLUDE"Arduino.h"/*Header for the system time function*/#defineLV_TICK_CUSTOM_SYS_TIME_EXPR(millis())/*Expression evaluating to current system time in ms*/#endif/*LV_TICK_CUSTOM*//*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings.
*(Not so important, you can adjust it to modify default sizes and spaces)*/#defineLV_DPI_DEF130/*[px/inch]*//*=======================
* FEATURE CONFIGURATION
*=======================*//*-------------
* Drawing
*-----------*//*Enable complex draw engine.
*Required to draw shadow, gradient, rounded corners, circles, arc, skew lines, image transformations or any masks*/#defineLV_DRAW_COMPLEX1#ifLV_DRAW_COMPLEX !=0/*Allow buffering some shadow calculation.
*LV_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius`
*Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost*/#defineLV_SHADOW_CACHE_SIZE0/* Set number of maximally cached circle data.
* The circumference of 1/4 circle are saved for anti-aliasing
* radius * 4 bytes are used per circle (the most often used radiuses are saved)
* 0: to disable caching */#defineLV_CIRCLE_CACHE_SIZE4#endif/*LV_DRAW_COMPLEX*//*Default image cache size. Image caching keeps the images opened.
*If only the built-in image formats are used there is no real advantage of caching. (I.e. if no new image decoder is added)
*With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images.
*However the opened images might consume additional RAM.
*0: to disable caching*/#defineLV_IMG_CACHE_DEF_SIZE0/*Number of stops allowed per gradient. Increase this to allow more stops.
*This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/#defineLV_GRADIENT_MAX_STOPS2/*Default gradient buffer size.
*When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again.
*LV_GRAD_CACHE_DEF_SIZE sets the size of this cache in bytes.
*If the cache is too small the map will be allocated only while it's required for the drawing.
*0 mean no caching.*/#defineLV_GRAD_CACHE_DEF_SIZE0/*Allow dithering the gradients (to achieve visual smooth color gradients on limited color depth display)
*LV_DITHER_GRADIENT implies allocating one or two more lines of the object's rendering surface
*The increase in memory consumption is (32 bits * object width) plus 24 bits * object width if using error diffusion */#defineLV_DITHER_GRADIENT0#ifLV_DITHER_GRADIENT/*Add support for error diffusion dithering.
*Error diffusion dithering gets a much better visual result, but implies more CPU consumption and memory when drawing.
*The increase in memory consumption is (24 bits * object's width)*/#defineLV_DITHER_ERROR_DIFFUSION0#endif/*Maximum buffer size to allocate for rotation.
*Only used if software rotation is enabled in the display driver.*/#defineLV_DISP_ROT_MAX_BUF(10*1024)/*-------------
* GPU
*-----------*//*Use STM32's DMA2D (aka Chrom Art) GPU*/#defineLV_USE_GPU_STM32_DMA2D0#ifLV_USE_GPU_STM32_DMA2D/*Must be defined to include path of CMSIS header of target processor
e.g. "stm32f769xx.h" or "stm32f429xx.h"*/#defineLV_GPU_DMA2D_CMSIS_INCLUDE#endif/*Use NXP's PXP GPU iMX RTxxx platforms*/#defineLV_USE_GPU_NXP_PXP0#ifLV_USE_GPU_NXP_PXP/*1: Add default bare metal and FreeRTOS interrupt handling routines for PXP (lv_gpu_nxp_pxp_osa.c)
* and call lv_gpu_nxp_pxp_init() automatically during lv_init(). Note that symbol SDK_OS_FREE_RTOS
* has to be defined in order to use FreeRTOS OSA, otherwise bare-metal implementation is selected.
*0: lv_gpu_nxp_pxp_init() has to be called manually before lv_init()
*/#defineLV_USE_GPU_NXP_PXP_AUTO_INIT0#endif/*Use NXP's VG-Lite GPU iMX RTxxx platforms*/#defineLV_USE_GPU_NXP_VG_LITE0/*Use SDL renderer API*/#defineLV_USE_GPU_SDL0#ifLV_USE_GPU_SDL#defineLV_GPU_SDL_INCLUDE_PATH<SDL2/SDL.h>/*Texture cache size, 8MB by default*/#defineLV_GPU_SDL_LRU_SIZE(1024*1024*8)/*Custom blend mode for mask drawing, disable if you need to link with older SDL2 lib*/#defineLV_GPU_SDL_CUSTOM_BLEND_MODE(SDL_VERSION_ATLEAST(2,0,6))#endif/*-------------
* Logging
*-----------*//*Enable the log module*/#defineLV_USE_LOG0#ifLV_USE_LOG/*How important log should be added:
*LV_LOG_LEVEL_TRACE A lot of logs to give detailed information
*LV_LOG_LEVEL_INFO Log important events
*LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem
*LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail
*LV_LOG_LEVEL_USER Only logs added by the user
*LV_LOG_LEVEL_NONE Do not log anything*/#defineLV_LOG_LEVELLV_LOG_LEVEL_WARN/*1: Print the log with 'printf';
*0: User need to register a callback with `lv_log_register_print_cb()`*/#defineLV_LOG_PRINTF0/*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/#defineLV_LOG_TRACE_MEM1#defineLV_LOG_TRACE_TIMER1#defineLV_LOG_TRACE_INDEV1#defineLV_LOG_TRACE_DISP_REFR1#defineLV_LOG_TRACE_EVENT1#defineLV_LOG_TRACE_OBJ_CREATE1#defineLV_LOG_TRACE_LAYOUT1#defineLV_LOG_TRACE_ANIM1#endif/*LV_USE_LOG*//*-------------
* Asserts
*-----------*//*Enable asserts if an operation is failed or an invalid data is found.
*If LV_USE_LOG is enabled an error message will be printed on failure*/#defineLV_USE_ASSERT_NULL1/*Check if the parameter is NULL. (Very fast, recommended)*/#defineLV_USE_ASSERT_MALLOC1/*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/#defineLV_USE_ASSERT_STYLE0/*Check if the styles are properly initialized. (Very fast, recommended)*/#defineLV_USE_ASSERT_MEM_INTEGRITY0/*Check the integrity of `lv_mem` after critical operations. (Slow)*/#defineLV_USE_ASSERT_OBJ0/*Check the object's type and existence (e.g. not deleted). (Slow)*//*Add a custom handler when assert happens e.g. to restart the MCU*/#defineLV_ASSERT_HANDLER_INCLUDE<stdint.h>#defineLV_ASSERT_HANDLERwhile(1);/*Halt by default*//*-------------
* Others
*-----------*//*1: Show CPU usage and FPS count*/#defineLV_USE_PERF_MONITOR0#ifLV_USE_PERF_MONITOR#defineLV_USE_PERF_MONITOR_POSLV_ALIGN_BOTTOM_RIGHT#endif/*1: Show the used memory and the memory fragmentation
* Requires LV_MEM_CUSTOM = 0*/#defineLV_USE_MEM_MONITOR0#ifLV_USE_MEM_MONITOR#defineLV_USE_MEM_MONITOR_POSLV_ALIGN_BOTTOM_LEFT#endif/*1: Draw random colored rectangles over the redrawn areas*/#defineLV_USE_REFR_DEBUG0/*Change the built in (v)snprintf functions*/#defineLV_SPRINTF_CUSTOM0#ifLV_SPRINTF_CUSTOM#defineLV_SPRINTF_INCLUDE<stdio.h>#definelv_snprintfsnprintf#definelv_vsnprintfvsnprintf#else/*LV_SPRINTF_CUSTOM*/#defineLV_SPRINTF_USE_FLOAT0#endif/*LV_SPRINTF_CUSTOM*/#defineLV_USE_USER_DATA1/*Garbage Collector settings
*Used if lvgl is bound to higher level language and the memory is managed by that language*/#defineLV_ENABLE_GC0#ifLV_ENABLE_GC !=0#defineLV_GC_INCLUDE"gc.h"/*Include Garbage Collector related things*/#endif/*LV_ENABLE_GC*//*=====================
* COMPILER SETTINGS
*====================*//*For big endian systems set to 1*/#defineLV_BIG_ENDIAN_SYSTEM0/*Define a custom attribute to `lv_tick_inc` function*/#defineLV_ATTRIBUTE_TICK_INC/*Define a custom attribute to `lv_timer_handler` function*/#defineLV_ATTRIBUTE_TIMER_HANDLER/*Define a custom attribute to `lv_disp_flush_ready` function*/#defineLV_ATTRIBUTE_FLUSH_READY/*Required alignment size for buffers*/#defineLV_ATTRIBUTE_MEM_ALIGN_SIZE1/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default).
* E.g. __attribute__((aligned(4)))*/#defineLV_ATTRIBUTE_MEM_ALIGN/*Attribute to mark large constant arrays for example font's bitmaps*/#defineLV_ATTRIBUTE_LARGE_CONST/*Compiler prefix for a big array declaration in RAM*/#defineLV_ATTRIBUTE_LARGE_RAM_ARRAY/*Place performance critical functions into a faster memory (e.g RAM)*/#defineLV_ATTRIBUTE_FAST_MEM/*Prefix variables that are used in GPU accelerated operations, often these need to be placed in RAM sections that are DMA accessible*/#defineLV_ATTRIBUTE_DMA/*Export integer constant to binding. This macro is used with constants in the form of LV_<CONST> that
*should also appear on LVGL binding API such as Micropython.*/#defineLV_EXPORT_CONST_INT(int_value)struct_silence_gcc_warning/*The default value just prevents GCC warning*//*Extend the default -32k..32k coordinate range to -4M..4M by using int32_t for coordinates instead of int16_t*/#defineLV_USE_LARGE_COORD0/*==================
* FONT USAGE
*===================*//*Montserrat fonts with ASCII range and some symbols using bpp = 4
*https://fonts.google.com/specimen/Montserrat*/#defineLV_FONT_MONTSERRAT_80#defineLV_FONT_MONTSERRAT_100#defineLV_FONT_MONTSERRAT_120#defineLV_FONT_MONTSERRAT_141#defineLV_FONT_MONTSERRAT_160#defineLV_FONT_MONTSERRAT_180#defineLV_FONT_MONTSERRAT_200#defineLV_FONT_MONTSERRAT_220#defineLV_FONT_MONTSERRAT_240#defineLV_FONT_MONTSERRAT_260#defineLV_FONT_MONTSERRAT_280#defineLV_FONT_MONTSERRAT_300#defineLV_FONT_MONTSERRAT_320#defineLV_FONT_MONTSERRAT_340#defineLV_FONT_MONTSERRAT_360#defineLV_FONT_MONTSERRAT_380#defineLV_FONT_MONTSERRAT_400#defineLV_FONT_MONTSERRAT_420#defineLV_FONT_MONTSERRAT_440#defineLV_FONT_MONTSERRAT_460#defineLV_FONT_MONTSERRAT_480/*Demonstrate special features*/#defineLV_FONT_MONTSERRAT_12_SUBPX0#defineLV_FONT_MONTSERRAT_28_COMPRESSED0/*bpp = 3*/#defineLV_FONT_DEJAVU_16_PERSIAN_HEBREW0/*Hebrew, Arabic, Persian letters and all their forms*/#defineLV_FONT_SIMSUN_16_CJK0/*1000 most common CJK radicals*//*Pixel perfect monospace fonts*/#defineLV_FONT_UNSCII_80#defineLV_FONT_UNSCII_160/*Optionally declare custom fonts here.
*You can use these fonts as default font too and they will be available globally.
*E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/#defineLV_FONT_CUSTOM_DECLARE/*Always set a default font*/#defineLV_FONT_DEFAULT&lv_font_montserrat_14/*Enable handling large font and/or fonts with a lot of characters.
*The limit depends on the font size, font face and bpp.
*Compiler error will be triggered if a font needs it.*/#defineLV_FONT_FMT_TXT_LARGE0/*Enables/disables support for compressed fonts.*/#defineLV_USE_FONT_COMPRESSED0/*Enable subpixel rendering*/#defineLV_USE_FONT_SUBPX0#ifLV_USE_FONT_SUBPX/*Set the pixel order of the display. Physical order of RGB channels. Doesn't matter with "normal" fonts.*/#defineLV_FONT_SUBPX_BGR0/*0: RGB; 1:BGR order*/#endif/*=================
* TEXT SETTINGS
*=================*//**
* Select a character encoding for strings.
* Your IDE or editor should have the same character encoding
* - LV_TXT_ENC_UTF8
* - LV_TXT_ENC_ASCII
*/#defineLV_TXT_ENCLV_TXT_ENC_UTF8/*Can break (wrap) texts on these chars*/#defineLV_TXT_BREAK_CHARS" ,.;:-_"/*If a word is at least this long, will break wherever "prettiest"
*To disable, set to a value <= 0*/#defineLV_TXT_LINE_BREAK_LONG_LEN0/*Minimum number of characters in a long word to put on a line before a break.
*Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/#defineLV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN3/*Minimum number of characters in a long word to put on a line after a break.
*Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/#defineLV_TXT_LINE_BREAK_LONG_POST_MIN_LEN3/*The control character to use for signalling text recoloring.*/#defineLV_TXT_COLOR_CMD"#"/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts.
*The direction will be processed according to the Unicode Bidirectional Algorithm:
*https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/#defineLV_USE_BIDI0#ifLV_USE_BIDI/*Set the default direction. Supported values:
*`LV_BASE_DIR_LTR` Left-to-Right
*`LV_BASE_DIR_RTL` Right-to-Left
*`LV_BASE_DIR_AUTO` detect texts base direction*/#defineLV_BIDI_BASE_DIR_DEFLV_BASE_DIR_AUTO#endif/*Enable Arabic/Persian processing
*In these languages characters should be replaced with an other form based on their position in the text*/#defineLV_USE_ARABIC_PERSIAN_CHARS0/*==================
* WIDGET USAGE
*================*//*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/#defineLV_USE_ARC1#defineLV_USE_ANIMIMG1#defineLV_USE_BAR1#defineLV_USE_BTN1#defineLV_USE_BTNMATRIX1#defineLV_USE_CANVAS1#defineLV_USE_CHECKBOX1#defineLV_USE_DROPDOWN1/*Requires: lv_label*/#defineLV_USE_IMG1/*Requires: lv_label*/#defineLV_USE_LABEL1#ifLV_USE_LABEL#defineLV_LABEL_TEXT_SELECTION1/*Enable selecting text of the label*/#defineLV_LABEL_LONG_TXT_HINT1/*Store some extra info in labels to speed up drawing of very long texts*/#endif#defineLV_USE_LINE1#defineLV_USE_ROLLER1/*Requires: lv_label*/#ifLV_USE_ROLLER#defineLV_ROLLER_INF_PAGES7/*Number of extra "pages" when the roller is infinite*/#endif#defineLV_USE_SLIDER1/*Requires: lv_bar*/#defineLV_USE_SWITCH1#defineLV_USE_TEXTAREA1/*Requires: lv_label*/#ifLV_USE_TEXTAREA !=0#defineLV_TEXTAREA_DEF_PWD_SHOW_TIME1500/*ms*/#endif#defineLV_USE_TABLE1/*==================
* EXTRA COMPONENTS
*==================*//*-----------
* Widgets
*----------*/#defineLV_USE_CALENDAR1#ifLV_USE_CALENDAR#defineLV_CALENDAR_WEEK_STARTS_MONDAY0#ifLV_CALENDAR_WEEK_STARTS_MONDAY#defineLV_CALENDAR_DEFAULT_DAY_NAMES{"Mo","Tu","We","Th","Fr","Sa","Su"}#else#defineLV_CALENDAR_DEFAULT_DAY_NAMES{"Su","Mo","Tu","We","Th","Fr","Sa"}#endif#defineLV_CALENDAR_DEFAULT_MONTH_NAMES{"January","February","March","April","May","June","July","August","September","October","November","December"}#defineLV_USE_CALENDAR_HEADER_ARROW1#defineLV_USE_CALENDAR_HEADER_DROPDOWN1#endif/*LV_USE_CALENDAR*/#defineLV_USE_CHART1#defineLV_USE_COLORWHEEL1#defineLV_USE_IMGBTN1#defineLV_USE_KEYBOARD1#defineLV_USE_LED1#defineLV_USE_LIST1#defineLV_USE_MENU1#defineLV_USE_METER1#defineLV_USE_MSGBOX1#defineLV_USE_SPINBOX1#defineLV_USE_SPINNER1#defineLV_USE_TABVIEW1#defineLV_USE_TILEVIEW1#defineLV_USE_WIN1#defineLV_USE_SPAN1#ifLV_USE_SPAN/*A line text can contain maximum num of span descriptor */#defineLV_SPAN_SNIPPET_STACK_SIZE64#endif/*-----------
* Themes
*----------*//*A simple, impressive and very complete theme*/#defineLV_USE_THEME_DEFAULT1#ifLV_USE_THEME_DEFAULT/*0: Light mode; 1: Dark mode*/#defineLV_THEME_DEFAULT_DARK0/*1: Enable grow on press*/#defineLV_THEME_DEFAULT_GROW1/*Default transition time in [ms]*/#defineLV_THEME_DEFAULT_TRANSITION_TIME80#endif/*LV_USE_THEME_DEFAULT*//*A very simple theme that is a good starting point for a custom theme*/#defineLV_USE_THEME_BASIC1/*A theme designed for monochrome displays*/#defineLV_USE_THEME_MONO1/*-----------
* Layouts
*----------*//*A layout similar to Flexbox in CSS.*/#defineLV_USE_FLEX1/*A layout similar to Grid in CSS.*/#defineLV_USE_GRID1/*---------------------
* 3rd party libraries
*--------------------*//*File system interfaces for common APIs *//*API for fopen, fread, etc*/#defineLV_USE_FS_STDIO0#ifLV_USE_FS_STDIO#defineLV_FS_STDIO_LETTER'\0'/*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/#defineLV_FS_STDIO_PATH""/*Set the working directory. File/directory paths will be appended to it.*/#defineLV_FS_STDIO_CACHE_SIZE0/*>0 to cache this number of bytes in lv_fs_read()*/#endif/*API for open, read, etc*/#defineLV_USE_FS_POSIX0#ifLV_USE_FS_POSIX#defineLV_FS_POSIX_LETTER'\0'/*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/#defineLV_FS_POSIX_PATH""/*Set the working directory. File/directory paths will be appended to it.*/#defineLV_FS_POSIX_CACHE_SIZE0/*>0 to cache this number of bytes in lv_fs_read()*/#endif/*API for CreateFile, ReadFile, etc*/#defineLV_USE_FS_WIN320#ifLV_USE_FS_WIN32#defineLV_FS_WIN32_LETTER'\0'/*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/#defineLV_FS_WIN32_PATH""/*Set the working directory. File/directory paths will be appended to it.*/#defineLV_FS_WIN32_CACHE_SIZE0/*>0 to cache this number of bytes in lv_fs_read()*/#endif/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/#defineLV_USE_FS_FATFS0#ifLV_USE_FS_FATFS#defineLV_FS_FATFS_LETTER'\0'/*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/#defineLV_FS_FATFS_CACHE_SIZE0/*>0 to cache this number of bytes in lv_fs_read()*/#endif/*PNG decoder library*/#defineLV_USE_PNG0/*BMP decoder library*/#defineLV_USE_BMP0/* JPG + split JPG decoder library.
* Split JPG is a custom format optimized for embedded systems. */#defineLV_USE_SJPG0/*GIF decoder library*/#defineLV_USE_GIF0/*QR code library*/#defineLV_USE_QRCODE0/*FreeType library*/#defineLV_USE_FREETYPE0#ifLV_USE_FREETYPE/*Memory used by FreeType to cache characters [bytes] (-1: no caching)*/#defineLV_FREETYPE_CACHE_SIZE(16*1024)#ifLV_FREETYPE_CACHE_SIZE >=0/* 1: bitmap cache use the sbit cache, 0:bitmap cache use the image cache. *//* sbit cache:it is much more memory efficient for small bitmaps(font size < 256) *//* if font size >= 256, must be configured as image cache */#defineLV_FREETYPE_SBIT_CACHE0/* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. *//* (0:use system defaults) */#defineLV_FREETYPE_CACHE_FT_FACES0#defineLV_FREETYPE_CACHE_FT_SIZES0#endif#endif/*Rlottie library*/#defineLV_USE_RLOTTIE0/*FFmpeg library for image decoding and playing videos
*Supports all major image formats so do not enable other image decoder with it*/#defineLV_USE_FFMPEG0#ifLV_USE_FFMPEG/*Dump input information to stderr*/#defineLV_FFMPEG_AV_DUMP_FORMAT0#endif/*-----------
* Others
*----------*//*1: Enable API to take snapshot for object*/#defineLV_USE_SNAPSHOT0/*1: Enable Monkey test*/#defineLV_USE_MONKEY0/*1: Enable grid navigation*/#defineLV_USE_GRIDNAV0/*==================
* EXAMPLES
*==================*//*Enable the examples to be built with the library*/#defineLV_BUILD_EXAMPLES1/*===================
* DEMO USAGE
====================*//*Show some widget. It might be required to increase `LV_MEM_SIZE` */#defineLV_USE_DEMO_WIDGETS0#ifLV_USE_DEMO_WIDGETS#defineLV_DEMO_WIDGETS_SLIDESHOW0#endif/*Demonstrate the usage of encoder and keyboard*/#defineLV_USE_DEMO_KEYPAD_AND_ENCODER0/*Benchmark your system*/#defineLV_USE_DEMO_BENCHMARK0/*Stress test for LVGL*/#defineLV_USE_DEMO_STRESS0/*Music player demo*/#defineLV_USE_DEMO_MUSIC0#ifLV_USE_DEMO_MUSIC#defineLV_DEMO_MUSIC_SQUARE0#defineLV_DEMO_MUSIC_LANDSCAPE0#defineLV_DEMO_MUSIC_ROUND0#defineLV_DEMO_MUSIC_LARGE0#defineLV_DEMO_MUSIC_AUTO_PLAY0#endif/*--END OF LV_CONF_H--*/#endif/*LV_CONF_H*/#endif/*End of "Content enable"*/
lv_conf.h修改完后,如下:
/**
* @file lv_conf.h
* Configuration file for v8.2.0
*//*
* Copy this file as `lv_conf.h`
* 1. simply next to the `lvgl` folder
* 2. or any other places and
* - define `LV_CONF_INCLUDE_SIMPLE`
* - add the path as include path
*//* clang-format off */#if1/*Set it to "1" to enable content*/#ifndefLV_CONF_H#defineLV_CONF_H#include<stdint.h>/*====================
COLOR SETTINGS
*====================*//*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/#defineLV_COLOR_DEPTH16/*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/#defineLV_COLOR_16_SWAP0/*Enable more complex drawing routines to manage screens transparency.
*Can be used if the UI is above another layer, e.g. an OSD menu or video player.
*Requires `LV_COLOR_DEPTH = 32` colors and the screen's `bg_opa` should be set to non LV_OPA_COVER value*/#defineLV_COLOR_SCREEN_TRANSP0/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently.
* 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */#defineLV_COLOR_MIX_ROUND_OFS(LV_COLOR_DEPTH ==32?0:128)/*Images pixels with this color will not be drawn if they are chroma keyed)*/#defineLV_COLOR_CHROMA_KEYlv_color_hex(0x00ff00)/*pure green*//*=========================
MEMORY SETTINGS
*=========================*//*1: use custom malloc/free, 0: use the built-in `lv_mem_alloc()` and `lv_mem_free()`*/#defineLV_MEM_CUSTOM0#ifLV_MEM_CUSTOM ==0/*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/#defineLV_MEM_SIZE(48U*1024U)/*[bytes]*//*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/#defineLV_MEM_ADR0/*0: unused*//*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/#ifLV_MEM_ADR ==0//#define LV_MEM_POOL_INCLUDE your_alloc_library /* Uncomment if using an external allocator*///#define LV_MEM_POOL_ALLOC your_alloc /* Uncomment if using an external allocator*/#endif#else/*LV_MEM_CUSTOM*/#defineLV_MEM_CUSTOM_INCLUDE<stdlib.h>/*Header for the dynamic memory function*/#defineLV_MEM_CUSTOM_ALLOCmalloc#defineLV_MEM_CUSTOM_FREEfree#defineLV_MEM_CUSTOM_REALLOCrealloc#endif/*LV_MEM_CUSTOM*//*Number of the intermediate memory buffer used during rendering and other internal processing mechanisms.
*You will see an error log message if there wasn't enough buffers. */#defineLV_MEM_BUF_MAX_NUM16/*Use the standard `memcpy` and `memset` instead of LVGL's own functions. (Might or might not be faster).*/#defineLV_MEMCPY_MEMSET_STD0/*====================
HAL SETTINGS
*====================*//*Default display refresh period. LVG will redraw changed areas with this period time*/#defineLV_DISP_DEF_REFR_PERIOD30/*[ms]*//*Input device read period in milliseconds*/#defineLV_INDEV_DEF_READ_PERIOD30/*[ms]*//*Use a custom tick source that tells the elapsed time in milliseconds.
*It removes the need to manually update the tick with `lv_tick_inc()`)*/#defineLV_TICK_CUSTOM1#ifLV_TICK_CUSTOM#defineLV_TICK_CUSTOM_INCLUDE"Arduino.h"/*Header for the system time function*/#defineLV_TICK_CUSTOM_SYS_TIME_EXPR(millis())/*Expression evaluating to current system time in ms*/#endif/*LV_TICK_CUSTOM*//*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings.
*(Not so important, you can adjust it to modify default sizes and spaces)*/#defineLV_DPI_DEF130/*[px/inch]*//*=======================
* FEATURE CONFIGURATION
*=======================*//*-------------
* Drawing
*-----------*//*Enable complex draw engine.
*Required to draw shadow, gradient, rounded corners, circles, arc, skew lines, image transformations or any masks*/#defineLV_DRAW_COMPLEX1#ifLV_DRAW_COMPLEX !=0/*Allow buffering some shadow calculation.
*LV_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius`
*Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost*/#defineLV_SHADOW_CACHE_SIZE0/* Set number of maximally cached circle data.
* The circumference of 1/4 circle are saved for anti-aliasing
* radius * 4 bytes are used per circle (the most often used radiuses are saved)
* 0: to disable caching */#defineLV_CIRCLE_CACHE_SIZE4#endif/*LV_DRAW_COMPLEX*//*Default image cache size. Image caching keeps the images opened.
*If only the built-in image formats are used there is no real advantage of caching. (I.e. if no new image decoder is added)
*With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images.
*However the opened images might consume additional RAM.
*0: to disable caching*/#defineLV_IMG_CACHE_DEF_SIZE0/*Number of stops allowed per gradient. Increase this to allow more stops.
*This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/#defineLV_GRADIENT_MAX_STOPS2/*Default gradient buffer size.
*When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again.
*LV_GRAD_CACHE_DEF_SIZE sets the size of this cache in bytes.
*If the cache is too small the map will be allocated only while it's required for the drawing.
*0 mean no caching.*/#defineLV_GRAD_CACHE_DEF_SIZE0/*Allow dithering the gradients (to achieve visual smooth color gradients on limited color depth display)
*LV_DITHER_GRADIENT implies allocating one or two more lines of the object's rendering surface
*The increase in memory consumption is (32 bits * object width) plus 24 bits * object width if using error diffusion */#defineLV_DITHER_GRADIENT0#ifLV_DITHER_GRADIENT/*Add support for error diffusion dithering.
*Error diffusion dithering gets a much better visual result, but implies more CPU consumption and memory when drawing.
*The increase in memory consumption is (24 bits * object's width)*/#defineLV_DITHER_ERROR_DIFFUSION0#endif/*Maximum buffer size to allocate for rotation.
*Only used if software rotation is enabled in the display driver.*/#defineLV_DISP_ROT_MAX_BUF(10*1024)/*-------------
* GPU
*-----------*//*Use STM32's DMA2D (aka Chrom Art) GPU*/#defineLV_USE_GPU_STM32_DMA2D0#ifLV_USE_GPU_STM32_DMA2D/*Must be defined to include path of CMSIS header of target processor
e.g. "stm32f769xx.h" or "stm32f429xx.h"*/#defineLV_GPU_DMA2D_CMSIS_INCLUDE#endif/*Use NXP's PXP GPU iMX RTxxx platforms*/#defineLV_USE_GPU_NXP_PXP0#ifLV_USE_GPU_NXP_PXP/*1: Add default bare metal and FreeRTOS interrupt handling routines for PXP (lv_gpu_nxp_pxp_osa.c)
* and call lv_gpu_nxp_pxp_init() automatically during lv_init(). Note that symbol SDK_OS_FREE_RTOS
* has to be defined in order to use FreeRTOS OSA, otherwise bare-metal implementation is selected.
*0: lv_gpu_nxp_pxp_init() has to be called manually before lv_init()
*/#defineLV_USE_GPU_NXP_PXP_AUTO_INIT0#endif/*Use NXP's VG-Lite GPU iMX RTxxx platforms*/#defineLV_USE_GPU_NXP_VG_LITE0/*Use SDL renderer API*/#defineLV_USE_GPU_SDL0#ifLV_USE_GPU_SDL#defineLV_GPU_SDL_INCLUDE_PATH<SDL2/SDL.h>/*Texture cache size, 8MB by default*/#defineLV_GPU_SDL_LRU_SIZE(1024*1024*8)/*Custom blend mode for mask drawing, disable if you need to link with older SDL2 lib*/#defineLV_GPU_SDL_CUSTOM_BLEND_MODE(SDL_VERSION_ATLEAST(2,0,6))#endif/*-------------
* Logging
*-----------*//*Enable the log module*/#defineLV_USE_LOG0#ifLV_USE_LOG/*How important log should be added:
*LV_LOG_LEVEL_TRACE A lot of logs to give detailed information
*LV_LOG_LEVEL_INFO Log important events
*LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem
*LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail
*LV_LOG_LEVEL_USER Only logs added by the user
*LV_LOG_LEVEL_NONE Do not log anything*/#defineLV_LOG_LEVELLV_LOG_LEVEL_WARN/*1: Print the log with 'printf';
*0: User need to register a callback with `lv_log_register_print_cb()`*/#defineLV_LOG_PRINTF0/*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/#defineLV_LOG_TRACE_MEM1#defineLV_LOG_TRACE_TIMER1#defineLV_LOG_TRACE_INDEV1#defineLV_LOG_TRACE_DISP_REFR1#defineLV_LOG_TRACE_EVENT1#defineLV_LOG_TRACE_OBJ_CREATE1#defineLV_LOG_TRACE_LAYOUT1#defineLV_LOG_TRACE_ANIM1#endif/*LV_USE_LOG*//*-------------
* Asserts
*-----------*//*Enable asserts if an operation is failed or an invalid data is found.
*If LV_USE_LOG is enabled an error message will be printed on failure*/#defineLV_USE_ASSERT_NULL1/*Check if the parameter is NULL. (Very fast, recommended)*/#defineLV_USE_ASSERT_MALLOC1/*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/#defineLV_USE_ASSERT_STYLE0/*Check if the styles are properly initialized. (Very fast, recommended)*/#defineLV_USE_ASSERT_MEM_INTEGRITY0/*Check the integrity of `lv_mem` after critical operations. (Slow)*/#defineLV_USE_ASSERT_OBJ0/*Check the object's type and existence (e.g. not deleted). (Slow)*//*Add a custom handler when assert happens e.g. to restart the MCU*/#defineLV_ASSERT_HANDLER_INCLUDE<stdint.h>#defineLV_ASSERT_HANDLERwhile(1);/*Halt by default*//*-------------
* Others
*-----------*//*1: Show CPU usage and FPS count*/#defineLV_USE_PERF_MONITOR1#ifLV_USE_PERF_MONITOR#defineLV_USE_PERF_MONITOR_POSLV_ALIGN_BOTTOM_RIGHT#endif/*1: Show the used memory and the memory fragmentation
* Requires LV_MEM_CUSTOM = 0*/#defineLV_USE_MEM_MONITOR1#ifLV_USE_MEM_MONITOR#defineLV_USE_MEM_MONITOR_POSLV_ALIGN_BOTTOM_LEFT#endif/*1: Draw random colored rectangles over the redrawn areas*/#defineLV_USE_REFR_DEBUG0/*Change the built in (v)snprintf functions*/#defineLV_SPRINTF_CUSTOM0#ifLV_SPRINTF_CUSTOM#defineLV_SPRINTF_INCLUDE<stdio.h>#definelv_snprintfsnprintf#definelv_vsnprintfvsnprintf#else/*LV_SPRINTF_CUSTOM*/#defineLV_SPRINTF_USE_FLOAT0#endif/*LV_SPRINTF_CUSTOM*/#defineLV_USE_USER_DATA1/*Garbage Collector settings
*Used if lvgl is bound to higher level language and the memory is managed by that language*/#defineLV_ENABLE_GC0#ifLV_ENABLE_GC !=0#defineLV_GC_INCLUDE"gc.h"/*Include Garbage Collector related things*/#endif/*LV_ENABLE_GC*//*=====================
* COMPILER SETTINGS
*====================*//*For big endian systems set to 1*/#defineLV_BIG_ENDIAN_SYSTEM0/*Define a custom attribute to `lv_tick_inc` function*/#defineLV_ATTRIBUTE_TICK_INC/*Define a custom attribute to `lv_timer_handler` function*/#defineLV_ATTRIBUTE_TIMER_HANDLER/*Define a custom attribute to `lv_disp_flush_ready` function*/#defineLV_ATTRIBUTE_FLUSH_READY/*Required alignment size for buffers*/#defineLV_ATTRIBUTE_MEM_ALIGN_SIZE1/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default).
* E.g. __attribute__((aligned(4)))*/#defineLV_ATTRIBUTE_MEM_ALIGN/*Attribute to mark large constant arrays for example font's bitmaps*/#defineLV_ATTRIBUTE_LARGE_CONST/*Compiler prefix for a big array declaration in RAM*/#defineLV_ATTRIBUTE_LARGE_RAM_ARRAY/*Place performance critical functions into a faster memory (e.g RAM)*/#defineLV_ATTRIBUTE_FAST_MEM/*Prefix variables that are used in GPU accelerated operations, often these need to be placed in RAM sections that are DMA accessible*/#defineLV_ATTRIBUTE_DMA/*Export integer constant to binding. This macro is used with constants in the form of LV_<CONST> that
*should also appear on LVGL binding API such as Micropython.*/#defineLV_EXPORT_CONST_INT(int_value)struct_silence_gcc_warning/*The default value just prevents GCC warning*//*Extend the default -32k..32k coordinate range to -4M..4M by using int32_t for coordinates instead of int16_t*/#defineLV_USE_LARGE_COORD0/*==================
* FONT USAGE
*===================*//*Montserrat fonts with ASCII range and some symbols using bpp = 4
*https://fonts.google.com/specimen/Montserrat*/#defineLV_FONT_MONTSERRAT_80#defineLV_FONT_MONTSERRAT_100#defineLV_FONT_MONTSERRAT_121#defineLV_FONT_MONTSERRAT_141#defineLV_FONT_MONTSERRAT_161#defineLV_FONT_MONTSERRAT_181#defineLV_FONT_MONTSERRAT_200#defineLV_FONT_MONTSERRAT_220#defineLV_FONT_MONTSERRAT_240#defineLV_FONT_MONTSERRAT_260#defineLV_FONT_MONTSERRAT_280#defineLV_FONT_MONTSERRAT_300#defineLV_FONT_MONTSERRAT_320#defineLV_FONT_MONTSERRAT_340#defineLV_FONT_MONTSERRAT_360#defineLV_FONT_MONTSERRAT_380#defineLV_FONT_MONTSERRAT_400#defineLV_FONT_MONTSERRAT_420#defineLV_FONT_MONTSERRAT_440#defineLV_FONT_MONTSERRAT_460#defineLV_FONT_MONTSERRAT_480/*Demonstrate special features*/#defineLV_FONT_MONTSERRAT_12_SUBPX0#defineLV_FONT_MONTSERRAT_28_COMPRESSED0/*bpp = 3*/#defineLV_FONT_DEJAVU_16_PERSIAN_HEBREW0/*Hebrew, Arabic, Persian letters and all their forms*/#defineLV_FONT_SIMSUN_16_CJK0/*1000 most common CJK radicals*//*Pixel perfect monospace fonts*/#defineLV_FONT_UNSCII_80#defineLV_FONT_UNSCII_160/*Optionally declare custom fonts here.
*You can use these fonts as default font too and they will be available globally.
*E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/#defineLV_FONT_CUSTOM_DECLARE/*Always set a default font*/#defineLV_FONT_DEFAULT&lv_font_montserrat_14/*Enable handling large font and/or fonts with a lot of characters.
*The limit depends on the font size, font face and bpp.
*Compiler error will be triggered if a font needs it.*/#defineLV_FONT_FMT_TXT_LARGE0/*Enables/disables support for compressed fonts.*/#defineLV_USE_FONT_COMPRESSED0/*Enable subpixel rendering*/#defineLV_USE_FONT_SUBPX0#ifLV_USE_FONT_SUBPX/*Set the pixel order of the display. Physical order of RGB channels. Doesn't matter with "normal" fonts.*/#defineLV_FONT_SUBPX_BGR0/*0: RGB; 1:BGR order*/#endif/*=================
* TEXT SETTINGS
*=================*//**
* Select a character encoding for strings.
* Your IDE or editor should have the same character encoding
* - LV_TXT_ENC_UTF8
* - LV_TXT_ENC_ASCII
*/#defineLV_TXT_ENCLV_TXT_ENC_UTF8/*Can break (wrap) texts on these chars*/#defineLV_TXT_BREAK_CHARS" ,.;:-_"/*If a word is at least this long, will break wherever "prettiest"
*To disable, set to a value <= 0*/#defineLV_TXT_LINE_BREAK_LONG_LEN0/*Minimum number of characters in a long word to put on a line before a break.
*Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/#defineLV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN3/*Minimum number of characters in a long word to put on a line after a break.
*Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/#defineLV_TXT_LINE_BREAK_LONG_POST_MIN_LEN3/*The control character to use for signalling text recoloring.*/#defineLV_TXT_COLOR_CMD"#"/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts.
*The direction will be processed according to the Unicode Bidirectional Algorithm:
*https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/#defineLV_USE_BIDI0#ifLV_USE_BIDI/*Set the default direction. Supported values:
*`LV_BASE_DIR_LTR` Left-to-Right
*`LV_BASE_DIR_RTL` Right-to-Left
*`LV_BASE_DIR_AUTO` detect texts base direction*/#defineLV_BIDI_BASE_DIR_DEFLV_BASE_DIR_AUTO#endif/*Enable Arabic/Persian processing
*In these languages characters should be replaced with an other form based on their position in the text*/#defineLV_USE_ARABIC_PERSIAN_CHARS0/*==================
* WIDGET USAGE
*================*//*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/#defineLV_USE_ARC1#defineLV_USE_ANIMIMG1#defineLV_USE_BAR1#defineLV_USE_BTN1#defineLV_USE_BTNMATRIX1#defineLV_USE_CANVAS1#defineLV_USE_CHECKBOX1#defineLV_USE_DROPDOWN1/*Requires: lv_label*/#defineLV_USE_IMG1/*Requires: lv_label*/#defineLV_USE_LABEL1#ifLV_USE_LABEL#defineLV_LABEL_TEXT_SELECTION1/*Enable selecting text of the label*/#defineLV_LABEL_LONG_TXT_HINT1/*Store some extra info in labels to speed up drawing of very long texts*/#endif#defineLV_USE_LINE1#defineLV_USE_ROLLER1/*Requires: lv_label*/#ifLV_USE_ROLLER#defineLV_ROLLER_INF_PAGES7/*Number of extra "pages" when the roller is infinite*/#endif#defineLV_USE_SLIDER1/*Requires: lv_bar*/#defineLV_USE_SWITCH1#defineLV_USE_TEXTAREA1/*Requires: lv_label*/#ifLV_USE_TEXTAREA !=0#defineLV_TEXTAREA_DEF_PWD_SHOW_TIME1500/*ms*/#endif#defineLV_USE_TABLE1/*==================
* EXTRA COMPONENTS
*==================*//*-----------
* Widgets
*----------*/#defineLV_USE_CALENDAR1#ifLV_USE_CALENDAR#defineLV_CALENDAR_WEEK_STARTS_MONDAY0#ifLV_CALENDAR_WEEK_STARTS_MONDAY#defineLV_CALENDAR_DEFAULT_DAY_NAMES{"Mo","Tu","We","Th","Fr","Sa","Su"}#else#defineLV_CALENDAR_DEFAULT_DAY_NAMES{"Su","Mo","Tu","We","Th","Fr","Sa"}#endif#defineLV_CALENDAR_DEFAULT_MONTH_NAMES{"January","February","March","April","May","June","July","August","September","October","November","December"}#defineLV_USE_CALENDAR_HEADER_ARROW1#defineLV_USE_CALENDAR_HEADER_DROPDOWN1#endif/*LV_USE_CALENDAR*/#defineLV_USE_CHART1#defineLV_USE_COLORWHEEL1#defineLV_USE_IMGBTN1#defineLV_USE_KEYBOARD1#defineLV_USE_LED1#defineLV_USE_LIST1#defineLV_USE_MENU1#defineLV_USE_METER1#defineLV_USE_MSGBOX1#defineLV_USE_SPINBOX1#defineLV_USE_SPINNER1#defineLV_USE_TABVIEW1#defineLV_USE_TILEVIEW1#defineLV_USE_WIN1#defineLV_USE_SPAN1#ifLV_USE_SPAN/*A line text can contain maximum num of span descriptor */#defineLV_SPAN_SNIPPET_STACK_SIZE64#endif/*-----------
* Themes
*----------*//*A simple, impressive and very complete theme*/#defineLV_USE_THEME_DEFAULT1#ifLV_USE_THEME_DEFAULT/*0: Light mode; 1: Dark mode*/#defineLV_THEME_DEFAULT_DARK0/*1: Enable grow on press*/#defineLV_THEME_DEFAULT_GROW1/*Default transition time in [ms]*/#defineLV_THEME_DEFAULT_TRANSITION_TIME80#endif/*LV_USE_THEME_DEFAULT*//*A very simple theme that is a good starting point for a custom theme*/#defineLV_USE_THEME_BASIC1/*A theme designed for monochrome displays*/#defineLV_USE_THEME_MONO1/*-----------
* Layouts
*----------*//*A layout similar to Flexbox in CSS.*/#defineLV_USE_FLEX1/*A layout similar to Grid in CSS.*/#defineLV_USE_GRID1/*---------------------
* 3rd party libraries
*--------------------*//*File system interfaces for common APIs *//*API for fopen, fread, etc*/#defineLV_USE_FS_STDIO0#ifLV_USE_FS_STDIO#defineLV_FS_STDIO_LETTER'\0'/*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/#defineLV_FS_STDIO_PATH""/*Set the working directory. File/directory paths will be appended to it.*/#defineLV_FS_STDIO_CACHE_SIZE0/*>0 to cache this number of bytes in lv_fs_read()*/#endif/*API for open, read, etc*/#defineLV_USE_FS_POSIX0#ifLV_USE_FS_POSIX#defineLV_FS_POSIX_LETTER'\0'/*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/#defineLV_FS_POSIX_PATH""/*Set the working directory. File/directory paths will be appended to it.*/#defineLV_FS_POSIX_CACHE_SIZE0/*>0 to cache this number of bytes in lv_fs_read()*/#endif/*API for CreateFile, ReadFile, etc*/#defineLV_USE_FS_WIN320#ifLV_USE_FS_WIN32#defineLV_FS_WIN32_LETTER'\0'/*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/#defineLV_FS_WIN32_PATH""/*Set the working directory. File/directory paths will be appended to it.*/#defineLV_FS_WIN32_CACHE_SIZE0/*>0 to cache this number of bytes in lv_fs_read()*/#endif/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/#defineLV_USE_FS_FATFS0#ifLV_USE_FS_FATFS#defineLV_FS_FATFS_LETTER'\0'/*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/#defineLV_FS_FATFS_CACHE_SIZE0/*>0 to cache this number of bytes in lv_fs_read()*/#endif/*PNG decoder library*/#defineLV_USE_PNG0/*BMP decoder library*/#defineLV_USE_BMP0/* JPG + split JPG decoder library.
* Split JPG is a custom format optimized for embedded systems. */#defineLV_USE_SJPG0/*GIF decoder library*/#defineLV_USE_GIF0/*QR code library*/#defineLV_USE_QRCODE0/*FreeType library*/#defineLV_USE_FREETYPE0#ifLV_USE_FREETYPE/*Memory used by FreeType to cache characters [bytes] (-1: no caching)*/#defineLV_FREETYPE_CACHE_SIZE(16*1024)#ifLV_FREETYPE_CACHE_SIZE >=0/* 1: bitmap cache use the sbit cache, 0:bitmap cache use the image cache. *//* sbit cache:it is much more memory efficient for small bitmaps(font size < 256) *//* if font size >= 256, must be configured as image cache */#defineLV_FREETYPE_SBIT_CACHE0/* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. *//* (0:use system defaults) */#defineLV_FREETYPE_CACHE_FT_FACES0#defineLV_FREETYPE_CACHE_FT_SIZES0#endif#endif/*Rlottie library*/#defineLV_USE_RLOTTIE0/*FFmpeg library for image decoding and playing videos
*Supports all major image formats so do not enable other image decoder with it*/#defineLV_USE_FFMPEG0#ifLV_USE_FFMPEG/*Dump input information to stderr*/#defineLV_FFMPEG_AV_DUMP_FORMAT0#endif/*-----------
* Others
*----------*//*1: Enable API to take snapshot for object*/#defineLV_USE_SNAPSHOT0/*1: Enable Monkey test*/#defineLV_USE_MONKEY0/*1: Enable grid navigation*/#defineLV_USE_GRIDNAV0/*==================
* EXAMPLES
*==================*//*Enable the examples to be built with the library*/#defineLV_BUILD_EXAMPLES1/*===================
* DEMO USAGE
====================*//*Show some widget. It might be required to increase `LV_MEM_SIZE` */#defineLV_USE_DEMO_WIDGETS0#ifLV_USE_DEMO_WIDGETS#defineLV_DEMO_WIDGETS_SLIDESHOW0#endif/*Demonstrate the usage of encoder and keyboard*/#defineLV_USE_DEMO_KEYPAD_AND_ENCODER0/*Benchmark your system*/#defineLV_USE_DEMO_BENCHMARK0/*Stress test for LVGL*/#defineLV_USE_DEMO_STRESS0/*Music player demo*/#defineLV_USE_DEMO_MUSIC1#ifLV_USE_DEMO_MUSIC#defineLV_DEMO_MUSIC_SQUARE0#defineLV_DEMO_MUSIC_LANDSCAPE0#defineLV_DEMO_MUSIC_ROUND0#defineLV_DEMO_MUSIC_LARGE0#defineLV_DEMO_MUSIC_AUTO_PLAY1#endif/*--END OF LV_CONF_H--*/#endif/*LV_CONF_H*/#endif/*End of "Content enable"*/
lv_conf.h配置好后,直接上主程序main.c
③main.c
(该可跑例程压缩包上传到了我的资源,有问题的可以下载对比试试)
#include<TFT_eSPI.h>#include<CST816S.h>#include<lvgl.h>
CST816S touch(21,22,5,32);// sda, scl, rst, irq
TFT_eSPI tft =TFT_eSPI();/* TFT instance */staticconstuint16_t screenWidth =240;staticconstuint16_t screenHeight =280;staticlv_disp_draw_buf_t draw_buf;staticlv_color_t buf[screenWidth *10];voidmy_disp_flush(lv_disp_drv_t*disp,constlv_area_t*area,lv_color_t*color_p){uint32_t w =(area->x2 - area->x1 +1);uint32_t h =(area->y2 - area->y1 +1);
tft.startWrite();
tft.setAddrWindow(area->x1, area->y1, w, h);
tft.pushColors((uint16_t*)&color_p->full, w * h, true);
tft.endWrite();lv_disp_flush_ready(disp);}voidmy_touchpad_read(lv_indev_drv_t*indev_driver,lv_indev_data_t*data){if(touch.available()){
data->state = LV_INDEV_STATE_PR;/*Set the coordinates*/
data->point.x = touch.data.x;
data->point.y = touch.data.y;
Serial.print("Data x ");
Serial.println(touch.data.x);
Serial.print("Data y ");
Serial.println(touch.data.y);}else{
data->state = LV_INDEV_STATE_REL;}}staticvoidbtn_event_cb(lv_event_t*e){lv_event_code_t code =lv_event_get_code(e);lv_obj_t*btn =lv_event_get_target(e);if(code == LV_EVENT_CLICKED){staticuint8_t cnt =0;
cnt++;/*Get the first child of the button which is the label and change its text*/lv_obj_t*label =lv_obj_get_child(btn,0);lv_label_set_text_fmt(label,"Button: %d", cnt);}}voidlv_example_get_started_1(void){lv_obj_t*btn =lv_btn_create(lv_scr_act());/*Add a button the current screen*/lv_obj_set_size(btn,120,50);/*Set its size*/lv_obj_align(btn, LV_ALIGN_CENTER,0,0);lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_ALL,NULL);/*Assign a callback to the button*/lv_obj_t*label =lv_label_create(btn);/*Add a label to the button*/lv_label_set_text(label,"Button");/*Set the labels text*/lv_obj_center(label);}voidsetup(){pinMode(14, OUTPUT);digitalWrite(14, HIGH);
Serial.begin(115200);
touch.begin();
tft.begin();
tft.setRotation(0);lv_init();
tft.fillScreen(TFT_BLACK);lv_disp_draw_buf_init(&draw_buf, buf,NULL, screenWidth *10);staticlv_disp_drv_t disp_drv;lv_disp_drv_init(&disp_drv);
disp_drv.hor_res = screenWidth;
disp_drv.ver_res = screenHeight;
disp_drv.flush_cb = my_disp_flush;
disp_drv.draw_buf =&draw_buf;lv_disp_drv_register(&disp_drv);staticlv_indev_drv_t indev_drv;lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read_cb = my_touchpad_read;lv_indev_drv_register(&indev_drv);/*编写你自己的代码*/lv_example_get_started_1();}voidloop(){lv_timer_handler();/* let the GUI do its work */delay(5);}
编译通过后直接上传烧录即可
效果演示(每按一下按钮就会进行累加):
至此,移植搭建成功(ps:有时颜色可能会不对,我也不知道为啥…)
版权归原作者 索子也敲代码 所有, 如有侵权,请联系我们删除。