PlatformIO基于ESP32S2的SPI软串口LCD屏调试

这篇博客介绍了如何在ESP32S2上使用PlatformIO和Arduino库通过SPI接口来驱动320*240分辨率的LCD屏。文章详细阐述了准备过程,包括修改库文件以适应ESP32S2,以及进行了全屏检测和图形测试的步骤。参考了特定的Arduino库和LCD屏资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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.
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值