Arduino-ILI9341驱动介绍二
1.概述
第一篇文章介绍了Arduino-点亮TFT触摸屏,没有介绍如何改变屏幕的内容。这篇文章介绍Arduino-使用ILI9341驱动控制TFT触摸屏原理和ILI9341驱动源代码设计原理以及常用函数
2.Arduino控制TFT触控屏原理
- Arduino使用什么方式控制屏幕取决于屏幕的驱动芯片和他的通信方式,在第一篇文章中介绍的TFT屏可以使用SPI通讯方式与Arduino通信,该屏幕集成了Adafruit_ILI9341驱动,通过该驱动控制屏幕显示内容。
- 掌握了Adafruit_ILI9341驱动的使用就可以使用 Arduino控制TFT触控屏显示设置好的内容。
3.ILI9341驱动程序原理
3.1.ILI9341驱动源代码
1.ILI9341继承体系
Adafruit_ILI9341驱动封装好了操作TFT屏幕的函数,只要调用写好的函数就可以编辑屏幕的内容
Adafruit_ILI9341驱动是Adafruit包中的一个类文件,只有该类还不能完成操作TFT屏幕,因此他还继承了其他类的函数。该类的继承关系如下
Adafruit_ILI9341类
——>继承Adafruit_SPITFT类
;Adafruit_SPITFT类
——>继承Adafruit_GFX类
;- 因此
Adafruit_ILI9341类
间接——>继承Adafruit_GFX类
,该类拥有了Adafruit_SPITFT类
和Adafruit_GFX类
函数。
各个类库作用
名称 | 作用 |
---|---|
Adafruit_GFX | 实现了向屏幕输出字符串和各种形状的图形 |
Adafruit_SPITFT | 控制SPI通信数据传输 |
Adafruit_ILI9341 | 实现了选择屏幕通信方式以及初始化屏幕信息 |
2.查看ILI9341继承体系过程和方法
1.查看Adafruit_ILI9341继承关系
在GitHub中搜索Adafruit_ILI9341项目,查看该项目的Adafruit_ILI9341.h文件,地址如下
https://github.com/adafruit/Adafruit_ILI9341/blob/master/Adafruit_ILI9341.h
查看该文件源代码可以看到他继承了Adafruit_SPITFT
// Adafruit_ILI9341 继承 Adafruit_SPITFT
class Adafruit_ILI9341 : public Adafruit_SPITFT {
public:
Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _MOSI, int8_t _SCLK,
int8_t _RST = -1, int8_t _MISO = -1);
Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _RST = -1);
...
}
2.查看Adafruit_SPITFT继承关系
在GitHub中搜索Adafruit_GFX项目,查看该项目的Adafruit_SPITFT.h文件,地址如下
https://github.com/adafruit/Adafruit-GFX-Library/blob/master/Adafruit_SPITFT.h
查看该文件源代码可以看到他继承了Adafruit_GFX
class Adafruit_SPITFT : public Adafruit_GFX {
3.2.Adafruit_ILI9341源代码介绍
Adafruit_ILI9341.h文件源代码做了三件事情
// 1.为各个地址创建引用的变量
#define ILI9341_TFTWIDTH 240 ///< ILI9341 max TFT width
#define ILI9341_TFTHEIGHT 320 ///< ILI9341 max TFT height
#define ILI9341_NOP 0x00 ///< No-op register
#define ILI9341_SWRESET 0x01 ///< Software reset register
#define ILI9341_RDDID 0x04 ///< Read display identification information
#define ILI9341_RDDST 0x09 ///< Read Display Status
...
...
...
//2.定义颜色对应的编码地址
// Color definitions
#define ILI9341_BLACK 0x0000 ///< 0, 0, 0
#define ILI9341_NAVY 0x000F ///< 0, 0, 123
#define ILI9341_DARKGREEN 0x03E0 ///< 0, 125, 0
...
...
...
//3.创建该类的构造器和函数
class Adafruit_ILI9341 : public Adafruit_SPITFT {
public:
Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _MOSI, int8_t _SCLK,
int8_t _RST = -1, int8_t _MISO = -1);
Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _RST = -1);
#if !defined(ESP8266)
Adafruit_ILI9341(SPIClass *spiClass, int8_t dc, int8_t cs = -1,
int8_t rst = -1);
#endif // end !ESP8266
Adafruit_ILI9341(tftBusWidth busWidth, int8_t d0, int8_t wr, int8_t dc,
int8_t cs = -1, int8_t rst = -1, int8_t rd = -1);
void begin(uint32_t freq = 0);
void setRotation(uint8_t r);
void invertDisplay(bool i);
void scrollTo(uint16_t y);
void setScrollMargins(uint16_t top, uint16_t bottom);
// Transaction API not used by GFX
void setAddrWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h);
uint8_t readcommand8(uint8_t reg, uint8_t index = 0);
};
4.ILI9341驱动控制TFT触控屏基础使用
1.硬件电路
Arduino接口端 | TFT触摸屏端 |
---|---|
5V | VCC |
GND | GND |
10 | 串联10KΩ电阻到CS |
8 | 串联10KΩ电阻到REST |
9 | 串联10KΩ电阻到DC |
11 | 串联10KΩ电阻到MOSI |
13 | 串联10KΩ电阻到SCK |
VCC | LED |
12 | MISO |
2.ILI9341驱动代码
下面演示一个最简单的入门示例,通过ILI9341驱动提供的函数向显示屏输出文字。
#include "Adafruit_ILI9341.h"
// 定义引脚功能
#define TFT_DC 9
#define TFT_CS 10
#define TFT_RST 8
#define TFT_MISO 12
#define TFT_MOSI 11
#define TFT_CLK 13
// 1.创建Adafruit_ILI9341类的对象tft,传入SPI引脚参数,
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
void setup() {
Serial.begin(9600);
Serial.println("ILI9341 Test!");
//2.初始化tft
tft.begin();
//在IDE控制台输出调试信息
Serial.print(F("Text "));
Serial.println(testText());
delay(3000);
Serial.println(F("Done!"));
}
void loop(void) {
//调用函数输出文本内容
testText();
}
// 创建函数定义ILI9341驱动操作屏幕输出字符串的功能
unsigned long testText() {
//设置背景颜色
tft.fillScreen(ILI9341_BLACK);
unsigned long start = micros();
// 设置文字显示的坐标
tft.setCursor(100, 100);
//设置文字颜色和字号
tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1);
//设置屏幕输出文字内容
tft.println("Hello World!");
tft.setTextColor(ILI9341_YELLOW); tft.setTextSize(2);
tft.println(1234.56);
tft.setTextColor(ILI9341_RED); tft.setTextSize(3);
return micros() - start;
}