TFT1.8寸屏,搭配ST7735驱动芯片,是一种专为小型电子设备设计的彩色液晶显示解决方案。该屏幕采用薄膜晶体管(TFT)技术,能够实现高亮度、高对比度和丰富的色彩表现(即16位色彩深度),提供清晰细腻的显示效果。ST7735作为一款集成度高的驱动芯片,不仅支持多种分辨率(在1.8寸屏上通常为128x160像素),还具备RGB RAMDAC、控制器和GPIO接口等功能,并通过SPI接口与微控制器进行通信。此外,ST7735还提供了硬件加速图形绘制功能,如点、线、矩形绘制及文本显示等,进一步提升了显示性能。该组合广泛应用于仪器仪表、智能设备等嵌入式系统中,因其低功耗特性而特别适合便携式设备。通过编写相应的驱动程序,可以方便地初始化ST7735驱动芯片,配置8位并口发送显示数据,使TFT1.8寸屏正常工作。
一、驱动芯片介绍
屏幕尺寸:1.8英寸
分辨率:128x160像素
色彩:支持16位色彩深度(5位红、6位绿、5位蓝各通道),能够提供相对丰富的颜色表现。
接口类型:MCU接口,可通过SPI协议与微控制器进行通信。
驱动型号:ST7735
功能:ST7735是一款低功耗的彩色TFT液晶屏驱动芯片,广泛应用于各种嵌入式系统和电子设备中。它集成了RGB RAMDAC(随机存取的数字模拟转换器)、控制器和GPIO接口,支持硬件加速图形绘制功能,如画点、线、矩形、填充以及文本显示等。
兼容性:可直接以SPI协议,或8位/9位/16位并行连接外部控制器。显示数据可以存储在片内的132x162x18 bits内存中,显示内存的读写不需要外部时钟驱动。
型号差异:ST7735有几种不同的型号,如ST7735、ST7735R、ST7735S等。-R和-S型号在功能上与原始型号一致,但增加了垂直滚动功能,并容忍更高的电压(最高到4.8V)。
由于TFT1.8寸屏具有体积小、功耗低、色彩丰富等特点,因此非常适合用于智能手表、便携式医疗设备、小型电子仪器等需要显示信息的嵌入式系统中。
二、驱动方式
首先,我们需要根据实际的硬件连接来定义LCD接口所使用的GPIO引脚。
/******************************************************************************
接口定义,请根据接线修改并修改相应IO初始化--驱动板子和IO要对应 */
// #define LCD_CS //PB1 //片选
// #define LCD_RS //PB0 //命令/数据切换
// #define LCD_WR //PB11 //写控制端
// #define LCD_RD //PB10 //读控制端
// #define LCD_RST //PB8 //复位端
// #define LCD_BLK //PB7 //背光控制
// #PA0-7,作为8位并口的数据输出端
使用下 LCD_Init 函数通过PA0~PA7并口与 TFT 进行通信,并执行各种各个寄存器的初始化配置等。
/*******************************************************************************/
//函数:void LCD_Init(void)
//函数功能:初始化lcd
/*******************************************************************************/
void LCD_Init(void){
LCD_BLK_Off; //关闭背光
//LCD_SoftRest(); //软复位
LCD_HardwareRest(); //硬复位命令
LCD_RD_SET;
LCD_WR_REG(0x11); // Sleep out
HAL_Delay(120); //HAL_Delay 120ms
LCD_WR_REG(0xB1); //In Normal mode
LCD_WR_DATA(0x05);
LCD_WR_DATA(0x3C);
LCD_WR_DATA(0x3C);
LCD_WR_REG(0xB2); //In Idle mode
LCD_WR_DATA(0x05);
LCD_WR_DATA(0x3C);
LCD_WR_DATA(0x3C);
LCD_WR_REG(0xB3); //In Partial mode
LCD_WR_DATA(0x05);
LCD_WR_DATA(0x3C);
LCD_WR_DATA(0x3C);
LCD_WR_DATA(0x05);
LCD_WR_DATA(0x3C);
LCD_WR_DATA(0x3C);
LCD_WR_REG(0xB4);
LCD_WR_DATA(0x03); //Normal mode dot inversion
LCD_WR_REG(0xC0); //Power Control
LCD_WR_DATA(0x28); //AVDD=4.6V, GVDD=4.3V
LCD_WR_DATA(0x08); //GVCL=-4.3V
LCD_WR_DATA(0x04); //MODE=2X
LCD_WR_REG(0xC1); //Power Control
LCD_WR_DATA(0xC0); //V25=2.4, VGH=2*4.6+2.4-0.5=11.1, VGL=-7.5
LCD_WR_REG(0xC2);
LCD_WR_DATA(0x0D);
LCD_WR_DATA(0x00);
LCD_WR_REG(0xC3);
LCD_WR_DATA(0x8D);
LCD_WR_DATA(0x2A);
LCD_WR_REG(0xC4);
LCD_WR_DATA(0x8D);
LCD_WR_DATA(0xEE);
LCD_WR_REG(0xC5); //Vcom
LCD_WR_DATA(0x18);
LCD_WR_REG(0x36);
LCD_WR_DATA(0xC0);
LCD_WR_REG(0xE0);
LCD_WR_DATA(0x04);
LCD_WR_DATA(0x1B);
LCD_WR_DATA(0x1C);
LCD_WR_DATA(0x1E);
LCD_WR_DATA(0x3C);
LCD_WR_DATA(0x33);
LCD_WR_DATA(0x29);
LCD_WR_DATA(0x2B);
LCD_WR_DATA(0x2A);
LCD_WR_DATA(0x26);
LCD_WR_DATA(0x2E);
LCD_WR_DATA(0x39);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x02);
LCD_WR_DATA(0x02);
LCD_WR_DATA(0x10);
LCD_WR_REG(0xE1);
LCD_WR_DATA(0x04);
LCD_WR_DATA(0x1B);
LCD_WR_DATA(0x1C);
LCD_WR_DATA(0x1E);
LCD_WR_DATA(0x3C);
LCD_WR_DATA(0x33);
LCD_WR_DATA(0x29);
LCD_WR_DATA(0x2B);
LCD_WR_DATA(0x29);
LCD_WR_DATA(0x26);
LCD_WR_DATA(0x2E);
LCD_WR_DATA(0x39);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x02);
LCD_WR_DATA(0x02);
LCD_WR_DATA(0x10);
LCD_WR_REG(0x3A);
LCD_WR_DATA(0x05);
LCD_WR_REG(0x11); // Sleep out
HAL_Delay(120);
LCD_WR_REG(0x2A);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x7F);
LCD_WR_REG(0x2B);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x9F);
LCD_WR_REG(0x29); // Display OnHAL_Delay(20);
HAL_Delay(20); //HAL_Delay 20ms
LCD_WR_REG(0x2C);
HAL_Delay(20); //HAL_Delay 20ms
LCD_Display_Dir(LCD_DIR_Mode); //选择--屏幕显示方式
LCD_BLK_On; //点亮背光
LCD_Clear(WHITE);
}
基于STM32 HAL库编写的,使用下面这些函数通过PA0~PA7并口与TFT进行通信,并执行各种控制操作,如写入寄存器、写入数据、显示开启/关闭等。
/********************************************************************/
//函数:uint8_t DB_OUT(uint8_t TxData)
//函数功能: PA0-PA7输出数据
//TxData:要写入的字节
//*******************************************************************/
void DB_OUT(uint8_t TxData){
GPIOA->BSRR = TxData; // 设置 TxData 高电平
GPIOA->BRR = ~TxData; // 清除 ~TxData 高电平(即设置其余脚为低电平)
}
//********************************************************************/
//函数:void LCD_WR_REG(uint8_t regval)
//函数功能:
//写寄存器函数
//regval:寄存器值
//*******************************************************************/
void LCD_WR_REG(uint8_t regval){
LCD_CS_CLR; //LCD_CS=0 //片选
LCD_RS_CLR; //LCD_RS=0 //设置命令状态
DB_OUT(regval);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET; //LCD_CS=1
}
//*******************************************************************/
//函数:void LCD_WR_DATA(uint8_t data) //写8位数据
//函数功能:
//液晶屏--写8位数据函数
//*******************************************************************/
void LCD_WR_DATA(uint8_t data){
LCD_CS_CLR; //LCD_CS=0 //片选
LCD_RS_SET; //LCD_RS=1 //设置数据状态
DB_OUT(data);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET; //LCD_CS=1
}
//*******************************************************************/
//函数:void LCD_WR_DATA16(uint16_t data) //写16位数据
//函数功能:写LCD数据
//输入参数:
//data:要写入的值
//*******************************************************************/
void LCD_WR_DATA16(uint16_t data){
LCD_CS_CLR; //LCD_CS=0 //片选
LCD_RS_SET; //LCD_RS=1 //设置数据状态
DB_OUT(data>>8);
LCD_WR_CLR;
LCD_WR_SET;
DB_OUT(data);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET; //LCD_CS=1
}
//*******************************************************************/
//函数:void LCD_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue) //写液晶屏寄存器
//函数功能:写寄存器
//输入参数:
//LCD_Reg:寄存器地址
//LCD_RegValue:要写入的数据
//*******************************************************************/
void LCD_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue){
LCD_WR_REG(LCD_Reg); //写入要写的寄存器序号
LCD_WR_DATA(LCD_RegValue);//写入数据
}
//*******************************************************************/
//函数:void LCD_WriteRAM_Prepare(void)
//函数功能:开始写GRAM 命令
//*******************************************************************/
void LCD_WriteRAM_Prepare(void){
LCD_WR_REG(lcddev.wramcmd);
}
//*******************************************************************/
//函数:LCD_WriteRAM(uint16_t RGB_Code)
//函数功能:写入点阵颜色值
//输入参数:
//RGB_Code:颜色值
//*******************************************************************/
void LCD_WriteRAM(uint16_t RGB_Code){
LCD_RS_SET;
LCD_CS_CLR;
DB_OUT(RGB_Code>>8);
LCD_WR_CLR;
LCD_WR_SET;
DB_OUT(RGB_Code&0X00ff);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
}
//********************************************************************************/
//函数:void LCD_DisplayOn(void)
//函数功能:
//LCD开启显示
//*******************************************************************/
void LCD_DisplayOn(void){
LCD_WR_REG(0X29); //开启显示
}
//*******************************************************************/
//函数:void LCD_DisplayOff(void)
//函数功能:
//LCD关闭显示
//*******************************************************************/
void LCD_DisplayOff(void){
LCD_WR_REG(0X28); //关闭显示
}
//********************************************************************************/
//函数:void LCD_SoftRest(void)
//函数功能:给屏幕发命令,执行软复位命令
//LCD开启显示
//*******************************************************************/
void LCD_SoftRest(void){
LCD_WR_REG(0x01); //发送软复位命令
HAL_Delay(100); // delay 50 ms
}
//********************************************************************************/
//函数:void LCD_SoftRest(void)
//函数功能:给屏幕发命令,执行硬复位命令
//LCD开启显示
//*******************************************************************/
void LCD_HardwareRest(void){
LCD_RST_SET;
HAL_Delay(10);
LCD_RST_CLR; //液晶屏复位 --硬复位--使能
HAL_Delay(20); // delay 20 ms
LCD_RST_SET; //液晶屏复位 --硬复位--失能
HAL_Delay(20); // delay 20 ms
}
//*******************************************************************/
//函数:void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)
//函数功能:设置光标位置
//输入参数:
//Xpos:横坐标
//Ypos:纵坐标
//*******************************************************************/
void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos){
LCD_WR_REG(lcddev.setxcmd);
LCD_WR_DATA(Xpos>>8);
LCD_WR_DATA(Xpos&0XFF);
LCD_WR_REG(lcddev.setycmd);
LCD_WR_DATA(Ypos>>8);
LCD_WR_DATA(Ypos&0XFF);
}
通过调用 Demo_Menu 函数,进行示例的演示。
//****************************************************************************************/
//函数:void Demo_Menu(void)
//功能描述: 演示程序菜单
/****************************************************************************************/
void Demo_Menu(void){
LCD_Clear(WHITE); //清屏
Draw_Font24B(4,30,RED,"液晶屏测试");
Draw_Font16B(4,60,BLUE,"1: 电子颜色填充");
Draw_Font16B(4,80,BLUE,"2: 文字显示");
Draw_Font16B(4,100,BLUE,"3: 图片显示");
Draw_Font16B(4,120,RED,"shop155800028.taobao.com");
HAL_Delay(2000);//延时
Color_Test(); //颜色填充测试
Font_Test(); //字体字形显示测试
Show_Picture(); //显示一张图片
LCD_Clear(WHITE); //清屏
LCD_ShowString(0,0,20,20,12,RED,"!#2");
DisplayButtonUp(5,20,25,35);
DisplayButtonDown(45,20,65,35);
LCD_ShowxNum(5,40,99,3,12,RED,0);
LCD_ShowNum(55,40,888,3,12,RED);
HAL_Delay(2000);
}
三、主函数main运行
LCD_Init(); //初始化LCD SPI 接口
POINT_COLOR = RED; //画笔颜色:红色
BACK_COLOR = GREEN; //字符背景颜色
while(1){
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
Demo_Menu(); //演示程序
HAL_Delay(1000);
}
四、完整代码下载
项目代码下载链接:https://download.csdn.net/download/qq_26043945/90012385