当前位置: 首页 > news >正文

MCU开发学习记录14* - 8080学习与实践(HAL库) - 控制LCD屏幕显示中英文、图片 - STM32CubeMX

名词解释:

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_RSTLCD 复位引脚,连接 MCU 复位脚,一起复位
LCD_BLLCD 背光阴脚,控制 LCD 背光亮灭,高电平亮
LCD_CSLCD 片选,选中 LCD,低电平有效
LCD_WRLCD 写信号,上升沿有效,用于数据 / 命令写入
LCD_RDLCD 读信号,上升沿有效,用于数据 / 命令读取
LCD_RSLCD 数据 / 命令线,表示当前是读写数据还是命令
LCD_D0~D15LCD 数据线,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-PC9data |= (GPIOC->IDR >> 6) & 0x0F;// 读取 D4 从 PC11data |= ((GPIOC->IDR >> 11) & 0x01) << 4;// 读取 D5 从 PB6data |= ((GPIOB->IDR >> 6) & 0x01) << 5;// 读取 D6 从 PE5data |= ((GPIOE->IDR >> 5) & 0x01) << 6;// 读取 D7 从 PE6data |= ((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框图

  1. · FSMC 的总线
            CPU 和其它 AHB
    总线主设备可通过该 AHB 从设备接口访问外部静态存储器。
    · 时钟源
  2. STM32 内部的 FSMC 控制单元
  3. 公共信号硬件的引脚
  4. NOR/PSRAM信号控制线

        在控制 LCD 时,使用的是类似异步、地址与数据线独立的 NOR FLASH 控制方式,所以实际上CLK、NWAITNADV 引脚并没有使用到。

        

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)​,适用于对时序要求更严格的存储器。
  • 更复杂的时序控制​:
    允许独立配置ADDSETADDHOLDDATAST,从而更精细地适配存储器的时序需求。
  • 适用场景​:
    存储器需要较长的地址保持时间,或接口时序中存在信号抖动问题(如高速总线或长走线)。

        

        

        

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原理图

名称功能
CSTFT-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();                // 准备写入GRAMuint32_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

http://www.xdnf.cn/news/424603.html

相关文章:

  • 【Axure视频教程】中继器表格间批量控制和传值
  • 艺考之神余嘉诚话剧舞台首秀《屈原辞》 倾情演绎楚辞风骨
  • [Java][Leetcode middle] 45. 跳跃游戏 II
  • 音频转文字-在线工具包及使用记录
  • 提示词设计模板(基于最佳实践)
  • Datawhale PyPOTS时间序列5月第1次笔记
  • 2025 3D工业相机选型及推荐
  • Elecron 相关介绍以及常见的面试问题
  • 【MapReduce入门】深度解析MapReduce:定义、核心特点、优缺点及适用场景
  • 1950-2024年中国区域的积温数据(大于10°)
  • 2025最新出版 Microsoft Project由入门到精通(七)
  • Unity 2D 行走动画示例工程手动构建教程-AI变成配额前端UI-完美游戏开发流程
  • 5月13日day24日打卡
  • 完成springBoot+vue项目时学习到的知识点
  • 嵌入式STM32学习——外部中断EXTI与NVIC的基础练习⭐
  • 机试刷题:进制转换3
  • 【Pandas】pandas DataFrame cummin
  • 蓝桥杯 11.日志统计
  • 亚远景-基于ASPICE的汽车供应链质量管控培训
  • 网站遭受扫描攻击,大量爬虫应对策略
  • C++伯罗奔尼撒箭阵 全国信息素养大赛复赛决赛 C++小学/初中组 算法创意实践挑战赛 内部集训模拟题详细解析
  • springboot2.7.18 升级到3.1.5过程
  • Ubuntu 22.04.5 LTS 系统中配置仓库源
  • Gartner《如何有效融合Data Fabric 与Data Mesh数据战略》学习心得
  • 【TDengine源码阅读】DLL_EXPORT
  • 【设备管理—磁盘调度算法】
  • 【FMMT】基于模糊多模态变压器模型的个性化情感分析
  • 动态引入document.write的脚本
  • 出于PCB设计层面考虑,连排半孔需要注意哪些事项?
  • 5. 动画/过渡模块 - 交互式仪表盘