VSCode PlatformIO Arduino ESP32S2 SPI LCD 320*240
SPI串口LCD屏使用较少的IO,适用于ESP32系列这种IO口不算太多的MCU。由于lcdwiki.com提供的案例程序包括Arduino,但是并不完全适用于ESP32,需要做小幅调整。以下以2.8寸SPI型号ILI9341为例。
一、准备工作
下载SPI屏配套程序http://www.lcdwiki.com/res/Program/Common_SPI/2.8inch/SPI_ILI9341_MSP2807_V1.1/2.8inch_SPI_Module_ILI9341_MSP2807_V1.1.zip,里面包括Arduino库和示例程序。由于ESP32硬件SPI口数量有限,我们使用软件虚拟实现SPI驱动,这里参考案例文件夹Demo_Mega2560_Software_SPI。
但是对于ESP32和ESP32S2,需要对Arduino库文件进行修改,主要改动数据类型定义。我们直接使用Prentice David修改好的LCDWIKI_SPI(https://github.com/prenticedavid/LCDWIKI_SPI)和LCDWIKI_GUI(https://github.com/prenticedavid/LCDWIKI_GUI)。
二、测试
1.全屏检测
复制clear_screen代码,对引脚和参数进行小幅修改,我用的是Nodemcu-32-S2开发板,示例代码如下:
// IMPORTANT: LCDWIKI_SPI LIBRARY MUST BE SPECIFICALLY
//This program is a demo of clearing screen to display black,white,red,green,blue.
#include <Arduino.h>
#include <LCDWIKI_GUI.h> //Core graphics library
#include <LCDWIKI_SPI.h> //Hardware-specific library
//paramters define
#define MODEL ILI9341 //2.8inch_SPI_Module
#define MISO 3
#define LED 4 //if you don't need to control the LED pin,you should set it to -1 and set it to 3.3V
#define SCK 5
#define MOSI 6
#define DC 7
#define RESET 8
#define CS 9
//the definiens of software spi mode as follow:
//if the IC model is known or the modules is unreadable,you can use this constructed function
LCDWIKI_SPI mylcd(MODEL,CS,DC,MISO,MOSI,RESET,SCK,LED); //model,cs,dc,miso,mosi,reset,sck,led
//if the IC model is not known and the modules is readable,you can use this constructed function
//LCDWIKI_SPI mylcd(240,320,CS,DC,MISO,MOSI,RESET,SCK,LED); //width,height,cs,dc,miso,mosi,reset,sck,led
void setup()
{
mylcd.Init_LCD(); //initialize lcd
mylcd.Fill_Screen(0xFFFF); //display white
}
void loop()
{
//Sequential display black,white,red,green,blue
mylcd.Fill_Screen(0,0,0);
mylcd.Fill_Screen(255,255,255);
mylcd.Fill_Screen(255,0,0);
mylcd.Fill_Screen(0,255,0);
mylcd.Fill_Screen(0,0,255);
delay(3000);
mylcd.Fill_Screen(0x0000);
delay(1000);
mylcd.Fill_Screen(0xFFFF);
delay(1000);
mylcd.Fill_Screen(0xF800);
delay(1000);
mylcd.Fill_Screen(0x07E0);
delay(1000);
mylcd.Fill_Screen(0x001F);
delay(1000);
}
2.图形测试
复制colligate_test代码,对引脚和参数进行小幅修改,注意这里面如果不修改字符组数据定义的话,会如下报错,导致编译失败。对show_string和show_str定义的数据类型进行修改,改为const char后完成。
示例代码如下:
// IMPORTANT: LCDWIKI_SPI LIBRARY MUST BE SPECIFICALLY
//This program is a demo of how to use most of the functions
//of the library with a supported display modules.
#include <Arduino.h>
#include <LCDWIKI_GUI.h> //Core graphics library
#include <LCDWIKI_SPI.h> //Hardware-specific library
//paramters define
#define MODEL ILI9341
#define MISO 3
#define LED 4 //if you don't need to control the LED pin,you should set it to -1 and set it to 3.3V
#define SCK 5
#define MOSI 6
#define DC 7
#define RESET 8
#define CS 9
//the definiens of software spi mode as follow:
//if the IC model is known or the modules is unreadable,you can use this constructed function
LCDWIKI_SPI my_lcd(MODEL,CS,DC,MISO,MOSI,RESET,SCK,LED); //model,cs,dc,miso,mosi,reset,sck,led
//if the IC model is not known and the modules is readable,you can use this constructed function
//LCDWIKI_SPI my_lcd(240,320,CS,DC,MISO,MOSI,RESET,SCK,LED); //width,height,cs,dc,miso,mosi,reset,sck,led
void show_string(const char *str,int16_t x,int16_t y,uint8_t csize,uint16_t fc, uint16_t bc,boolean mode)
{
my_lcd.Set_Text_Mode(mode);
my_lcd.Set_Text_Size(csize);
my_lcd.Set_Text_colour(fc);
my_lcd.Set_Text_Back_colour(bc);
my_lcd.Print_String(str,x,y);
}
//display main surface
unsigned long show_text(void)
{
unsigned long time_start = micros();
my_lcd.Set_Draw_color(32, 0,255);
my_lcd.Fill_Rectangle(0, 0, my_lcd.Get_Display_Width()-1, 14);
show_string("* Universal Color TFT Display Library *",CENTER,3,1,0x07E0, 0,1);
my_lcd.Set_Draw_color(128, 128, 128);
my_lcd.Fill_Rectangle(0, my_lcd.Get_Display_Height()-15, my_lcd.Get_Display_Width()-1, my_lcd.Get_Display_Height()-1);
show_string("<http://www.lcdwiki.com>",CENTER,my_lcd.Get_Display_Height()-11,1,0xFFFF, 0,1);
my_lcd.Set_Draw_color(255, 0, 0);
my_lcd.Draw_Rectangle(0, 15, my_lcd.Get_Display_Width()-1, my_lcd.Get_Display_Height()-16);
return micros() - time_start;
}
//display triangle functions
unsigned long show_triangle_function(void)
{
uint16_t i;
unsigned long time_start = micros();
// Draw crosshairs
my_lcd.Set_Draw_color(0, 0, 255);
my_lcd.Draw_Fast_VLine(my_lcd.Get_Display_Width()/2-1, 16, my_lcd.Get_Display_Height()- 32);
my_lcd.Draw_Fast_HLine(1, my_lcd.Get_Display_Height()/2-1, my_lcd.Get_Display_Width()-2);
for(i = 1;i <= (my_lcd.Get_Display_Height()- 32)/2/10;i++)
{
my_lcd.Draw_Fast_HLine(my_lcd.Get_Display_Width()/2-1-2, my_lcd.Get_Display_Height()/2-1-i*10, 5);
my_lcd.Draw_Fast_HLine(my_lcd.Get_Display_Width()/2-1-2, my_lcd.Get_Display_Height()/2-1+i*10, 5);
}
for(i = 1;i <= (my_lcd.Get_Display_Width()-2)/2/10;i++)
{
my_lcd.Draw_Fast_VLine(my_lcd.Get_Display_Width()/2-1-i*10, my_lcd.Get_Display_Height()/2-1-2, 5);
my_lcd.Draw_Fast_VLine(my_lcd.Get_Display_Width()/2-1+i*10, my_lcd.Get_Display_Height()/2-1-2, 5);
}
// Draw sin lines
show_string("sin",5,17,1,0x07FF, 0,0);
my_lcd.Set_Draw_color(0, 255, 255);
for (i=1; i<my_lcd.Get_Display_Width()-2; i++)
{
my_lcd.Draw_Pixel(i,my_lcd.