3.9 TFT彩屏实验
TFT-LCD 即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。 TFT-LCD 与无源 TN-LCD、STN-LCD 的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提 高了图像质量,TFT-LCD 也被叫做真彩液晶显示器。本实验,我们使用的是 1.44 寸的 TFTLCD 模块,该模块支持 65K 色显示,显示分辨率为 128×128, 接口为 SPI 4 线接口。
TFTLCD 显示需要的相关设置步骤如下:
1)设置 W800 与 TFTLCD 模块相连接的 IO。这一步,先将我们与 TFTLCD 模块相连的 IO 口进行初始化,以便驱动 LCD。
2)初始化 TFTLCD 模块。
使用 LCD 前,首先要复位 LCD,接着发送初始化序列,就是向 LCD 控制器写入一系列的设置值
(比如伽马校准),这些初始化序列一般 LCD 供应商会提供给客户,我们直接使用这些序列即可, 不需要深入研究。在初始化之后,LCD 才可以正常使用。
3)通过函数将字符和数字显示到 TFTLCD 模块上。
这一步的流程是:设置坐标 写 GRAM 指令 写 GRAM 来实现,但是这个步骤,只是一个点的处 理,我们要显示字符/数字,就必须要多次使用这个步骤,从而达到显示字符/数字的目的,所以需要 设计一个函数来实现数字/字符的显示,之后调用该函数,就可以实现数字/字符的显示了。
TFT 显示模块除了 SPI 接口后,对外还有背光接口,背光接口默认不控制的话,LCD 的背光是常亮状态,在硬件上,TFTLCD 模块与 W800 的 IO 口对应关系如下:
RST:硬复位 OLED。
DC:命令/数据标志(0,读写命令;1,读写数据)。
D0:串行时钟线。
D1:串行数据线,连接 IO33。
LCD_BL(背光控制):背光常亮,不接 W800。
这些线的连接,W800 开发板的内部已经连接好了,我们只需要将 TFTLCD 模块插上去就好了。
Lcd.h 文件说明
这是显示屏的头文件,里面定义了一些常用的颜色常量,LCD 的硬件接口,对外使用的接口。
//颜色
define RED 0xf800 //红色
define GREEN 0x07e0 //绿色
define BLUE 0x001f //蓝色
define WHITE 0xffff //白色
define BLACK 0x0000 //黑色
define YELLOW 0xFFE0 //黄色
define GRAY0 0xEF7D //灰色
define GRAY1 0x8410 //灰色1
define GRAY2 0x4208 //灰色2
define VIOLET 0xf81f //紫色
//定义显示屏大小
define X_MAX_PIXEL 128
define Y_MAX_PIXEL 128
//LCD此脚定义
define LCD_SCL WM_IO_PB_05 //SCLK 时钟 D1(SCLK)
define LCD_SDA WM_IO_PB_08 //SDA D0(MOSI) 数据
define LCD_RST WM_IO_PB_09 //_RES hardware reset 复位
define LCD_RS WM_IO_PB_10 //A0 H/L 命令数据选通端,H:数据,L:命令
//SPI口置1
define LCD_RS_SET (tls_gpio_write(LCD_RS, 1))
define LCD_SDA_SET (tls_gpio_write(LCD_SDA, 1))
define LCD_SCL_SET (tls_gpio_write(LCD_SCL, 1))
define LCD_RST_SET (tls_gpio_write(LCD_RST, 1))
//SPI口清0
define LCD_RS_CLR (tls_gpio_write(LCD_RS, 0))
define LCD_SDA_CLR (tls_gpio_write(LCD_SDA, 0))
define LCD_SCL_CLR (tls_gpio_write(LCD_SCL, 0))
define LCD_RST_CLR (tls_gpio_write(LCD_RST, 0))
void Gui_DrawFont_GBK16(u16 x, u16 y, u16 fc, u16 bc, u8 *s);
void Gui_DrawFont_GBK24(u16 x, u16 y, u16 fc, u16 bc, u8 s);
void Gui_DrawFont_Num32(u16 x, u16 y, u16 fc, u16 bc, u16 num) ;
void LCD_P6x8Str(unsigned char x, unsigned char y, u16 fc, u16 bc,unsigned char ch[]);
void Lcd_WriteIndex(u8 Index);
void Lcd_WriteData(u8 Data);
void Lcd_WriteReg(u8 Index,u8 Data);
u16 Lcd_ReadReg(u8 LCD_Reg);
void Lcd_Reset(void);
void Lcd_Init(void);
void Lcd_Clear(u16 Color);
void Lcd_ClearRect(u16 x1,u16 y1, u16 x2,u16 y2, u16 Color);
void Gui_DrawPoint(u16 x,u16 y,u16 Data);
void Lcd_SetRegion(u16 x_start,u16 y_start,u16 x_end,u16 y_end);
void LCD_WriteData_16Bit(u16 Data);
Lcd.c 文件说明:
这是 LCD 的源文件,就是用于实现 LCD 初始化、清屏、显示 68 字符,我们常用的就是前 4 个函数,分别如下:
函数 Lcd_Init 介绍
这是 LCD 的初始化函数,直接调用这个函数就能初始化 LCD,如果要修改 LCD 的接口引脚,请修改 LCD.h 即可, 这个函数不用变。
void Lcd_Init(void)
{
InitIo();
Lcd_Reset(); //复位 LCD
Lcd_WriteIndex(0x11);//Sleep exit
tls_os_time_delay (200);
//ST7735R Frame Rate
Lcd_WriteIndex(0xB1);
Lcd_WriteData(0x01);
....................略...........................
Lcd_WriteIndex(0xF0); //Enable test command
Lcd_WriteData(0x01);
Lcd_WriteIndex(0xF6); //Disable ram power save mode
Lcd_WriteData(0x00);
Lcd_WriteIndex(0x3A); //65k mode
Lcd_WriteData(0x05);
Lcd_WriteIndex(0x29);//Display on
Lcd_Clear(WHITE);
}
函数 Lcd_Clear 介绍:
这个是清除 LCD 显示屏函数,需要重新显示数据的时候,就要调用这个函数,参数是清除显示屏后,显示的颜色值。
/*************************************************
函数名:Lcd_Clear
功能:全屏清屏函数
入口参数:填充颜色COLOR
返回值:无
*************************************************/
void Lcd_Clear(u16 Color)
{
unsigned int i,m;
Lcd_SetRegion(0,0,X_MAX_PIXEL-1,Y_MAX_PIXEL-1);
Lcd_WriteIndex(0x2C);
for(i=0;i<X_MAX_PIXEL;i++)
for(m=0;m<Y_MAX_PIXEL;m++)
{
LCD_WriteData_16Bit(Color);
}
}
函数 Gui_DrawFont_GBK16 介绍
这个函数用于显示一行816的ascll码字符串。
/功能描述:显示一行8*16的ascll码
*xy,显示屏坐标,取值 0~128
*fc:字的颜色
*bc:背景的颜色
*s:要显示的字符串
*/
void Gui_DrawFont_GBK16(u16 x, u16 y, u16 fc, u16 bc, u8 *s)
{
unsigned char i,j;
unsigned short k,x0;
x0=x;
while(*s)
{
// if((s) < 128)
{
k=s;
if (k==13)
{
x=x0;
y+=16;
}
else
{
if (k>32) k-=32; else k=0;
for(i=0;i<16;i++)
for(j=0;j<8;j++)
{
if(asc16[k*16+i]&(0x80>>j)) Gui_DrawPoint(x+j,y+i,fc);
else
{
if (fc!=bc) Gui_DrawPoint(x+j,y+i,bc);
}
}
x+=8;
}
s++;
}
}
}
程序编译下载到开发板运行可看到LCD显示的信息。