stm32【 1.3寸LCD屏幕(2)】
1.3寸LCD屏幕 显示图片
测试平台:STM32F103RFT6
库版本:官方标准库3.5.0版本
屏幕:中景园1.3寸24Pin接插式LCD屏幕
分辨率:240*240像素
驱动芯片:ST7789
驱动方式:4线SPI
stm32【 1.3寸LCD屏幕(1)】
上一篇文章介绍了LCD屏幕的基础配置以及实现全屏颜色显示的功能
本文会介绍一些基础的显示函数和显示图片的实现方式
注: 文中首次出现的代码块会标注[xxx.c]或[xxx.h],表明该代码是属于对应的文件,未标注的即为重复出现的
目录
- 1.3寸LCD屏幕 显示图片
- 1、基础显示函数
- 2、图片显示
- 图片取模
- 显示函数
- 3、总结
1、基础显示函数
画点和画线函数▼
[lcd.c]
/********************************************************************************* @brief 在指定位置画点* @param (x,y) 坐标* @param color 颜色* @retval none*******************************************************************************/
void LCD_Draw_Point(u16 x,u16 y,u16 color)
{LCD_SetRegion(x, y, x, y);LCD_WR_Data16(color);
}
/********************************************************************************* @brief LCD画线函数,使用Bresenham算法* @param (x1,y1) 起点* @param (x1,y1) 终点* @param PixcelColor 点颜色* @retval none*******************************************************************************/
void LCD_Draw_Line(u16 x1, u16 y1, u16 x2, u16 y2, u16 PixcelColor)
{u16 t; int xerr = 1,yerr = 1;int delta_x, delta_y, distance; int incx, incy, uRow, uCol; delta_x = x2 - x1; //计算坐标增量delta_y = y2 - y1; uRow = x1; uCol = y1; if(delta_x > 0)incx = 1; //设置单步方向else if(delta_x == 0)incx = 0; //垂直线else {incx = -1; delta_x = -delta_x;}if(delta_y > 0)incy = 1;else if(delta_y == 0)incy = 0; //水平线else{incy = -1; delta_y = -delta_y;}if(delta_x > delta_y)distance = delta_x;//选取基本增量坐标轴else distance = delta_y; for(t = 0; t <= distance; t++ ){ //画线输出LCD_Draw_Point(uRow,uCol,PixcelColor);//画点xerr += delta_x ; yerr += delta_y ;if(xerr > (distance>>1)){ // 等于(distance/2)xerr -= distance;uRow += incx;}if(yerr > distance){ yerr -= distance; uCol += incy; }}
}
画线函数就不解释了,这个Bresenham算法网上有很多很详细的介绍
2、图片显示
要在屏幕上显示图片,有两个步骤
1、图片取模,生成数组或者bin文件
如果生成数组,需要创建一个 [xxx.h] 文件来存储该数组,直接烧录到单片机内部,需要时调用数组即可
如果生成bin文件,则需要直接写入外部存储空间,例如外部flash芯片或者SD卡,但是flash烧写不太方便,这里推介使用SD卡的,搭配FATFS文件操作系统的话,可以直接将bin文件通过电脑拷贝进SD卡,再读使用文件取文件,那么更换图片就很方便了。
第二种方法过于复杂,涉及到SDIO和FATFS文件系统,可以单独开两篇文章来介绍了,以后有时间再写,这里介绍第一种方式来显示图片
图片取模
驱动芯片ST7789第8.12章节的图表▼
可以看见,注意(DDRAM)这列图片,无论屏幕显示方向如何改变,数据的方向始终是【从左到右,从上到下】
在8.4.2小节里介绍到SPI模式下写入指令时提到:需要先发送高位▼
在上一篇文章的【2.4章节LCD初始化】配置中,色彩模式的配置是5-6-5的RGB色彩
因此,无论使用哪款图片取模软件,取模设置都需要符合以下条件
(1)取模方向【从左到右,从上到下】
(3)数据结构【高位在前,MSB first】
(2)色彩格式【5-6-5的RGB比例】
▼这里使用【Image2lcd】这款软件,3.2版本(该版本可以批量转换图片,可以用来制作可播放的视频文件)
输出类型【C语言数组】
扫描模式【水平扫描】,上方有数据生成方向的预览图,正好符合需要的取模方向
输出灰度【16位真彩色】在上一篇文章中提到色彩配置是65K色彩
//颜色数据格式,见8.8和9.1.33章节LCD_WR_Cmd(0x3A);LCD_WR_Data8(0x05);
16位真彩色:2^16正好是65536
宽度和高度【xxx】这个就是根据需要显示的大小来填写了
不过输入(240,240)输出的图片格式并不是(240,240),而是按照宽高比例输出,在上图最底下的一栏文字,这里显示了原始图片的分辨率和输出图片的分辨率(240,230)
接下来的是一些勾选的选项:
包含图像头数据: 该选项会在颜色数据前面附加一些文件信息,关于这些信息的解读可以参考【帮助】-【用法说明】-【图像头数据结构】
根据该数据结构可以对图像信息进行解读,其中比较重要的是w和h,也就是图片的宽度和高度,在图片显示函数中会使用到
当然你也可以不包含数据头信息,只是这样显示图片的话需要手动输入图片宽高,不太方便。
字节内像素数据反序 这个没有使用过,也勾选不了,估计大概是跟计算机数据存储的大端模式和小端模式有关,在这里就不介绍了,感兴趣的可以自行了解
自右自左扫描
自底自顶扫描 这两个配合扫描模式可以改变数据扫描方向
高位在前(MSB First) 这个很重要,必须勾选,生成数据时高八位在前
在预览图的下方是色彩格式的选择,这里选【16位彩色】,颜色位数选【5-6-5】,符合第三个条件
这是我的最终配置▼
这里选择了16色真彩色
配置完成点击保存就可以生成一个C文件,这样就完成了图片的取模
打开生成的文件,可以看到有一个数组,这里截取开头部分说明下该数组应怎么使用,为后边的编程做铺垫
const unsigned char gImage_my_logo[110408] = { 0X10,0X10,0X00,0XF0,0X00,0XE6,0X01,0X1B,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
首先可以知道的是该数组长度为【110408】,这是可以计算出来的
前面提到,实际输出的图像分辨率为(240,230)
那么240 x 230 = 5520
由于一个像素点有2byte数据,那么这张图片的数据量就是:55200 x 2 = 110400
在image2lcd软件的【帮助】中有16位真彩色信息头的结构体▼
“4096色/16位真彩色/18位真彩色/24位真彩色/32位真彩色”的图像数据头如下:typedef struct _HEADCOLOR
{unsigned char scan;unsigned char gray;unsigned short w;unsigned short h;unsigned char is565;unsigned char rgb;
}HEADCOLOR;
也就是信息头大小是8byte
那么加起来就是110400 + 8 = 110408
数组的[0]~[7]就是图片信息头▼
0X10,0X10,0X00,0XF0,0X00,0XE6,0X01,0X1B,
第3-6个是宽度和高度,都是2byte组成
宽度:0x00 F0 转换成十进制即240
高度:0x00 E6 转换成十进制即230
就是图片输出的分辨率(240,230),在编程的时候把这4byte数据解析出来就能知道图片的大小了
其他的具体含义不解释,有兴趣的可以自己去看看
显示函数
显示图片的话首先做个准备工作:
上一篇文章中设置显示区域函数,需要设置起始坐标和结束坐标,这里写一个新的,设置起始点和宽度高度,方便图片显示▼
[lcd.c]
/********************************************************************************* @brief 设置图片显示位置* @param xy起点和区域大小(图片长宽)* @retval none*******************************************************************************/
void LCD_SetRegion_Image(u16 x, u16 y, u16 w, u16 h)
{#if USE_HORIZONTAL == 1y = y + 80; //Y轴中心点偏移80格#elif USE_HORIZONTAL == 3x = x + 80; //X轴中心点偏移80格#endifLCD_WR_Cmd(0x2a);//列地址设置LCD_WR_Data16(x);LCD_WR_Data16(x + w - 1);LCD_WR_Cmd(0x2b);//行地址设置LCD_WR_Data16(y);LCD_WR_Data16(y + h - 1);LCD_WR_Cmd(0x2c);//储存器写}
然后是根据上节提到的信息头来编写显示函数了
[lcd.c]
/*API使用参考图片数据存放在主控芯片的flash通过指针*p传递数据地址图片取模软件:"Image2LCD"注意图片取模参数,软件 “帮助” 中有图片信息头说明图片信息头包含:扫描的方向、灰度值、图片宽度和高度等
*/
/********************************************************************************* @brief 定点显示图片,注意图片取模的信息头* @param (x,y) 图片起始点(Wide,Height) 图片分辨率(最大240x240)*pdata 图片取模数组 取模方式:水平扫描 从左到右 高位在前* @retval none*******************************************************************************/
void Showimage_1(u32 x, u32 y, u8 *pdata)
{u8 *u_pdata;u32 i;u16 Wide;u16 Height;u32 data_cnt;u_pdata = pdata;//提取图片信息头Wide = (u16)u_pdata[2] << 8; //高八位在前Wide += (u16)u_pdata[3]; //低八位在后Height = (u16)u_pdata[4] << 8; //高八位在前Height += (u16)u_pdata[5]; //低八位在后u_pdata += 8;LCD_SetRegion_Image(x, y, Wide, Height); //坐标设置data_cnt = Wide * Height*2;for(i = 0; i < data_cnt; i++){ LCD_WR_Data8(u_pdata[i]); }
}
没啥好解释的,获取宽度和高度信息后,设定显示区域,把指针【*u_pdata】往后移8位,然后开始刷数据就行了,注意数据量是点阵数的2倍
把生成C文件改成头文件,然后添加进工程中【#include “my_logo.h”】
在main函数里调用该函数即可显示图片
Showimage_1(0,0,gImage_my_logo);
3、总结
这是实物展示▼
图片越大,烧写越久,而且要注意所选的单片机是否有足够的空间来存储该数组,这张图片足足需要110K,这也是开头提到的第二种方法里为啥不推荐使用外部flash来存储,烧写太麻烦了,耗时长,当然用来固化一些不再修改的Logo的话,就另当别论了
使用SD卡这样的存储介质的话,可以存储更多的图片,如果把图片一张张放映出来,能达40ms一张的播放速度,到就可以变成小电视了,以后有空再写吧
stm32【 1.3寸LCD屏幕(2)】相关推荐
- 单片机:STM32F4x HAL库软硬SPI驱动ST7735s 1.8寸LCD屏幕
单片机:STM32F4x HAL库软硬SPI驱动ST7735s 1.8寸LCD屏幕 说明:此篇为学习记录.可能存在错误或者不足.如有问题请指出. 硬件环境 主控芯片:STM32F411CEU6 主控开 ...
- stm32【 1.3寸LCD屏幕(1)】
1.3寸屏幕调试 测试平台:STM32F103RFT6 库版本:官方标准库3.5.0版本 屏幕:中景园1.3寸24Pin接插式LCD屏幕 分辨率:240*240像素 驱动芯片:ST7789 驱动方式: ...
- STM32驱动4寸ST7796S LCD-TFT屏
STM32驱动4寸ST7796S LCD-TFT屏 简介 屏幕与STM32F103RCT6开发板接线 屏幕原理图 STM32驱动程序 屏幕显示效果 简介 屏幕驱动芯片ST7796S最大支持320*48 ...
- 基于STM32的智能行车辅助系统(自动大灯,倒车报警,自动雨刷,温湿度传感器,TFT 1.3寸LCD屏幕显示,ESP8266WIFI)
基于STM32+ESP8266的智能行车辅助系统 基于STM32的智能行车辅助系统(自动大灯,倒车报警,自动雨刷,温湿度传感器,TFT 1.3寸LCD屏幕显示,ESP8266WIFI),这是一个课程设 ...
- 基于stm32物联网开发板(2)--LCD屏幕
基于stm32物联网开发板(2)–LCD屏幕 LCD应用展示: LCD屏幕应用 1.概述 屏幕尺寸为1.3寸,分辨率240*240,颜色格式RGB565,驱动IC:ST7789VW: 超大可视角度:大 ...
- [stm32] 一个简单的stm32vet6驱动的天马4线SPI-1.77寸LCD彩屏DEMO
书接上文<1.一个简单的nRF51822驱动的天马4线SPI-1.77寸LCD彩屏DEMO> 我们发现用16MHz晶振的nRF51822驱动1.77寸的spi速度达不到要求 本节主要采用7 ...
- STM32(基于HAL库)驱动0.96寸OLED屏幕(六脚)
STM32驱动0.96寸OLED屏幕(六脚) 1 序言 2 如何利用STM32单片机驱动12864液晶屏 2.1*基本配置* 2.2 *0.96寸OLED端口含义* 2.3 *0.96寸OLED液晶屏 ...
- STM32(基于HAL库)驱动0.96寸OLED屏幕(四脚且中英文皆可显示)
STM32驱动0.96寸OLED屏幕(四脚) 1 注意事项 2 如何利用STM32单片机驱动12864液晶屏 2.1*基本配置* 2.2 *0.96寸OLED端口含义* 2.3 *0.96寸OLED液 ...
- ESP32 入门笔记08:1.54寸(240*240)彩色TFT 显示高清IPS LCD 屏幕 SPI接口
目录 1.屏幕规格 2.原理图 3.程序实现 3.1引脚定义 3.2Adafruit_GFX / Arduino_ST7789版 3.3TFT_eSPI库版 3.3.1配置TFT_eSPI a.选择屏 ...
最新文章
- 程序员网购18年不拆快递!意外离世后满屋快递被拆开,价值3500万!
- JMeter Sampler之BeanShellSampler的使用
- cookies java,java 中 Cookie的用法
- 特别实用的 6 款 Python 特殊文本格式处理库推荐
- Winform自动更新组件分享
- CSS中的position
- android中requestFocus 以及与setFocusable的区别
- DSP重新上电程序不能运行
- ASCⅡ码与字符的相互转化
- Modebus - usb转RS485(芯片)串口驱动
- MOD09A1数据下载与预处理-地表干湿度指数的计算
- 如果你也23岁,那么,别迷茫了!
- Build file: no target in no project
- Tkinter:实用至上主义的经典之作
- 基于撮合交易的物流产业信息化
- win10专业版没有触摸板选项_win10移动鼠标或触控板都没有任何反应如何解决
- PG:什么是grouping sets
- MinGW基本情况介绍
- i.MX6q+QNX(学习笔记一)
- sw槽钢插件_基于VB.NET的SolidWorks型钢库的二次开发
热门文章
- 2020usnews加拿大计算机排名,2020年USNews排名之加拿大大学排名及其介绍
- apue.3与unp在Linux上编程环境搭建
- kaldi教程_Kaldi语音识别快速入门
- 音视频面试题集锦 2022.04
- 开发中常见的编码和乱码问题
- 找不到该项目无法删除
- SpringBoot项目集成全文搜索引擎Elasticsearch
- 搞一下AP AUTOSAR应用 | A1 从SOA-RM 到 SOA 到 AP AUTOSAR 应用
- 服务器申请系统,政务云平台服务器申请
- IO控制器 IO控制方式(程序直接控制、中断驱动、DMA方式、通道控制方式)