stm32驱动st7789 TFT

您所在的位置:网站首页 触摸屏驱动电路图片 stm32驱动st7789 TFT

stm32驱动st7789 TFT

2024-07-13 21:42| 来源: 网络整理| 查看: 265

前言

一切程序以最后百度网盘链接的程序为准,可能在写文章的时候有些地方有改动。 主控:STM32F103C8T6 1.69 TFT-LCD(st7789驱动)

一 硬件相关说明 1.1接线说明 CLK:PA4 SDA:PA5 RST:PA6 D/C:PA7 BLK:PC14 CS:PA8 1.2硬件初始化

TFT-LCD是采用SPI通信的,这里使用stm32f103c8t6的SPI1,初始化代码如下

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能A端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_4); //背光引脚 PC13 片选CS引脚PC14 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //使能GPIOC时钟 //配置GPIOB的工作模式和初始化 GPIO_InitStruture.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStruture.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; //引脚PC13 PC14 GPIO_InitStruture.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz GPIO_Init(GPIOC,&GPIO_InitStruture); 1.3驱动初始化

在原有的驱动基础上增加了几个宏去控制显示方向,方便后期更改 在这里插入图片描述

1.3.1 UP方向朝上 #define DISPLAY_OVERTURN 0 #define DISPLAY_BOTTOM_TO_TOP 0 #define DISPLAY_RIGHT_TO_LEFT 0

在这里插入图片描述

1.3.2 BOTTOM朝上 #define DISPLAY_OVERTURN 0 #define DISPLAY_BOTTOM_TO_TOP 1 #define DISPLAY_RIGHT_TO_LEFT 1

在这里插入图片描述

1.3.3 RIGHT朝上 #define DISPLAY_OVERTURN 1 #define DISPLAY_BOTTOM_TO_TOP 0 #define DISPLAY_RIGHT_TO_LEFT 1

在这里插入图片描述

1.3.4 LEFT朝上 #define DISPLAY_OVERTURN 1 #define DISPLAY_BOTTOM_TO_TOP 1 #define DISPLAY_RIGHT_TO_LEFT 0

在这里插入图片描述

1.3.5 驱动代码 //st7789驱动 TFT_SCLK_Set(); //特别注意!! TFT_RST_Clr(); delay_ms(1000); TFT_RST_Set(); delay_ms(1000); TFT_SEND_CMD(0x11); //Sleep Out delay_ms(120); //DELAY120ms //-----------------------ST7789V Frame rate setting-----------------// //************************************************ TFT_SEND_CMD(0x3A); //颜色数据格式RGB565 65k真彩色 TFT_SEND_DATA(0x05); TFT_SEND_CMD(0xC5); //VCOM1 TFT_SEND_DATA(0x1A); /* (0,0)*********240***********-> * * * 280 240x280 * * * ↓ **/ TFT_SEND_CMD(0x36); // 屏幕显示方向设置 #if DISPLAY_BOTTOM_TO_TOP lcd_data |= (1TFT-LCD显示。 通常电脑端的BMP图片数据是RGB888的个数,需要使用工具将RGB888格式的数据转换成RGB565格式的数据。这里我用QT写了一个图片转换工具。具体细和使用方法在第四点。 注意:在图片数组的前四个字节加入图片宽高字段,方便后续读取,不需要我们手动去设置图片的宽高。 在这里插入图片描述

void TFT_display_image(const uint16_t *address, uint16_t startX, uint16_t startY) { uint16_t image_width;//图片宽 uint16_t image_hight;//图片高 uint16_t x,y; image_width = address[0]; image_hight = address[1]; TFT_SetWindows(startX, startY, image_width, image_hight); for(y = 0; y 8); TFT_SEND_DATA(address[y*image_width + x + 2]&0xff); } } } 三、文字显示 3.1字体取模

使用PCtolLCD2002软件对要显示的字体进行取模,字体取模方式可参照下图进行设置 在这里插入图片描述

3.2 将取模得到的数组复制到代码中

在这里插入图片描述 在这里插入图片描述

3.3 显示字体函数 void TFT_display_char16_16(const uint8_t *address ,uint16_t startX,uint16_t startY,uint16_t color) { unsigned int column; unsigned char tm=0,temp; TFT_SetWindows(startX, startY, 16, 16); for(column = 0; column 8); TFT_SEND_DATA(color); } else { TFT_SEND_DATA(0); TFT_SEND_DATA(0); } temp >>= 1; } address++; } } 3.4 遇到的问题

1、在显示文字的时候原始写法就是如果是1就填充对应文字的颜色,没有数据就填充黑色(背景色),但是如果整个屏幕的背景色不是黑色的话看感觉文字背景设很突兀。 在这里插入图片描述 为了解决上一个问题在此增加了一个函数用于显示透明的文字(其它大小展示没有调试),使用这种方式也有一个缺点就是显示速度太慢,因为是一个点一个点的刷上去

void TFT_display_char16_16_noBackColor(const uint8_t *address ,uint16_t startX,uint16_t startY,uint16_t color) { unsigned int column; unsigned char tm=0,temp; unsigned int x = 0; unsigned int y = 0; for(column = 0; column = 1; } address++; temp =* address; for(tm = 0; tm >= 1; } // if(column>0 && column%2 == 0)//如果开启字体的高读会压缩到之前的一半 y++; address++; } }

显示效果 在这里插入图片描述 可以对比下一在图片上显示效果,后者是不带底色显示问题 在这里插入图片描述

四 bmp图片转换软件

我这里是使用QT自己写的一个转换工具,将BMP图片转换成C语言数组和bin文件(未验证),此软件占时只做一张图片的转换,自己可以根据自己的需求做修改。

4.1 BMP图片

BMP图片头部14Byte+位部信息头40Byte,注意:每个信息块是从右向左计算 头部14字节具体含义如下 在这里插入图片描述 在这里插入图片描述

4.2图片头部信息

Byte1-2 0x42:‘B’,0x4d:‘M’ 在这里插入图片描述 Byte3-6文件大小(bmp图片总占用空间) 注意高位是高字节,低位是低字节,实际大小应该是0x0313b6=201654 在这里插入图片描述 在这里插入图片描述 Byte11-14 位图数据部分相对于文件首的起始偏移,0x36=54 在这里插入图片描述

4.3位图信息

位图信息共占40位 在这里插入图片描述 在这里插入图片描述 Byte15-18 信息头部:通常为0x28或者0x38,0x0000 0028 在这里插入图片描述 Byte19-22 图像宽度0x0000 0118 = 280 在这里插入图片描述 在这里插入图片描述 Byte23-26 图像高度0x0000 00f0=240 在这里插入图片描述 在这里插入图片描述 Byte27-28 保留位,值永远为0x01 在这里插入图片描述 Byte29-30 每个像素占用的位数0x0018=24,即该图像为RGB888格式 在这里插入图片描述 Byte31-34 压缩方式 在这里插入图片描述 Byte35-38 图像尺寸(字节数,真正图片数据不包括图片信息的头部)0x0003 1380=201600(Byte3-6 减去 Byte11-14) 在这里插入图片描述 Byte39-42 水平分辨率0x0ec4 = 3780 在这里插入图片描述 Byte43-46 垂直分辨率0x0ec4 = 3780 在这里插入图片描述 Byte47-50 引用色彩数 在这里插入图片描述 Byte51-54 关键色彩数

在这里插入图片描述

4.4 QT代码 #include "mainwindow.h" #include "./ui_mainwindow.h" #include "protocol.h" #include #include #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : QWidget(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_openImage_clicked() { QString fileName; QSettings setting("./lastopenFile.ini", QSettings::IniFormat); QString lastPath = setting.value("LastFilePath").toString(); fileName = QFileDialog::getOpenFileName(this, QString::fromLocal8Bit("选择图片"), lastPath, tr("Images(*.bmp)")); ui->imageInfoEdit->append("/*imag name:"+fileName+"*/"); qInfo()


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3