stm32驱动st7789 TFT |
您所在的位置:网站首页 › 触摸屏驱动电路图片 › stm32驱动st7789 TFT |
前言
一切程序以最后百度网盘链接的程序为准,可能在写文章的时候有些地方有改动。 主控: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 |