【正点原子STM32连载】 第五十一章 汉字显示实验 摘自【正点原子】APM32F407最小系统板使用指南

1)实验平台:正点原子stm32f103战舰开发板V4
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html##

第五十一章 汉字显示实验

本章将介绍正点原子提供的字库管理库的使用,通过使用字库能够在LCD或其他显示设备上显示中文字符,对应中文应用的开发,是一个很有用的工具。通过本章的学习,读者将学习到正点原子字库管理库的使用。
本章分为如下几个小节:
51.1 硬件设计
51.2 程序设计
51.3 下载验证

51.1 硬件设计
51.1.1 例程功能

  1. 程序运行后,会检测NOR Flash中是否存在字库,若不存在则会从SD卡中更新字库到NOR Flash
  2. NOR Flash中的字库准备好后,就开始在LCD上显示汉字
  3. 按下KEY0按键可强制更新字库
  4. 可通过USMART操作LCD显示中文
  5. LED0闪烁,指示程序正在运行
    51.1.2 硬件资源
  6. LED
    LED0 - PF9
  7. 按键
    KEY0 - PE4
  8. USART1(PA9、PA10连接至板载USB转串口芯片上)
  9. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
  10. SD卡(SDIO驱动)
  11. NOR Flash(SPI驱动)
    51.1.3 原理图
    本章实验使用的字库管理库为软件库,因此没有对应的连接原理图。
    51.2 程序设计
    51.2.1 字库管理库的使用
    正点原子提供的字库管理库包含了四个文件,分别为:fonts.c、fonts.h、text.c和text.h,本章实验配套实验例程中已经提供了这四个文件,并且已经针对正点原子APM32F407最小系统板软硬件进行了移植适配,用户在使用时,仅需将这四个文件添加到自己的工程中即可,如下图所示:
    在这里插入图片描述

图51.2.1.1 正点原子字库管理库文件
字库管理库中fonts.c和fonts.h两个文件提供了字库更新和初始化的函数,test.c和test.h文件中提供了在LCD上显示中文字符的函数。
字库管理库在显示中文字符至LCD上时会使用NOR Flash中的中文字库,因此需要确保NOR Flash中的中文字库无误,若NOR Flash中没有中文字库的数据,那么在进行字库初始化时就会提示失败,这时就需要使用字库管理库中提供的字库更新函数更新NOR Flash中的中文字库数据,更新字库是读取SD卡中的字库文件将其写入NOR Flash,因此需确保SD卡中有对应的中文字库文件。
本章实验所需的中文字库文件可在A盘5,SD卡根目录文件SYSTEMFONT中找到,建议将A盘5,SD卡根目录文件中的所有文件按照该目录的目录结构复制到SD卡中,方便后续实验的使用。
51.2.2 实验应用代码
本章实验的应用代码,如下所示:

int main(void)
{
    uint8_t t;
    uint8_t key;
    uint8_t res;
    uint32_t fontcnt;
    uint8_t i;
    uint8_t j;
    uint8_t fontx[2];
    
    NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_3);	/* 设置中断优先级分组为组3 */
    sys_apm32_clock_init(336, 8, 2, 7);					/* 配置系统时钟 */
    delay_init(168);										/* 初始化延时功能 */
    usart_init(115200);									/* 初始化串口 */
    usmart_dev.init(84);								/* 初始化USMART */
    led_init();											/* 初始化LED */
    key_init();											/* 初始化按键 */
    lcd_init();											/* 初始化LCD */
    my_mem_init(SRAMIN);								/* 初始化内部SRAM内存池 */
    my_mem_init(SRAMCCM);								/* 初始化CCM内存池 */
    exfuns_init();										/* 为exfuns申请内存 */
    f_mount(fs[0], "0:", 1);							/* 挂载SD卡 */
    f_mount(fs[1], "1:", 1);							/* 挂载NOR Flash */
    
    while (fonts_init() != 0)							/* 检查字库 */
    {
UPD:
    		lcd_clear(WHITE);
    		lcd_show_string(30, 30, 200, 16, 16, "APM32", RED);
    		
    		while (sd_init() != SD_OK)						/* 初始化SD卡 */
    		{
    			lcd_show_string(30, 50, 200, 16, 16, "SD Card Failed!", RED);
    			delay_ms(200);
    			lcd_fill(30, 50, 200 + 30, 50 + 16, WHITE);
    			delay_ms(200);
    		}
    		
    		lcd_show_string(30, 50, 200, 16, 16, "SD Card OK", RED);
    		lcd_show_string(30, 70, 200, 16, 16, "Font Updating...", RED);
    		res = fonts_update_font(20, 90, 16, (uint8_t *)"0:", RED);	/* 更新字库 */
    		while (res != 0)											/* 更新失败 */
    		{
    			lcd_show_string(30, 90, 200, 16, 16, "Font Update Failed!", RED);
    			delay_ms(200);
    			lcd_fill(20, 90, 200 + 20, 90 + 16, WHITE);
    			delay_ms(200);
    		}
    		
    		lcd_show_string(30, 90, 200, 16, 16, "Font Update Success!   ", RED);
    		delay_ms(1500);
    		lcd_clear(WHITE);
    }
    
    text_show_string(30, 30, 200, 16, "正点原子APM32开发板", 16, 0, RED);
    text_show_string(30, 50, 200, 16, "GBK字库测试程序", 16, 0, RED);
    text_show_string(30, 70, 200, 16, "ATOM@ALIENTEK", 16, 0, RED);
    text_show_string(30, 90, 200, 16, "KEY0: 更新字库", 16, 0, RED);
    
    text_show_string(30, 110, 200, 16, "内码高字节:", 16, 0, BLUE);
    text_show_string(30, 130, 200, 16, "内码低字节:", 16, 0, BLUE);
    text_show_string(30, 150, 200, 16, "汉字计数器:", 16, 0, BLUE);
    
    text_show_string(30, 180, 200, 24, "对应汉字为:", 24, 0, BLUE);
    text_show_string(30, 204, 200, 16, "对应汉字(16*16)为:", 16, 0, BLUE);
    text_show_string(30, 220, 200, 12, "对应汉字(12*12)为:", 12, 0, BLUE);
    
    while (1)
    {
    		fontcnt = 0;
    		for (i=0x81; i<0xFF; i++)				/* GBK内码高字节范围为0x81~0xFE */
    		{
    			fontx[0] = i;
    			lcd_show_num(118, 110, i, 3, 16, BLUE);			/* 显示内码高字节 */
    			
    			for (j=0x40; j<0xFE; j++)/* GBK内码低字节范围为0x40~0x7E、0x80~0xFE) */
    			{
    				if (j == 0x7F)
    				{
    					continue;
    				}
    				
    				fontcnt++;
    				lcd_show_num(118, 130, j, 3, 16, BLUE);		/* 显示内码低字节 */
    				lcd_show_num(118, 150, fontcnt, 5, 16, BLUE);	/* 汉字计数显示 */
    				fontx[1] = j;
    				text_show_font(30 + 132, 180, fontx, 24, 0, BLUE);
    				text_show_font(30 + 144, 204, fontx, 16, 0, BLUE);
    				text_show_font(30 + 108, 220, fontx, 12, 0, BLUE);
    				
    				t = 200;
    				while ((t--) != 0)							/* 延时,同时扫描按键 */
    				{
    					delay_ms(1);
    					
    					key = key_scan(0);
    					if (key == KEY0_PRES)
    					{
    						goto UPD;				/* 跳转到UPD位置(强制更新字库) */
    					}
    				}
    				
    				LED0_TOGGLE();
    			}
    		}
    }
}

从上面的代码中可以看出,本实验的应用代码中,在完成文件系统等一系列初始化后,便调用函数fonts_init()初始化字库管理库,若初始化失败则说明NOR Flash中没有对应的字库数据,因此需要进行更新字库,更新字库时,会从SD卡中读入字库数据并将其写入NOR Flash中,因此需要在SD中提前准备好字库文件。
当NOR Flash有了字库数据后,便在LCD上使用中文显示本实验的实验信息,并不断的显示中文字符,同时检测按键输入,若检测到KEY0按键被按下,则强制进行字库更新。
51.3 下载验证
在完成编译和烧录操作后,将根目录存放了A盘5,SD卡根目录文件中文件的SD卡插入开发板板载的SD卡卡座后,若NOR Flash中没有字库数据,则能够看到LCD显示了正在更新字库的提示,更新完成后,便可以在LCD上看到中文显示的实验信息和不断刷新显示的中文字符,此时可以按下KEY0按键强制更新字库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/138270.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手把手教你数据流图如何画,轻松搞定!

数据流图是一种强大的工具&#xff0c;用于可视化和分析系统中的数据流动和处理过程。它不仅能够帮助我们更好地理解系统的功能和流程&#xff0c;还能够帮助我们发现和解决潜在的问题。在本篇文章中&#xff0c;我们将手把手教你掌握数据流图。 一、数据流图的概念和构成元素 …

稀疏数组如何帮助我们节省内存,提升性能

本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 什么是稀疏矩阵 稀疏矩阵是指矩阵中大部分元素为零的矩阵。在实际应用中&#xff0c;很多矩阵都是稀疏的&#xff0c…

线性回归预测波士顿房价 loss为NAN原因 画散点图找特征与标签的关系

波士顿房价csv文件 链接: https://pan.baidu.com/s/1uz6oKs7IeEzHdJkfrpiayg?pwdvufb 提取码: vufb代码 %matplotlib inline import random import torch import matplotlib.pyplot as plt import numpy as np import pandas as pd import torch从CSV中取出数据集 # 加载数…

SAP ABAP列表格式及表格输出

REPORT YTEST001. DATA wa LIKE spfli. WRITE: /. WRITE: 10航班承运人,40航班连接,60国家代码,80起飞城市,100起飞机场. SELECT * INTO wa FROM spfli.WRITE: / wa-carrid UNDER 航班承运人,wa-connid UNDER 航班连接,wa-countryfr UNDER 国家代码,wa-cityfrom UNDER 起飞城市…

保洁行业上门预约小程序源码系统 轻松预约 避免排队 源码开源可二开 带完整部署教程

生活节奏的逐步加快&#xff0c;人们对家庭保洁服务的需求日益增长。为了满足这一需求&#xff0c;我们为您打造了一款保洁行业上门预约小程序源码系统。这款系统让您轻松预约保洁服务&#xff0c;避免排队等待&#xff0c;同时源码开源可进行二次开发&#xff0c;还带有完整的…

详解Python中单引号双引号三引号的用法(适合小白)

单引号和双引号的使用 python 中单引号和双引号都是用来表示字符串&#xff0c;在一般情况下两者没有任何差别&#xff0c;在编码时统一规则即可 str1hello python! str2"hello python!" print(str1) print(str2) 有的时候我们需要在输出的字符串中输出双引号或者…

上课笔记(11.11之前笔记)

一.数据结构的分类 1.数据结构中分为四大类&#xff1a;线性表&#xff0c;哈希表&#xff0c;树&#xff0c;图。 2.线性表&#xff08;line table&#xff09;&#xff1a;呈现线性结构的一种数据结构。具有顺序性&#xff0c;也就是所有数据都是有序的&#xff1b; 数组&…

【无标题】111

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

通讯协议学习之路(实践部分):UART开发实践

通讯协议之路主要分为两部分&#xff0c;第一部分从理论上面讲解各类协议的通讯原理以及通讯格式&#xff0c;第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN&#xff1b;视频会发布在bilibili(UID:399951374) 本文…

Javascript享元模式

Javascript享元模式 1 什么是享元模式2 内部状态与外部状态3 享元模式的通用结构4 文件上传4.1 对象爆炸4.2 享元模式重构 5 没有内部状态的享元模式6 对象池7 通用对象池实现 1 什么是享元模式 享元&#xff08;flyweight&#xff09;模式是一种用于性能优化的模式&#xff0…

数据恢复工具推荐,高效恢复,这4款很实用!

很多电脑用户都会选择将文件直接保存在电脑上&#xff0c;但是在实际的操作过程中&#xff0c;数据丢失的情况难免会出现。而实用的数据恢复工具或许能有效帮助我们找回丢失的数据。电脑上有哪些使用效果比较好的数据恢复工具呢&#xff1f; 今天小编总结了几款好用的工具&…

leetcode:21. 合并两个有序链表

一、题目 函数原型&#xff1a; struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) 二、思路 合并两个有序链表为一个新的升序链表&#xff0c;只需要遍历两个有序链表并比较结点值大小&#xff0c;依次将较小的结点尾插到新链表即可。 三、代码…

C#中.NET Framework 4.8控制台应用通过EF访问已建数据库

目录 一、创建.NET Framework 4.8控制台应用 二、建立数据库 1. 在SSMS中建立数据库Blogging 2.在VS上新建数据库连接 三、安装EF程序包 四、自动生成EF模型和上下文 1.Blog.cs类的模型 2.Post.cs类的模型 3.BloggingContext.cs数据库上下文 五、编写应用程序吧 我们…

Vatee万腾数字化引领未来,vatee创新思维

随着数字化时代的全面来临&#xff0c;Vatee万腾正以其独特的创新思维&#xff0c;为未来描绘出令人瞩目的数字化画卷。在这个充满变革和机遇的时代&#xff0c;Vatee万腾所展现的数字化引领力和创新思维&#xff0c;成为业界的翘楚。 Vatee万腾的创新思维贯穿于其数字化战略的…

数据结构 | 队列的实现

数据结构 | 队列的实现 文章目录 数据结构 | 队列的实现队列的概念及结构队列的实现队列的实现头文件&#xff0c;需要实现的接口 Queue.h初始化队列队尾入队列【重点】队头出队列【重点】获取队列头部元素获取队列队尾元素获取队列中有效元素个数检测队列是否为空销毁队列 Que…

更新:扶风解析计费系统V1.8.2源码/免授权优化版+附教程/修正完整版

源码简介&#xff1a; 最新的扶风解析计费系统V1.8.2源码&#xff0c;它是修正完整版&#xff0c;免授权优化版附带了教程。是更新优化版最新 V1.8 版本免授权版本。 之前分享过1.7.1版本的扶风计费系统&#xff0c;该版本已经存在相当长的时间&#xff0c;并且一直没有进行更…

一文读懂:什么是RISC-V?为啥它是国产芯崛起的关键?

各位ICT的小伙伴们大家好呀。 提到CPU&#xff0c; 大家首先就会想到"卡脖子"事件。 X86和ARM的IP授权虽然方便&#xff0c;但是不自主和不可控&#xff0c; 一被限制就可能导致国内一夜间"无芯"可用。 今天我们就来聊聊一个解决芯片卡脖子的有效方式-…

多路复用IO:select、poll、epoll

文章目录 一、常见的IO模型二、什么是多路IO复用&#xff1f;三、select、poll、epollselectpollepoll 四、总结 一、常见的IO模型 概念优点       缺点适用场景阻塞IOBlocking IO当应用程序执行IO操作时&#xff0c;会被阻塞&#xff0c;直到数据准备好或者IO操作完成才…

项目管理工具:提高团队协作效率,确保项目按时完成

项目管理对于企业的成功至关重要&#xff0c;一个好的项目管理工具可以提高团队协作效率&#xff0c;确保项目按时完成&#xff0c;并保持项目进度的高效跟踪。 近年来&#xff0c;一款名为“进度猫”的项目管理工具逐渐崭露头角&#xff0c;它以其独特的功能和优势&#xff…

删除快一年的数据,能够恢复吗?

在数字化时代&#xff0c;数据已经成为了企业和个人生活中不可或缺的一部分。然而&#xff0c;由于各种原因&#xff0c;我们有时会需要删除某些数据&#xff0c;比如过期的文件、无用的照片或者账号下的旧信息等。但是&#xff0c;当我们删除这些数据后&#xff0c;是否真的能…