名词解释:
FSMC:Flexible Static Memory Controller
LCD:Liquid Crystal Display
TFT:Thin-Film Transistor
统一文章结构(数字后加*):
第一部分: 阐述外设工作原理;第二部分:芯片参考手册对应外设的学习;第三部分:使用STM32CubeMX进行外设初始化;第四部分:添加应用代码;第五部分:附上本篇文章的工程代码的下载地址。
本文将介绍8080、FSMC模拟8080的相关概念以及STM32CubeMX生成FSMC的配置函数,实现控制LCD屏幕显示中英文、图片。
一、什么是8080?(并行异步半双工,上升沿采样)
1.1 8080简介
1.1.1 8080介绍(Intel 8080 Parallel Interface Protocol)
8080并行接口,也称为8080并口协议,是由Intel公司设计的一种并行、异步、半双工通信协议。该接口在扩展方面及数据传输方面具有一定的优越性,因此,尽管8080微处理器已经被逐渐淘汰,但8080的并行总线协议仍然被广泛应用于各种需要高速、近距离接口和传输方式的场景中,如CPU扩展外部的RAM和ROM,LCD、打印机等设备。
1.2 8080物理层
1.2.1 8080接口
1. 控制线(四根):
· RD:写使能
用于控制读取操作。当RD为0时,表示准备读取数据;在RD上升沿到来时,数据将被从设备中读取出来。
· WR:读使能
用于控制写入操作。当WR为0时,表示准备写入数据;当WR上升沿到来时,数据将被写入设备。
· DC(RS):数据/命令
用于区分传输的是命令还是数据。当RS为0时,表示传输的是读写命令;当RS为1时,表示传输的是读写数据。
· CS:片选
用于选中要进行通信的设备。如果有多个设备连接在同一个8080接口上,可以使用译码器通过地址进行访问。
2. 数据线(8/16根):
· D[0:7]: 8 位双向数据线。
· D[0:15]: 16 位双向数据线。
1.2.2 LCD接口(ILI9341-16位8080)
LCD 信号 | 作用 |
---|---|
LCD_RST | LCD 复位引脚,连接 MCU 复位脚,一起复位 |
LCD_BL | LCD 背光阴脚,控制 LCD 背光亮灭,高电平亮 |
LCD_CS | LCD 片选,选中 LCD,低电平有效 |
LCD_WR | LCD 写信号,上升沿有效,用于数据 / 命令写入 |
LCD_RD | LCD 读信号,上升沿有效,用于数据 / 命令读取 |
LCD_RS | LCD 数据 / 命令线,表示当前是读写数据还是命令 |
LCD_D0~D15 | LCD 数据线,16 位,一次可以写入一个像素 |
1.3 8080协议层(ILI9341-16位8080)
1.3.1 ILI9341通信协议选择(常用 16位 8080并口协议)
1.3.2 8080 逻辑控制(以ILI9341通信逻辑介绍)
· CSX(低电平有效):低电平选中芯片,高电平禁用
· RESX(低电平有效):拉低时强制复位芯片
· WRX(数据写入触发信号):上升沿写入数据
· RDX(数据读取触发信号):上升沿读取数据
· D/CX:
写操作:
D/CX=0 → 发送命令(如初始化指令0x01)。
D/CX=1 → 发送数据(如像素颜色值0xRRGGBB)。
读操作:
D/CX=1 → 读取显示数据(如回读显存内容)。
1.3.3 8080 写时序
· 写时序过程:
· CS 拉低,选中
· D/CX 为高-1(数据);低-0(命令)
· RD 为高,禁止写
· 在WR的上升沿(先下降后上升),写数据(D[0:7]/[0:15])到驱动IC
· CS 拉高,取消片选
· 写时序详解:
· 应用时序:
1.3.4 8080 读时序
· 读时序过程:
· CS 拉低,选中
· D/CX 为高-1(数据);低-0(命令)
· WR 为高,禁止写
· 在RD的上升沿(先下降后上升),读线上的数据(D[0:7]/[0:15])
· CS 拉高,取消片选
· 读时序详解:
· 应用时序:
1.4 8080实现数据输入和读取(以8位 8080为例)
后续LCD连接为16位 8080,使用GPIO模拟8080(效率偏低)。开发板内置FSMC接口,后续实践使用FSMC接口。
1.4.1 GPIO模拟8位 8080协议代码 - 写
**
* @brief 通过拼凑的方法向OLED输出一个8位数据
* @param data: 要输出的数据
* @retval 无
*/
static void 8080_data_out(uint8_t data)
{
uint16_t dat = data & 0X0F;
GPIOC->ODR &= ~(0XF << 6); /* 清空6~9 */
GPIOC->ODR |= dat << 6; /* D[3:0]-->PC[9:6] */
GPIOC->ODR &= ~(0X1 << 11); /* 清空11 */
GPIOC->ODR |= ((data >> 4) & 0x01) << 11;
GPIOB->ODR &= ~(0X1 << 6); /* 清空6 */
GPIOB->ODR |= ((data >> 5) & 0x01) << 6;
GPIOE->ODR &= ~(0X3 << 5); /* 清空5,6 */
GPIOE->ODR |= ((data >> 6) & 0x01) << 5;
GPIOE->ODR |= ((data >> 7) & 0x01) << 6;
}
/**
* @brief 写入一个字节
* @param data: 要输出的数据
* @param cmd: 数据/命令标志 0,表示命令;1,表示数据;
* @retval 无
*/
static void 8080_wr_byte(uint8_t data, uint8_t cmd)
{
OLED_RS(cmd);
OLED_CS(0);
OLED_WR(0);
8080_data_out(data);
OLED_WR(1);
OLED_CS(1);
OLED_RS(1);
}
1.4.2 GPIO模拟8位 8080协议代码 - 读
/**
* @brief 从数据引脚读取8位数据
* @retval 读取到的8位数据
*/
static uint8_t 8080_data_in(void)
{
uint8_t data = 0;
// 读取 D0-D3 从 PC6-PC9
data |= (GPIOC->IDR >> 6) & 0x0F;
// 读取 D4 从 PC11
data |= ((GPIOC->IDR >> 11) & 0x01) << 4;
// 读取 D5 从 PB6
data |= ((GPIOB->IDR >> 6) & 0x01) << 5;
// 读取 D6 从 PE5
data |= ((GPIOE->IDR >> 5) & 0x01) << 6;
// 读取 D7 从 PE6
data |= ((GPIOE->IDR >> 6) & 0x01) << 7;
return data;
}
/**
* @brief 读取一个字节
* @param cmd: 数据/命令标志 0,表示命令;1,表示数据;
* @retval 读取到的8位数据
*/
static uint8_t 8080_rd_byte(uint8_t cmd)
{
uint8_t data;
// 设置控制信号
OLED_RS(cmd);
OLED_CS(0);
OLED_RD(0);
// 读取数据
data = 8080_data_in();
// 恢复控制信号
OLED_RD(1);
OLED_CS(1);
OLED_RS(1);
return data;
}
二、什么是FSMC?
2.1 FSMC简介
2.1.1 FSMC介绍
FSMC(Flexible Static Memory Controller,灵活静态存储器控制器) 是嵌入式系统中用于扩展外部存储器的专用硬件模块。它通过标准接口简化了不同静态存储器的访问控制,其核心功能可总结如下:
1. 广泛兼容性
· 支持连接SRAM、ROM、NorFlash、PSRAM等常用静态存储器
· 可对接16位PC卡兼容设备,覆盖主流存储介质
2. 高效数据转换
· 自动将32位AHB总线协议转换为8/16位外设协议
· 内置写操作FIFO缓冲
3. 灵活配置能力
· 4个独立存储区域,各区域有专属片选和时序配置(所有外部存储器共享地址、FSMC 一次只能访问一 个外部器件。)
· 可程序化设定等待周期(最长15时钟)、总线周转等时序参数
· 支持读写独立时序设置,适配不同存储器要求
4. 实时控制特性
· 提供外设异步等待信号接口,动态延长访问周期
· 提供字节通道选择和写使能信号,优化SRAM/PSRAM操作
· 支持突发模式访问同步器件(Nor/PSRAM),提升传输效率
2.1.2 FSMC框图
-
· FSMC 的总线
CPU 和其它 AHB 总线主设备可通过该 AHB 从设备接口访问外部静态存储器。
· 时钟源 -
STM32 内部的 FSMC 控制单元
-
公共信号硬件的引脚
- NOR/PSRAM信号控制线
在控制 LCD 时,使用的是类似异步、地址与数据线独立的 NOR FLASH 控制方式,所以实际上CLK、NWAIT、NADV 引脚并没有使用到。
2.1.3 FSMC外部器件映射
使用FSMC外接存储器,其存储单元是映射到STM32的内部寻址空间的。从FSMC角度看,可以把外部存储器划分为固定大小为256M字节的四个存储块,FSMC 总共管理 1GB 空间。
2.2 FSMC基础
2.2.1 FSMC与LCD连接
2.2.2 FSMC Bank储存管理
2.2.3 HADDR与FSMC_A关系(LCD以16位数据线为例)
HADDR总线是转换到外部存储器的内部AHB地址线(从CPU通过AHB总线到外部信号线之间的关系)。HADDR是字节地址,而存储器访问不都是按字节访问,接到在存储器的地址线与其数据宽度相关。即LCD显存以 半字(2字节) 为单位访问,其物理地址线 Addr_LCD实际对应HADDR的高位部分(忽略最低1位)
LCD使用16位数据线的结论:
HADDR(字节地址)=FSMC逻辑地址×数据宽度字节数
对于16位数据宽度:
addr(HADDR)= 2 * addr(fsmc)
2.2.4 通用时序规则 - 信号同步
1. 所有的控制器输出信号在内部时钟 (HCLK) 的上升沿变化
2. 在同步模式(读取或写入)下,输出的数据在 HCLK 的上升沿变化。无论 CLKDIV 值为何,所有输出均会按以下方式变化:
当出现 FSMC_CLK 时钟的下降沿时,NOEL/NWEL/NEL/NADVL/NADVH/NBLL/ 地址有效输出可发生变化。
当出现 FSMC_CLK 时钟的上升沿时,NOEH/NWEH/NEH/NOEH/NBLH/ 地址有效输出可发生变化。
2.3 NOR Flash/PSRAM 控制器异步事务(仅介绍模式1和A)
NOR/PSRAM控制器产生的异步时序就有5种,总体分为两类:一类是模式1,其他为拓展模式。拓展模式相对模式1来说读写时序时间参数设置可以不同,满足存储器读写时序不一样需求。
如果使能扩展模式(FSMC_BCRx 寄存器中的 EXTMOD 位置 1),则最多可提供四种扩展模式(A、B、C 和 D)。可以混合使用 A、B、C 和 D 模式来进行读取和写入操作。 例如,可以在模式 A 下执行读取操作,而在模式 B 下执行写入操作。
如果禁用扩展模式(FSMC_BCRx 寄存器中的 EXTMOD 位复位),则 FSMC 可以在模式 1 或模式 2 下运行,如下所述:
· 当选择 SRAM/CRAM 存储器类型时,模式 1 为默认模式(FSMC_BCRx 寄存器中MTYP = 0x0 或 0x01)。
· 当选择 NOR 存储器类型时,模式 2 为默认模式(FSMC_BCRx 寄存器中 MTYP = 0x10)
对于异步突发访问方式,FSMC 主要设置 3 个时间参数:地址建立时间(ADDSET)、数据建立时间(DATAST)和地址保持时间(ADDHLD)。FSMC 综合了 SRAM/ROM、PSRAM 和 NOR Flash 产品的信号特点,定义了 4 种不同的异步时序模型。选用不同的时序模型时,需要设置不同的时序参数。
2.3.1 模式 1 - SRAM/PSRAM (CRAM)
- 基本异步访问模式:
模式1是FSMC最基础的异步时序配置,适用于大多数低速或标准速度的NOR Flash或PSRAM器件。 - 时序简单:
不插入额外的等待周期(Wait State),读写时序由ADDSET
(地址建立时间)和DATAST
(数据保持时间)直接控制。
2.3.2 模式 A - SRAM/PSRAM (CRAM) OE 切换
- 扩展异步访问模式:
模式A在模式1的基础上增加了地址保持时间(ADDHOLD
),适用于对时序要求更严格的存储器。 - 更复杂的时序控制:
允许独立配置ADDSET
、ADDHOLD
和DATAST
,从而更精细地适配存储器的时序需求。 - 适用场景:
存储器需要较长的地址保持时间,或接口时序中存在信号抖动问题(如高速总线或长走线)。
2.4 NOR/PSRAM 控制寄存器
NOR/PSRAM 控制寄存器必须按字(32 位)进行访问。
2.4.1 SRAM/NOR-Flash 片选控制寄存器 1..4 (FSMC_BCR1..4)
-
EXTMOD:扩展模式使能位,控制是否允许读写不同的时序。
读和写用不同的时序,该位设置为1
-
WREN:写使能位。
向TFTLCD写入数据,该位设置1
-
MWID[1:0]:存储器数据总线宽度。00,表示8位数据模式;01表示16位数据模式;10和11保留。
00,表示8位数据模式;01表示16位数据模式;10和11保留。
-
MTYP[1:0]:存储器类型。00表示SRAM、ROM;01表示PSRAM;10表示NOR FLASH;11保留。
00表示SRAM、ROM;01表示PSRAM;10表示NOR FLASH;11保留。
-
MBKEN:存储块使能位。
该位设置1
2.4.2 SRAM/NOR-Flash 片选时序寄存器 1..4 (FSMC_BTR1..4)
如果未设置EXTMOD位,则读写共用这个时序寄存器! - (FSMC_BCRx)
- ACCMOD[1:0]:访问模式。00:模式A;01:模式B;10:模式C;11:模式D。
-
DATAST[7:0]:数据保持时间,等于DATAST(+1)个HCLK时钟周期,DATAST最大为255。
注:(+1) - STM32F1的FSMC性能存在问题,F4不需要
对于ILI9341来说,其实就是RD低电平持续时间,最小为355ns。 对于F1,一个HCLK = 13.9ns(1/72M),设置为15 对于F4,一个HCLK = 6ns(1/168M),设置为60
-
ADDSET[3:0]:地址建立时间。表示ADDSET(+1)个HCLK时钟周期,ADDSET最大为15。
对于ILI9341来说,相当于RD高电平持续时间,为90ns。 F1即使设置为0,RD也有超过90ns的高电平,这里设置为1。F4对该位设置为15。
2.4.3 SRAM/NOR-Flash 写入时序寄存器 1..4 (FSMC_BWTR1..4)
- ACCMOD[1:0]:访问模式。00:模式A;01:模式B;10:模式C;11:模式D。
-
DATAST[7:0]:数据保持时间,等于DATAST(+1)个HCLK时钟周期,DATAST最大为255。
对于ILI9341来说,其实就是WR低电平持续时间,最小为15ns。
对于F1,一个HCLK = 13.9ns,设置为3
对于F4,一个HCLK = 6ns,设置为9 -
ADDSET[3:0]:地址建立时间。表示ADDSET(+1)个HCLK时钟周期,ADDSET最大为15。
对于ILI9341来说,相当于WR高电平持续时间,为15ns。
F1即使设置为1,WR也有超过15ns的高电平,这里设置为1。
F4对该位设置为8。
2.4.4 FSMC寄存器组合说明
- 在ST官方提供的寄存器定义里面,并没有定义FSMC_BCRx、FSMC_BTRx、FSMC_BWTRx等这个单独的寄存器,而是将他们进行了一些组合,规则如下:
- FSMC_BCRx和FSMC_BTRx,组合成BTCR[8]寄存器组,他们的对应关系如下:
BTCR[0]对应FSMC_BCR1,BTCR[1]对应FSMC_BTR1
BTCR[2]对应FSMC_BCR2,BTCR[3]对应FSMC_BTR2
BTCR[4]对应FSMC_BCR3,BTCR[5]对应FSMC_BTR3
BTCR[6]对应FSMC_BCR4,BTCR[7]对应FSMC_BTR4 - FSMC_BWTRx则组合成BWTR[7]寄存器组,他们的对应关系如下:
BWTR[0]对应FSMC_BWTR1,BWTR[2]对应FSMC_BWTR2,
BWTR[4]对应FSMC_BWTR3,BWTR[6]对应FSMC_BWTR4,
BWTR[1]、BWTR[3]和BWTR[5]保留,没有用到
三、LCD介绍
参考文章如下:
成像光学:LCD的工作原理与结构图解 - 龙雪 - 博客园
3.1 显示器简介
3.1.1 液晶显示器(LCD)
LCD(Liquid Crystal Display,液晶显示器)是一种基于液晶材料特性的主流显示技术。其核心由液态晶体构成,这种有机化合物在电场作用下会调整分子排列,从而控制光线透过率,配合彩色滤光片形成红、绿、蓝子像素的色彩组合。每个像素通过三原色混合实现丰富色彩表现。
相较于旧式CRT显示器,LCD具有显著优势:
1. 超薄时尚的物理形态;
2. 低功耗特性(约为CRT的1/3);
3. 更高信息承载量;
4. 无闪烁更护眼。这使得LCD广泛应用于电视、电脑、手机等电子设备。
但存在三个主要局限:
1. 依赖背光源导致亮度损耗;
2. 视角较窄(侧面观看效果下降);
3. 响应速度较低(动态画面可能出现拖影)。当前主流已升级为LED背光技术(本质仍是LCD的改进形态),而OLED等新技术正在逐步突破这些限制。
下图为野火手册的LCD的显示结构。
3.1.2 LED和OLED显示器
LED 点阵显示器:
不存在以上液晶显示器的问题,LED 点阵彩色显示器的单个像素点内包含红绿 蓝三色 LED 灯,显示原理类似我们实验板上的 LED 彩灯,通过控制红绿蓝颜色的强度进行混色, 实现全彩颜色输出,多个像素点构成一个屏幕。
OLED(Organic Light Emitting Diode,有机发光二极管显示器):
每个像素独立发光,无需背光。有机材料通电自发光,通过红、绿、蓝子像素亮度调节色彩。OLED 显示器不需要背光源、对比度高、轻薄、视角广及响应速度快等优点。待到生产工艺更加成熟时,必将取代现在液晶显示器的地位。
下图为野火手册的OLED的显示结构。
3.1.3 显示器参数
1. 像素(Pixel)
成像最小单元,每个像素由红(R)、绿(G)、蓝(B)子像素构成,通过混合三原色呈现丰富色彩。以下是关于 高像素密度(PPI - Pixels Per Inch)定义:PPI 表示 每英寸屏幕对角线长度上分布的像素数量,是衡量屏幕细腻度的核心指标。
· 水平像素数:分辨率中的列像素值(如分辨率 1920×1080 中,水平像素为 1920)
· 垂直像素数:分辨率中的行像素值(如分辨率 1920×1080 中,垂直像素为 1080)
· 屏幕对角线尺寸:以英寸为单位(1英寸=2.54厘米)
2. 分辨率(Resolution)
【行像素 × 列像素】表示屏幕总像素数。
· 1920×1080(Full HD):横向1920像素,纵向1080像素
· 2560×1440(2K):横向2560像素,纵向1440像素
3. 色彩深度(Color Depth)
单像素可显示颜色数量,单位为bit(位)。
计算公式:颜色种类 = 2^{bit数}
1bit:单色屏;8bit:256色
4. 显示器尺寸(Screen Size)
屏幕对角线长度,单位英寸(1英寸≈2.54厘米)
· 24英寸(主流办公)
· 27英寸(设计/电竞黄金尺寸)
· 32英寸以上(4K/8K超高清需求
5. 点距(Pixel Pitch)
相邻像素中心间距,单位毫米(mm)。计算公式:
· 小点距(如0.2mm):手机/专业显示器,适合近距离观看
· 大点距(如5mm):户外LED屏,需远距离观看避免颗粒感
3.2 LCD原理图
名称 | 功能 |
---|---|
CS | TFT-LCD 片选信号。 |
WR | 向 TFT-LCD 写入数据。 |
RD | 从 TFT-LCD 读取数据。 |
D[15:0] | 16 位双向数据线。 |
RST | 硬复位 TFT-LCD。 |
RS | 命令 / 数据标志(0,读写命令;1,读写数据)。 |
LCD_BL | 背光灯控制。 |
3.2 LCD控制器芯片(IL9341)
3.2.1 LCD控制器时序
3.2.2 FSMC PASRAM模式 与 8080接口对应
使用其中一条地址线来确定数据/命令选择。
3.2.3 LCD颜色储存方式
ILI9341 采用 RGB565 格式存储颜色数据,此时 ILI9341 的 18 位数据线与 MCU 的 16 位数据线以及 LCD GRAM 的对应关系如图 25.1.2.1 所示:
3.2.4 ILI9341常用命令
下图为正点原子开发手册的内容。
四、基于HAL库配置FSMC(LCD)外设
4.1 原理图分析
4.2 基于STM32CubeMX配置外设
五、字模生成方法及中文和图片显示函数
5.1 中文和图片显示函数
5.1.1 中文显示函数
/**
* @brief 显示中文
* @param x,y : 起始坐标
* @param index : 汉字索引(在字库中的位置)
* @param size : 字体大小 16/24/32
* @param mode : 叠加方式(1); 非叠加方式(0);
* @param color : 汉字颜色
* @retval 无
* 逐列式,阴码,顺向(高位在前)
*/
void lcd_show_chinese(uint16_t x, uint16_t y, uint16_t index, uint8_t size, uint8_t mode, uint16_t color)
{
uint8_t temp, t1;
uint16_t y0 = y;
uint8_t *pfont = NULL;
uint32_t csize = 0; // 每个汉字占用的字节数
// 根据字体大小选择字库
switch (size)
{
case 16:
pfont = (uint8_t *)chinese_1616[index * 2];
csize = 32; // 16x16 点阵,32字节/字
break;
case 24:
pfont = (uint8_t *)chinese_2424[index * 3];
csize = 72; // 24x24 点阵,72字节/字
break;
case 32:
pfont = (uint8_t *)chinese_3232[index * 4];
csize = 128; // 32x32 点阵,128字节/字
break;
default:
return;
}
for (uint16_t t = 0; t < csize; t++)
{
temp = pfont[t]; // 获取点阵数据
// 每个字节处理8个像素点
for (t1 = 0; t1 < 8; t1++)
{
if (temp & 0x80)
{ // 高位在前
lcd_draw_point(x, y, color);
}
else if (mode == 0)
{
lcd_draw_point(x, y, g_back_color);
}
temp <<= 1;
y++;
if ((y - y0) == size)
{ // 换列处理
y = y0;
x++;
break;
}
}
}
}
5.1.2 图片显示函数
/**
* @brief 显示RGB565格式图片
* @param x,y : 图片起始坐标
* @param width : 图片宽度
* @param height: 图片高度
* @param img : 图片数据指针(RGB565数组)
* @retval 无
*/
void lcd_show_image(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t *img)
{
// lcd_set_window(x, y, width, height); // 设置显示窗口
// lcd_write_ram_prepare(); // 准备写入GRAM
uint32_t index = 0;
uint32_t totalpoint = width;
totalpoint *= height; /* 得到总点数 */
lcd_set_cursor(x, y); /* 设置光标位置 */
lcd_write_ram_prepare(); /* 开始写入GRAM */
for (index = 0; index < totalpoint; index++)
{
if(index % width == 0){ // 换行
lcd_set_cursor(x, y + index / width); /* 设置光标位置 */
lcd_write_ram_prepare(); /* 开始写入GRAM */
}
LCD->LCD_RAM = img[index];
}
}
5.2 字模生成方法
5.1.1 中文字模生成
1. 字库取模方法
2. 字库数据
const unsigned char chinese_1616[][16]=
{
{0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x0F,0xFE,0x70,0x00,0x04,0x08,0x18,0x30,},
{0x70,0xC2,0x10,0x02,0x13,0xFE,0x10,0x00,0x10,0x80,0x14,0x60,0x18,0x18,0x00,0x00,},/*"你",0*/
{0x00,0x00,0x00,0x00,0x08,0x82,0x0F,0x44,0x78,0x28,0x08,0x30,0x0F,0xCC,0x00,0x00,},
{0x21,0x00,0x21,0x02,0x21,0x02,0x27,0xFE,0x29,0x00,0x31,0x00,0x01,0x00,0x00,0x00,},/*"好",1*/
{0x00,0x00,0x00,0x00,0x1F,0xF0,0x10,0x20,0x10,0x20,0x1F,0xF0,0x00,0x04,0x23,0x08,},
{0x2D,0x10,0x21,0x60,0x21,0x82,0x21,0x02,0x3F,0xFE,0x21,0x00,0x21,0x00,0x00,0x00,},/*"呀",2*/
};
const unsigned char chinese_2424[][24]=
{
{0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x08,0x00,0x00,0x30,0x00,0x00,0x60,0x00,0x01,0x80,0x01,0x0E,0xFF,0xFE,0x3C,0x00,0x00,},
{0x70,0x00,0x08,0x20,0x10,0x30,0x00,0x60,0xC0,0x01,0x83,0x80,0x07,0x0E,0x04,0x3E,0x08,0x04,0x32,0x00,0x02,0x22,0x00,0x03,},
{0x02,0xFF,0xFE,0x02,0x40,0x00,0x02,0x00,0x00,0x02,0x08,0x00,0x02,0x44,0x00,0x02,0x83,0x00,0x07,0x01,0xC0,0x03,0x00,0xF0,},/*"你",0*/
};
const unsigned char chinese_3232[][32]=
{
{0x00,0x00,0x80,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x70,0x00,0x00,0x01,0xFF,0xFF,0xFF,0x0F,0xBF,0xFF,0xFF,0x3E,0x20,0x00,0x00,},
{0xF8,0x00,0x00,0x00,0xE0,0x00,0x00,0x08,0xC0,0x02,0x00,0x30,0x00,0x0C,0x00,0xC0,0x00,0x18,0x03,0x80,0x00,0x70,0x1F,0x00,0x01,0xC0,0xFC,0x00,0x0F,0x81,0xF0,0x02,},
{0x7F,0x00,0xC0,0x02,0xF9,0x00,0x80,0x03,0xE1,0x00,0x00,0x01,0x41,0x00,0x00,0x03,0x01,0x3F,0xFF,0xFF,0x01,0x3F,0xFF,0xFF,0x01,0x10,0x00,0x00,0x01,0x00,0x00,0x00,},
{0x01,0x00,0x00,0x00,0x01,0x00,0x80,0x00,0x01,0x00,0x40,0x00,0x01,0x10,0x30,0x00,0x01,0x60,0x1C,0x00,0x03,0xC0,0x0F,0x00,0x03,0x80,0x07,0xC0,0x01,0x80,0x03,0xF0,},/*"你",0*/
};
5.1.2 图片字模生成
5.3 最终LCD效果显示图
六、本文的工程文件下载链接
工程Github下载链接:https://github.com/chipdynkid/MCU-DL-STM32
(国内)工程Gitcode下载链接https://gitcode.com/chipdynkid/MCU-DL-STM32