37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百五十三:2.4寸TFT液晶触摸屏 彩屏模块 可直插UNO R3 Mega2560开发板
![](https://img.haomeiwen.com/i17690760/e3c75335de1d92a1.jpg)
2.4寸TFT液晶触摸屏模块主要特性
支持ArduinoUNO 和Mega2560等开发板直插使用,无需接线
320X240分辨率,显示效果清晰,支持触摸功能
支持16位RGB 65K颜色显示,显示色彩丰富
采用8位并行总线,比串口SPI刷新快
板载 5V/3.3V 电平转换 IC,兼容 5V/3.3V 工作电压
带SD卡槽方便扩展实验
提供Arduino库,提供丰富的示例程序
军工级工艺标准,长期稳定工作
提供底层驱动技术支持
![](https://img.haomeiwen.com/i17690760/1e263f028aef2381.jpg)
![](https://img.haomeiwen.com/i17690760/e6c8efa529b23edd.jpg)
2.4寸TFT液晶触摸屏模块接口定义
![](https://img.haomeiwen.com/i17690760/8a228d979d2e04c7.jpg)
与Arduino连接
![](https://img.haomeiwen.com/i17690760/56f9a3e2e3739bd4.jpg)
实验开源程序
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百六十五:2.4寸TFT液晶触摸屏 彩屏模块 TFT-LCD 高清真彩显示屏
实验项目一:滚动满屏滚动显示红绿蓝三色,画出222个空心矩形和16个实心矩形
模块直插,引脚用法如下:
LCD_CS LCD_CD LCD_WR LCD_RD LCD_RST SD_SS SD_DI SD_DO SD_SCK
Arduino Uno A3 A2 A1 A0 A4 10 11 12 13
LCD_D0 LCD_D1 LCD_D2 LCD_D3 LCD_D4 LCD_D5 LCD_D6 LCD_D7
Arduino Uno 8 9 2 3 4 5 6 7
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百五十三:2.4寸TFT液晶触摸屏 彩屏模块 可直插UNO R3 Mega2560开发板
实验项目一:滚动满屏滚动显示红绿蓝三色,画出222个空心矩形和16个实心矩形
模块直插,引脚用法如下:
LCD_CS LCD_CD LCD_WR LCD_RD LCD_RST SD_SS SD_DI SD_DO SD_SCK
Arduino Uno A3 A2 A1 A0 A4 10 11 12 13
LCD_D0 LCD_D1 LCD_D2 LCD_D3 LCD_D4 LCD_D5 LCD_D6 LCD_D7
Arduino Uno 8 9 2 3 4 5 6 7
*/
#define LCD_RD A0
#define LCD_WR A1
#define LCD_RS A2
#define LCD_CS A3
#define LCD_REST A4
//实现总线写入的最底层操作。在该函数调用前需设定好REST,RD,RS,CS提前置高。在SETUP主体中可以看到。
void Lcd_Writ_Bus(unsigned char d) {
PORTD = (PORTD & B00000011) | ((d) & B11111100); //将d的2-7位写入PORTD的2-7位
PORTB = (PORTB & B11111100) | ((d) & B00000011); //将d的0-1位写入PROTB的0-1位
//*(portOutputRegister(digitalPinToPort(LCD_WR))) &= ~digitalPinToBitMask(LCD_WR);
//*(portOutputRegister(digitalPinToPort(LCD_WR)))|= digitalPinToBitMask(LCD_WR);
digitalWrite(LCD_WR, LOW);
digitalWrite(LCD_WR, HIGH);
}
//在总线上写入命令。写入前要置RS引脚为低电平。
void Lcd_Write_Com(unsigned char VH) {
*(portOutputRegister(digitalPinToPort(LCD_RS))) &= ~digitalPinToBitMask(LCD_RS);//LCD_RS=0;
Lcd_Writ_Bus(VH);
}
//在总线上写入数据。写入前要置RS引脚为高电平。
void Lcd_Write_Data(unsigned char VH) {
*(portOutputRegister(digitalPinToPort(LCD_RS))) |= digitalPinToBitMask(LCD_RS); //LCD_RS=1;
Lcd_Writ_Bus(VH);
}
//写完一条指令后再写一8位的数据
void Lcd_Write_Com_Data(unsigned char com, unsigned char dat) {
Lcd_Write_Com(com);
Lcd_Write_Data(dat);
}
//地址区域设置。涉及指令2Ah、2Bh
void Address_set(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2) {
Lcd_Write_Com(0x2a);
Lcd_Write_Data(x1 >> 8); //设定屏幕数据操作区域的列首地址数据,,先写入16bit数据位的高位
Lcd_Write_Data(x1); //写入16bit数据位的低位
Lcd_Write_Data(x2 >> 8); //设定屏幕数据操作区域的列尾地址数据,,先写入16bit数据位的高位
Lcd_Write_Data(x2); //写入16bit数据位的低位
Lcd_Write_Com(0x2b);
Lcd_Write_Data(y1 >> 8); //设定屏幕数据操作区域的行首地址数据,,先写入16bit数据位的高位
Lcd_Write_Data(y1); //写入16bit数据位的低位
Lcd_Write_Data(y2 >> 8); //设定屏幕数据操作区域的行尾地址数据,,先写入16bit数据位的高位
Lcd_Write_Data(y2); //写入16bit数据位的低位
Lcd_Write_Com(0x2c); //开启RAM数据持续写入状态。
}
//面板初始化
void Lcd_Init(void) {
digitalWrite(LCD_REST, HIGH);
delay(5);
digitalWrite(LCD_REST, LOW);
delay(15);
digitalWrite(LCD_REST, HIGH);
delay(15); //到此为硬重置
digitalWrite(LCD_CS, HIGH); //根据MCU 8080-I 8bit通信接口操作规范,设置引脚的对应状态。
digitalWrite(LCD_WR, HIGH);
digitalWrite(LCD_CS, LOW); //片选有效
Lcd_Write_Com(0xCB); // 指令电源控制 A
Lcd_Write_Data(0x39);
Lcd_Write_Data(0x2C);
Lcd_Write_Data(0x00);
Lcd_Write_Data(0x34); //设置 Vcore=1.6V
Lcd_Write_Data(0x02); //设置 DDVDH=5.6V
Lcd_Write_Com(0xCF); // 指令电源控制 B
Lcd_Write_Data(0x00);
Lcd_Write_Data(0XC1);
Lcd_Write_Data(0X30);
Lcd_Write_Com(0xE8); //指令 Driver timing Congrol A
Lcd_Write_Data(0x85);
Lcd_Write_Data(0x00);
Lcd_Write_Data(0x78);
Lcd_Write_Com(0xEA); //指令 Driver timing Congrol B
Lcd_Write_Data(0x00);
Lcd_Write_Data(0x00);
Lcd_Write_Com(0xED); //指令 Power on sequence control
Lcd_Write_Data(0x64);
Lcd_Write_Data(0x03);
Lcd_Write_Data(0X12);
Lcd_Write_Data(0X81);
Lcd_Write_Com(0xF7); //指令 Pump ratio control
Lcd_Write_Data(0x20); //DDVDH=2*VCL
Lcd_Write_Com(0xC0); //功率控制
Lcd_Write_Data(0x23); //VRH[5:0] GVDD=4.6V
Lcd_Write_Com(0xC1); //Power control
Lcd_Write_Data(0x10); //SAP[2:0];BT[3:0]
Lcd_Write_Com(0xC5); //VCM control 1
Lcd_Write_Data(0x3e); //Contrast VCOMH=3.45V VCOML=-1.5V
Lcd_Write_Data(0x28);
Lcd_Write_Com(0xC7); //VCM control2
Lcd_Write_Data(0x86); //--
Lcd_Write_Com(0x36); // 内存访问控制
//Lcd_Write_Data(0x48); // MX=1 Column Address Order ; BGR=1 RGB(IC)-->BGR(LCD Panel)
Lcd_Write_Data(0x08); // MX=0,BGR =1
Lcd_Write_Com(0x3A); //指令Pixel Format Set
Lcd_Write_Data(0x55); //RGB 接口和MCU接口模式的像素数据格式为16bit/pixel
Lcd_Write_Com(0xB1); //帧率控制(B1h)(普通模式/全彩)
Lcd_Write_Data(0x00);
Lcd_Write_Data(0x18); //79HZ(frame rate)
Lcd_Write_Com(0xB6); //显示功能控制
Lcd_Write_Data(0x08); // 间隔扫描
Lcd_Write_Data(0x82); //底背景为白屏, 5 帧扫描周期
Lcd_Write_Data(0x27); //320线
Lcd_Write_Com(0x11); //退出睡眠
delay(120); //必须120ms的延迟
Lcd_Write_Com(0x29); //显示
Lcd_Write_Com(0x2c); //写入储存
}
//画水平线。。设定需填色的行列起止地址范围后往里填色
void H_line(unsigned int x, unsigned int y, unsigned int l, unsigned int c) {
//x,y 为水平线的起始坐标 ,,l为水平线长度单位为像素,c为颜色参数
unsigned int i, j;
Lcd_Write_Com(0x02c); //开始写内存
digitalWrite(LCD_RS, HIGH);
digitalWrite(LCD_CS, LOW);
l = l + x; //转换成终止列的X坐标
Address_set(x, y, l, y); //框出要填色的区域
j = l; //确定要填入的像素个数
for (i = 1; i <= j; i++) {
Lcd_Write_Data(c >> 8); //写入颜色数据的高8位
Lcd_Write_Data(c); //写入颜色数据的低8位
}
digitalWrite(LCD_CS, HIGH);
}
//画垂直线。。设定需填色的行列起止地址范围后往里填色
void V_line(unsigned int x, unsigned int y, unsigned int l, unsigned int c) {
unsigned int i, j;
Lcd_Write_Com(0x02c); //开始写内存
digitalWrite(LCD_RS, HIGH);
digitalWrite(LCD_CS, LOW);
l = l + y; //转换成终止行的Y坐标
Address_set(x, y, x, l); //框出要填色的区域
j = l; //确定要填入的像素个数
for (i = 1; i <= j; i++) {
Lcd_Write_Data(c >> 8); //写入颜色数据的高8位
Lcd_Write_Data(c); //写入颜色数据的低8位
}
digitalWrite(LCD_CS, HIGH);
}
//画空心矩形
void Rect(unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned int c) {
H_line(x , y , w, c);
H_line(x , y + h, w, c);
V_line(x , y , h, c);
V_line(x + w, y , h, c);
}
//画实心矩形
void Rectf(unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned int c) {
unsigned int i;
for (i = 0; i < h; i++) {
H_line(x , y + i, w, c);
}
}
int RGB(int r, int g, int b)
{ return r << 16 | g << 8 | b;
}
//满屏填充
void LCD_Clear(unsigned int j) {
unsigned int i, m;
digitalWrite(LCD_CS, LOW);
Address_set(0, 0, 239, 319);
for (i = 0; i < 320; i++) //320个行
for (m = 0; m < 240; m++) { //240列
Lcd_Write_Data(j >> 8);
Lcd_Write_Data(j);
}
digitalWrite(LCD_CS, HIGH);
}
void setup() {
Serial.begin(9600);
//以下为定义各个PIN脚的输入输出状态
for (int p = 0; p < 10; p++) {
pinMode(p, OUTPUT);
}
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(A4, OUTPUT);
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
digitalWrite(A4, HIGH);
Lcd_Init();//初始化面板
Serial.println("2.4寸Arduino TFT液晶屏准备就绪");
}
void loop() {
LCD_Clear(0xf800); //红色填满屏
LCD_Clear(0x07E0); //绿色填满屏
LCD_Clear(0x001F); //兰色填满屏
//空心矩形
for (int i = 0; i < 222; i++) {
Rect(random(300), random(300), random(300), random(300), random(65535)); // x, y 处的矩形, 高, 颜色
Serial.println("完成第" + String(i) + "个空心矩形");
}
//实心矩形
for (int i = 0; i < 16; i++) {
Rectf(random(300), random(300), random(300), random(300), random(65535)); // x, y 处的矩形, 高, 颜色
Serial.println("完成第" + String(i) + "个实心矩形");
}
}
实验串口返回情况
![](https://img.haomeiwen.com/i17690760/33014631cb07ab57.jpg)
Arduino实验场景图
![](https://img.haomeiwen.com/i17690760/e121e7c5fb592740.jpg)
实验一百五十三:2.4寸TFT液晶触摸屏 彩屏模块 可直插UNO R3 Mega2560开发板
项目一:滚动满屏滚动显示红绿蓝三色,画出222个空心矩形和16个实心矩形
![](https://img.haomeiwen.com/i17690760/c0d8c9293f02f5b1.gif)
实验视频40秒
https://v.youku.com/v_show/id_XNTE3NDE2ODQ2MA==.html?spm=a2hcb.playlsit.page.1
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百五十三:2.4寸TFT液晶触摸屏 彩屏模块 可直插UNO R3 Mega2560开发板
项目之二:清屏显示黑、白、红、绿、蓝色
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百五十三:2.4寸TFT液晶触摸屏 彩屏模块 可直插UNO R3 Mega2560开发板
项目之二:清屏显示黑、白、红、绿、蓝色
模块直插,引脚用法如下:
LCD_CS LCD_CD LCD_WR LCD_RD LCD_RST SD_SS SD_DI SD_DO SD_SCK
Arduino Uno A3 A2 A1 A0 A4 10 11 12 13
LCD_D0 LCD_D1 LCD_D2 LCD_D3 LCD_D4 LCD_D5 LCD_D6 LCD_D7
Arduino Uno 8 9 2 3 4 5 6 7
*/
#include <LCDWIKI_GUI.h> //导入核心图形库
#include <LCDWIKI_KBV.h> //导入特定硬件的库
//如果 IC 模型已知或模块不可读,则可以使用此构造函数
LCDWIKI_KBV mylcd(ILI9341, A3, A2, A1, A0, A4); //模型、CS、CD、WR、RD、重置
//如果 IC 模型未知且模块可读,则可以使用此构造函数
//LCDWIKI_KBV mylcd(240,320,A3,A2,A1,A0,A4);//宽度、高度、cs、cd、wr、rd、重置
void setup() {
Serial.begin(9600);
mylcd.Init_LCD(); //初始化液晶显示器
Serial.println(mylcd.Read_ID(), HEX);
mylcd.Fill_Screen(0xFFFF); //显示白色
}
void loop() {
//依次显示黑、白、红、绿、蓝
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);
}
项目之二:清屏显示黑、白、红、绿、蓝色
![](https://img.haomeiwen.com/i17690760/e3d5e6dddfa5ec61.gif)
网友评论