2.0寸240x320 ST7789V2彩屏与ColorEasyDuino开发板SPI驱动实战
2.0寸240x320 ST7789V2彩屏与ColorEasyDuino开发板SPI驱动实战最近在给ColorEasyDuino开发板找一块合适的彩色显示屏用来做个小项目的人机界面。网上挑来挑去选中了这款2.0寸、分辨率240x320、驱动芯片是ST7789V2的TFT彩屏。到手后折腾了一下发现网上资料比较零散索性把从硬件连接到软件驱动的完整过程整理出来分享给同样在用这块板子或者类似Arduino板子的朋友。跟着这篇教程走你就能让这块彩屏亮起来显示你自己的内容。1. 认识你的2.0寸彩屏在动手接线和写代码之前咱们先花两分钟了解一下手里这块屏幕的基本情况这对接线和理解后面的代码很有帮助。这块屏幕的核心是ST7789V2驱动芯片这是一款在中小尺寸TFT彩屏里非常常见的驱动IC。屏幕的分辨率是240x320也就是横向240个像素点纵向320个像素点。对于2.0寸的尺寸来说这个清晰度足够了。它的工作电压是3.3V这点非常重要直接关系到硬件连接是否正确。屏幕在工作时电流大约在90mA左右ColorEasyDuino开发板上的3.3V电源输出是完全可以带动的。通信方面它使用的是SPI协议。SPI是一种高速、全双工的同步通信协议简单理解就是屏幕和单片机之间用几根线按照特定的时钟节奏来传输数据和控制命令。这种方式比并口省了很多引脚特别适合引脚资源紧张的单片机。为了方便大家快速查阅我把屏幕的关键规格整理成了下面这个表格参数项规格说明屏幕尺寸2.0英寸分辨率240 (水平) x 320 (垂直) RGB像素驱动芯片ST7789V2通信接口SPI (串行外设接口)工作电压3.3V工作电流~90mA模块尺寸36mm (高) x 63.2mm (宽)引脚接口8 Pin2.54mm间距排针屏幕模块引出了8个引脚我们需要把这8根线正确地接到ColorEasyDuino开发板上。2. 硬件连接把屏幕接到开发板上硬件连接是第一步也是容易出错的一步。接线错了屏幕肯定不亮。咱们根据屏幕的引脚定义一根一根地对接到ColorEasyDuino开发板上。注意不同厂家生产的同型号屏幕引脚顺序和定义可能有细微差别。最稳妥的方法是查看你购买屏幕时商家提供的资料。下面的连接方式是基于提供的资料适用于大多数情况。你需要准备一些杜邦线公对母的就行。屏幕的8个引脚和ColorEasyDuino开发板的连接关系如下TFT_VCC- 开发板的3.3V引脚重要提醒这里必须接3.3V虽然有些教程里说可以接5V但根据屏幕规格书其工作电压是3.3V接5V有烧毁风险。TFT_GND- 开发板的GND引脚接地TFT_SCL- 开发板的SCK (13号数字引脚)这是SPI的时钟线由主设备开发板产生同步数据收发。TFT_SDA- 开发板的MOSI (11号数字引脚)这是SPI的主设备输出、从设备输入线开发板通过这根线向屏幕发送数据和命令。TFT_RES- 开发板的9号数字引脚这是复位引脚Reset用于硬件复位屏幕。可以接一个普通的数字IO口来控制。TFT_DC- 开发板的8号数字引脚这是数据/命令选择引脚Data/Command。告诉屏幕接下来发送的是命令如设置地址、旋转方向还是实际要显示的像素数据。这个引脚也必须接一个数字IO口。TFT_CS- 开发板的10号数字引脚这是片选引脚Chip Select。当SPI总线上挂载多个设备时用这个引脚来选择当前要和哪个设备通信。即使只有一个屏幕也需要连接并控制它。TFT_BLK- 开发板的3.3V引脚这是背光控制引脚。接3.3V就是让背光常亮。如果你想控制屏幕背光的开关比如做省电模式可以把它接到另一个数字IO口上通过程序控制高低电平。连接好之后建议你仔细检查两遍尤其是电源和地线不要接反。确认无误后就可以给ColorEasyDuino开发板上电了。此时屏幕背光应该会亮起显示可能是白屏或花屏这是正常的因为还没初始化。3. 软件准备安装必要的Arduino库硬件通了接下来就是软件环境。我们不需要从零开始写驱动ST7789V2的底层代码那样太复杂了。Arduino生态的好处就是有丰富的开源库。对于这块屏幕我们将使用Adafruit公司维护的两个非常优秀的库。打开Arduino IDE。确保你已经安装好了Arduino IDE并且ColorEasyDuino开发板的支持包也已经安装通常通过开发板管理器搜索安装。打开库管理器。点击菜单栏的工具-管理库...。搜索并安装库。在搜索框中输入Adafruit GFX Library。这个库是Adafruit图形库的核心提供了画点、线、圆、矩形、显示文字等基本图形功能。找到后点击“安装”。再次搜索Adafruit ST7789。这个库是针对ST7789系列驱动芯片的硬件底层驱动它依赖于上面的GFX库。找到后同样点击“安装”。安装完成后这两个库的示例代码也会一并安装。你可以在文件-示例菜单中找到Adafruit ST7789的例程不过我们今天要针对240x320的屏幕自己写一个。4. 手把手编写驱动代码库安装好了现在来写我们自己的“Hello World”程序。我会把代码分成几块并详细解释每一部分的作用。4.1 包含头文件与引脚定义首先在代码的开头我们需要引入刚才安装的库并定义屏幕连接到的具体引脚。// 引入必要的图形库和驱动库 #include Adafruit_GFX.h // Adafruit通用图形库 #include Adafruit_ST7789.h // ST7789系列屏幕专用驱动库 // 根据我们的硬件连接定义引脚 #define TFT_CS 10 // 屏幕片选引脚接开发板D10 #define TFT_RST 9 // 屏幕复位引脚接开发板D9 #define TFT_DC 8 // 屏幕数据/命令选择引脚接开发板D8这里注意TFT_RST引脚。如果你不想使用硬件复位即不接RESET线可以将它设置为-1库会尝试使用软件复位。但为了可靠性咱们硬件接了这里就按实际引脚定义。4.2 初始化屏幕对象接下来我们需要创建一个屏幕对象它将是我们在程序里控制屏幕的主要接口。// 创建ST7789屏幕对象传入CS, DC, RST引脚定义 Adafruit_ST7789 tft Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);这个tft对象就代表了我们连接的这块屏幕后续所有操作比如清屏、画图、写字都是通过调用这个对象的方法来完成。4.3 设置函数 (setup)setup函数在开发板上电或复位后只运行一次我们在这里完成屏幕的初始化设置。void setup() { // 初始化屏幕传入分辨率宽度高度 tft.init(240, 320); // 对于这块2.0寸屏就是240x320 // 设置屏幕旋转方向。参数可以是0, 1, 2, 3 // 尝试不同的值直到屏幕显示方向符合你的安装方式 tft.setRotation(2); // 用黑色填充整个屏幕相当于清屏 tft.fillScreen(ST77XX_BLACK); // 设置文本显示大小。1是默认大小2是两倍大以此类推 tft.setTextSize(2); // 设置文本颜色为白色 tft.setTextColor(ST77XX_WHITE); // 设置文本开始显示的坐标 (x, y)。屏幕左上角是(0,0) tft.setCursor(5, 100); // 打印“Hello, World”到屏幕上 tft.print(Hello, World); }这里有几个关键点tft.init(240, 320)这是最容易出错的地方很多网上例程默认是135x240或240x240我们必须明确指定为这块屏幕的实际分辨率240x320。tft.setRotation(2)设置显示方向。如果发现字是横着的或者反的就修改这个参数0, 1, 2, 3试试。4.4 循环函数 (loop)loop函数会不停地循环执行。我们在这里让屏幕动态显示一个不断递增的数字。// 定义一个全局变量用于计数。放在程序最开始的引脚定义之后。 char i 48; // ASCII码 48 对应字符 0 void loop() { // 设置新的显示坐标 tft.setCursor(50, 50); // 在绘制新数字前用黑色方块覆盖旧数字的区域 // fillRect(x坐标, y坐标, 宽度, 高度, 颜色) tft.fillRect(50, 50, 16, 16, ST77XX_BLACK); // 打印变量 i 对应的字符 tft.print(i); // 变量 i 自增 i; // 等待1000毫秒1秒 delay(1000); }这段代码的效果是在屏幕的(50, 50)位置每秒显示一个字符从‘0’开始依次显示‘1’, ‘2’... 因为print函数会直接接着上一次的位置打印所以我们在打印新数字前先用一个黑色方块把原来的数字“擦掉”。4.5 完整代码清单把上面的所有部分组合起来就是完整的可运行程序。你可以将这段代码复制到Arduino IDE中。#include Adafruit_GFX.h // 引入Adafruit GFX库 #include Adafruit_ST7789.h // 引入Adafruit ST7789库 #define TFT_CS 10 #define TFT_RST 9 // 接有硬件复位引脚所以这里不是-1 #define TFT_DC 8 Adafruit_ST7789 tft Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST); char i 48; // 从字符‘0’开始 void setup() { tft.init(240, 320); // 初始化屏幕指定分辨率为240x320 tft.setRotation(2); // 设置屏幕旋转方向根据实际情况调整 tft.fillScreen(ST77XX_BLACK); // 全屏刷新为黑色 tft.setTextSize(2); // 设置字体大小 tft.setTextColor(ST77XX_WHITE); // 设置字体颜色 tft.setCursor(5, 100); // 设置开始显示的坐标 tft.print(Hello, World); // 显示静态文本 } void loop() { tft.setCursor(50, 50); // 设置动态内容的显示坐标 tft.fillRect(50, 50, 16, 16, ST77XX_BLACK); // 清除上一秒显示的数字 tft.print(i); // 显示当前字符 i; // 字符递增 delay(1000); // 延时1秒 }5. 上传验证与问题排查选择开发板与端口在Arduino IDE中选择工具-开发板-Arduino Uno因为ColorEasyDuino通常兼容Uno。然后选择正确的串口端口。编译上传点击右上角的“上传”按钮向右的箭头。IDE会先编译代码然后上传到开发板。观察现象上传成功后屏幕应该先全黑然后在中间偏上位置显示“Hello, World”在左上区域坐标50,50有一个每秒变化一次的数字。如果屏幕没有按预期显示可以按照以下步骤排查屏幕完全无背光检查TFT_VCC和TFT_BLK是否都接到了3.3V。检查TFT_GND是否接好。用万用表测量开发板3.3V引脚是否有输出。背光亮但白屏或花屏重点检查tft.init(240, 320)这行代码确认参数是240, 320而不是其他值。检查TFT_RST、TFT_DC、TFT_CS的接线是否与代码中的定义9, 8, 10一致。尝试修改tft.setRotation()的参数0, 1, 2, 3。检查SPI引脚SCK-13,MOSI-11是否接错。显示内容错位或只有一部分通常是setRotation设置的方向不对尝试其他值。确认代码中设置的坐标(x, y)在屏幕分辨率240x320范围内。到这里你的2.0寸彩屏应该已经在ColorEasyDuino开发板上成功点亮并显示内容了。这个基础程序跑通后你就可以利用Adafruit GFX库提供的丰富函数如画线drawLine、画圆drawCircle、显示图片drawBitmap去创造更复杂的图形界面了。