01-02: 1.8寸TFT模块详解
版权声明:Copyright © 2016-2019,Stardust Studio, All Rights Reserved
本文将从以下五个方面详细介绍TFT模块的使用:
一、入门
二、ST7735S DataSheet简介
三、寄存器配置
四、ST7735S和ST7735部分差异
五、外部电容触摸扩展(后期补充)
一、入门
在阅读后续内容时请先详细阅读:
1、TFT LCD显示原理详解(点击可进入:https://wenku.baidu.com/view/0482f0adb04e852458fb770bf78a6529647d359b.html)
2、ST7735S DataSheet(2011 V1.1)(提取码:i8pm,百度网盘一定要设提取码,我也没有办法)
二、ST7735S DataSheet简介
由于网上找不到中文DataSheet,因此笔者认真阅读了一下英文DataSheet,以下是简单介绍:
2 重要特性
1、262K色,即18位色彩;
2、芯片显示数据RAM大小 = 宽132 个点 x 长162个点 x 18位色彩(128*160或128*120彩屏都是在RAM存储允许范围内的简删版);
3、市面上的大多数ST7735S驱动的小彩屏用的都是其通信方式之一的4-line Serial Interface,即4线SPI串行通信,当然芯片设定是有8080等通信方式的;
6.3 模式选择引脚
重点是ICM2、ICM1、ICM0引脚:
其重要的原因是因为决定了通信方式:
IM2决定是并行还是串行,
IM1,IM0决定并行通信位数(在不使用时拉高或拉低,即IM2=‘0’的情况下),
这与手册最后一页内容相呼应:
其次是GM1和GM0:
笔者用的是128x160的屏,所以两个引脚都在内部拉高了。
再者是SRGB引脚:
常规的都是RGB格式。
8.4 数据颜色编码串行接口特性(4线串行)
9.8 数据颜色编码
我们在这里选用的是RGB565格式(如果使用摄像头的话也应当选用相同的色彩格式),在4-line Serial Interface ->Write Data for 16-bit/Pixel (RGB 5-6-5-bit Input), 65K-Colors, 3AH=“05h”一栏中:
通过颜色对齐方式将16bit转换为18bit。
9.10 地址计数器 (与摄像头图像显示相关)
地址计数器设置用于写入和读取的显示数据RAM的地址。在写入RAM之前,必须定义一个将要写入的窗口。窗口可通过命令寄存器XS,YS(指定起始地址)和XE,YE(指定结束地址)进行编程。
在垂直寻址模式(MV=1)中,Y地址在写每个字节之后递增,Y环绕到YS,X递增以寻址下一列;
在水平寻址模式(MV=0)中,X地址在写每个字节之后递增,X环绕到XS,Y递增以寻址下一列;
通常都采用水平寻址模式。
特别注意:
具体操作如下:
LCD_WR_REG(0x2A);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0X0F);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0X2F);
LCD_WR_REG(0x2B);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0X0F);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0X2F);
LCD_WR_REG( 0X2C); //开始写数据
while(1)
{
LCD_WR_DATA(0xF800); //写点颜色,红色
}
显示效果:
想了解更多,具体参见ov7670摄像头模块教程。
附带说明一下另一种区域显示模式:
1.首先开启部分显示模式;
2.再选中垂直显示区域;
其中一种情形(End Row < Start Row, when MADCTL ML=’0’ )具体操作如下:
int i=0;
LCD_WR_REG(0x12); //部分模式开启
LCD_WR_REG(0x30); //设置垂直显示区域
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x06);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x02);
LCD_WR_REG(0X2C); //开始写数据
while(1)
{
LCD_WR_DATA(0xF800); //写点颜色,红色
}
显示效果:
图中1、2、3行和7、8......160为显示行,4、5、6行为空白不显图行。
9.11 存储器数据写入/读取方向
通过MV、MX 、MY位来选择呈现方式,共有2 x 2 x 2 = 8种方式。
而其中附带垂直滚屏功能,其中一种具体操作如下:
int i=3;
LCD_SetCursor(0,0); //设置坐标
POINT_COLOR=RED; //设置字体为红色
LCD_ShowChar(50,120,'S',12,0); //显示一个字符
LCD_WR_REG(0x33); //写寄存器
LCD_WR_DATA8(0x00); //写8位数据
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x96);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x0A);
while(1)
{
for(i=0;i<150;i++)
{
LCD_WR_REG(0x37);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(i);
delay_ms(10);
}
delay_ms(20);
}
显示效果:
9.12 Tearing Effect(撕裂效应,即画面刷新残留):
这个现象多出现在视屏图像输入和页面刷新显示不一致时, 刷屏率太低会导致出现flicker现象(屏闪现象),刷屏率太高会导致出现 Tearing Effect(撕裂效应)。在camera图像显示在显示屏上时就需要注意这个问题,需要保证显示一幅图像后开始刷新下一幅,具体参见ov7670摄像头模块教程。
9.17 重置时序:
要注意复位低电平不要小于5ms:
复位期间尖峰电压小于20ns,这一点对单片机输出的reset信号波纹有要求:
还有一点要注意:在释放resx后要等待5秒钟,然后再发送命令。同时休眠命令在120毫秒内无效。
三、寄存器配置
下面到了配置寄存器的时候了(比较重要的寄存器罗列在内):
void LCD_Init(void)
{
extern u32 data;
LCD_REST=0;
delay_ms(50); // delay 50 ms
LCD_REST=1;
delay_ms(50); // delay 50 ms
SPILCD_RST_RESET ; //LCD_RST=0 //SPI接口复位
delay_ms(20); // delay 20 ms
SPILCD_RST_SET ; //LCD_RST=1
delay_ms(20); // delay 20 ms
// LCD_WR_REG(0x01); //刷新
// LCD_WR_REG(0x04); //显示屏24位出厂数据寄存器
// LCD_WR_REG(0x09); //读取显示状态,将数据放置在自己定义的数组中
// LCD_WR_REG(0x0A); //读取显示电源模式
// LCD_WR_REG(0x0B); //读取显示MADCTL (Memory Data Access Control)
// LCD_WR_REG(0x0C); //Read Display Pixel Format(后面几个不常用,所以直接摘抄英文注释)
// LCD_WR_REG(0x0D); //Read Display Image Mode
// LCD_WR_REG(0x0E); //Read Display Signal Mode
// LCD_WR_REG(0x0F); //Read Display Self-diagnostic result
// LCD_WR_REG(0x10); //进入睡眠模式,白屏,要黑屏需要断开LED引脚或电平拉低,否则无法降低功耗
LCD_WR_REG(0x11); //退出睡眠模式
// LCD_WR_REG(0x12); //部分模式开启
// LCD_WR_REG(0x13); //部分模式关闭
// LCD_WR_REG(0x20); //显示反转关闭,RGB二进制值反转
// LCD_WR_REG(0x21); //显示反转打开
// LCD_WR_REG(0x28); //关闭显示屏,白屏,不会破坏RAM数据
//------------------------------------ST7735S Frame Rate-----------------------------------------//
LCD_WR_REG(0xB1); //GM[1:0] = “11”时默认值 Frame Rate Control (In normal mode/ Full colors)
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3C);
LCD_WR_DATA8(0x3C);
LCD_WR_REG(0xB2); //GM[1:0] = “11”时默认值 Frame Rate Control (In Idle mode/ 8-colors)
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3C);
LCD_WR_DATA8(0x3C);
LCD_WR_REG(0xB3); //GM[1:0] = “11”时默认值 Frame Rate Control (In Partial mode/ full colors)
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3C);
LCD_WR_DATA8(0x3C);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3C);
LCD_WR_DATA8(0x3C);
//------------------------------------End ST7735S Frame Rate------------------------------------//
//---------------------------------ST7735S Power Sequence---------------------------------------//
LCD_WR_REG(0xB4); //Display Inversion Control
LCD_WR_DATA8(0x03); //Default Value Status B4h
LCD_WR_REG(0xC0); //Power Control 1
LCD_WR_DATA8(0x28); //AVDD=4.1 GVDD=4.3 GVCL=-4.3
LCD_WR_DATA8(0x08); //配合0x28
LCD_WR_DATA8(0x04); //FUNCTION=2X
LCD_WR_REG(0xC1); //Power Control 2
LCD_WR_DATA8(0xC0); //默认值
LCD_WR_REG(0xC2); //Power Control 3 (in Normal mode/ Full colors)
LCD_WR_DATA8(0x0D); //(AP)运算放大器中的电流量=Large (SAP)运算放大器中的电流量=Small
LCD_WR_DATA8(0x00); //默认值
LCD_WR_REG(0xC3); //Power Control 4 (in Idle mode/ 8-colors)
LCD_WR_DATA8(0x8D);
LCD_WR_DATA8(0x2A);
LCD_WR_REG(0xC4); //Power Control 5 (in Partial mode/ full-colors)
LCD_WR_DATA8(0x8D);
LCD_WR_DATA8(0xEE);
//---------------------------------End ST7735S Power Sequence----------------------------------//
//------------------------------------ST7735S VCOM Sequence------------------------------------//
LCD_WR_REG(0xC5); //VCOM
LCD_WR_DATA8(0x1A);
LCD_WR_REG(0x36); //MX, MY, RGB mode
LCD_WR_DATA8(0x00);
//---------------------------------End ST7735S VCOM Sequence------------------------------------//
//--------------------------------End ST7735S Gamma Sequence-----------------------------------//
LCD_WR_REG(0x26); //伽马修正曲线选择
LCD_WR_DATA8(0x04); //伽马曲线3,色彩饱和度较高,当然根据需求选择
LCD_WR_REG(0xE0); // Gamma (‘+’polarity) Correction Characteristics Setting
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x22);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x0A);
LCD_WR_DATA8(0x2E);
LCD_WR_DATA8(0x30);
LCD_WR_DATA8(0x25);
LCD_WR_DATA8(0x2A);
LCD_WR_DATA8(0x28);
LCD_WR_DATA8(0x26);
LCD_WR_DATA8(0x2E);
LCD_WR_DATA8(0x3A);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x01);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x13);
LCD_WR_REG(0xE1); //Gamma (‘-’polarity) Correction Characteristics Setting
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x16);
LCD_WR_DATA8(0x06);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x2D);
LCD_WR_DATA8(0x26);
LCD_WR_DATA8(0x23);
LCD_WR_DATA8(0x27);
LCD_WR_DATA8(0x27);
LCD_WR_DATA8(0x25);
LCD_WR_DATA8(0x2D);
LCD_WR_DATA8(0x3B);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x01);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x13);
//------------------------------------End ST7735S Gamma Sequence---------------------------//
LCD_WR_REG(0x3A); //65k mode
LCD_WR_DATA8(0x05);
LCD_WR_REG(0x29); //Display on
/*非必要参数,只是后面用的比较多,所以直接用结构体定义,方便改动*/
lcddev.width=128;
lcddev.height=160;
lcddev.wramcmd=0X2C;
lcddev.setxcmd=0X2A;
lcddev.setycmd=0X2B;
LCD_Clear(WHITE);
}
四、ST7735S和ST7735部分差异
再此,笔者未详尽对比,但在对比芯片特性和下表:
后,改换显示屏,显示效果一致,所以笔者认为ST7735S是ST7735的改进版本。
五、外部电容触摸扩展(后期补充)
后记——凡尘
时间匆忙,未能用篇幅举代码实例帮大家理解和校对错误,更多的是结构和整体压缩的内容,如有错别字和内容不合理的地方欢迎大家批评指正,如有想深入探讨或是项目需求的朋友欢迎加入QQ群:
星尘Arduino社区:630581178
星尘STM8/32社区:700155855
笔者邮箱:fanchen995@gmail.com