【STM32篇】LCD显示汉字(从W25Q64中读取GBK字库)

这篇具有很好参考价值的文章主要介绍了【STM32篇】LCD显示汉字(从W25Q64中读取GBK字库)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        汉字显示在很多单片机产品中都需要用到,显示个别汉字可使用MCU的flash保存汉字字模,而显示更多的汉字就可能要在产品中保存一整个字库作为汉字储备。对于STM32F103VET6单片机FLASH只有512K字节,要存下一个字库就有点乏力且浪费单片机资源。在上一章节中完成了W25Q64驱动,本篇将介绍将GBK字库写入W25Q64中,并读取至LCD屏上显示。

LCD和W25Q64驱动请参考以下文章:

【STM32篇】驱动LCD显示屏

【STM32篇】SPI时序驱动W25Q64(硬件SPI和模拟SPI)

1. 汉字字库

        常用的汉字内码系统有 GB2312、GB13000、UNICODE、GBK、BIG5(繁体)等几种,其中 GB2312 支持的汉字仅有6763个,而 GBK 内码不仅完全兼容 GB2312,还支持了繁体字,总汉字数有 21886个,完全能满足我们一般应用的要求。

        GB2312 码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集--基本集》, 由国家标准总局发布, 1981 年 5 月 1 日 实施,通行于大陆。新加坡等地也使用此编码。GB2312 收录简化汉字及符号、字母、 日文假名等共 7445 个图形字符,其中汉字占 6763 个。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,这也是最基本的中文字符集。GB2312规定对于任意一个图形字符都采用两个字节表示,第一个字节为高字节,第二个字节为低字节。其编码范围高位0xA1~0xFE,低位0xA1~0xFE。汉字从0xB0A1开始,结束于0xF7FE。

GB2312地址偏移计算:

GB_H = *pFont++;

GB_L = *pFont++;

GB_H -= 0xA1;

GB_L -= 0xA1;

Addr_offset = (94*GB_H + GB_L)*(size * 2);

        全国信息技术化技术委员会于 1995 年 12 月 1 日《汉字内码扩展规范》。GBK 向下与 GB2312 完全兼容,向上支持 ISO 10646 国际标准。GBK规定对于任意一个图形字符也采用两个字节表示,第一个字节为高字节,第二个字节为低字节。其编码范围高位0x81~0xFE,低位0x40~0xFE。汉字从0x8140开始,结束于0xFEFE。

GBK地址偏移计算:

GBKH = *pFont++;

GBKL = *pFont++;

if(GBKL < 0x7F) 

 {
        Addr_offset = ((GBKH-0x81)*190 + GBKL - 0x40)*(size * 2);
 }
else
 {
         Addr_offset = ((GBKH-0x81)*190 + GBKL - 0x41)*(size * 2);
 }

2. LCD显示中文

        LCD显示中文函数依然是调用画点函数去画汉字字模的每个字节,函数需要根据汉字取模的方式进行画点。如下图,根据自己的喜好进行选择,我选择的是方式三(字节高位在前,横向取字节)。

单片机汉字字库,M3,stm32,嵌入式硬件,单片机

         在编写函数时,可根据字模大小确定总字节数,写完一个字节数据横坐标加1直至画汉字的闪上一部分,列坐标加8,画汉字的下一部分直至画完一个汉字。

/*
	\brief:	显示汉字(行列式,高位在前)
	\param:	x:横坐标,y:列坐标
				w:字符宽度  h字符高度
				size:汉字大小
				Font:保存汉字的首地址
				colour:颜色
	\retval:	none
*/

void LCD_DisplayChinese(uint16_t x,uint16_t y,uint16_t size,char *Font,uint16_t colour)
{
	char *pFont = Font;
	uint8_t GBKL,GBKH,tmp;
	uint16_t SIZE = size*size/8;//计算字节数
	uint16_t y0=y;//记录第一行显示的初始位置
    uint16_t x1=x;//记录显示的初始位置
	uint16_t y1=y;
	uint16_t i,j;
	uint32_t Addr_offset;//汉字的偏移地址
	uint8_t *pBuff = malloc(SIZE);//动态分配空间
	while(*pFont != '\0')
	{
		//计算汉字的偏移地址
		GBKH = *pFont++;//高字节
		GBKL = *pFont++;//低字节
		if(GBKL < 0x7F) 
		{
			Addr_offset = ((GBKH-0x81)*190 + GBKL - 0x40)*(size * 2);
		}
		else
		{
			Addr_offset = ((GBKH-0x81)*190 + GBKL - 0x41)*(size * 2);
		}
		//从flash中取出一个汉字
		switch(size)
		{
			case 16:W25Q64_ReadData(W25Q64_GBK_ADDR + Addr_offset,pBuff,SIZE);break;
			default :W25Q64_ReadData(W25Q64_GBK_ADDR + Addr_offset,pBuff,SIZE);break;
		}
		//显示一个汉字
		for(i=0;i<SIZE;i++)
		{
			tmp = *(pBuff+i);
			for(j=0;j<8;j++)
			{
				if(tmp & 0x80)	//高位先发
				{
					LCD_DrawDot(x,y,colour);
				}
				tmp <<= 1;
				y++;
			}
			x++;
			if(x-x1 == size)
			{
				x = x1;
				y1 += 8;
			}
			y = y1;
		}
		//一个汉字显示完成,为下一个汉字显示做准备
		x += size;
		if(LCD_WIDTH - x < size)//考虑是否需要换行
		{
			y0 += size;
			x = 0;
		}
		y = y0;
	}
	free(pBuff);//释放空间
}

        函数用于显示一个或多个汉字。

(1)变量定义秉承需要什么定义什么,定义一个指针指向要显示的汉字“串”;定义GBK_L和GBK_H用于计算一个汉字的高低两位字节,tmp保存字库中的一个字节;计算汉字占用的字节数,记录初始位置;Addr_offset用于记录汉字在字库中的偏移地址(并非地址);pBuff保存一个汉字的字模。

(2)计算汉字的偏移地址。

(3)使用W25Q64读函数从flash中读取字模并保存,这里只在flash中烧录了一个16x16的GBK字库,可以根据的需求定义不同尺寸的汉字。地址为GBK在flash中的起始地址加上汉字的偏移地址就可以定位到汉字字模在flash中的位置。

(4)显示一个汉字,读取完成一个汉字字模后,按照汉字的取模方式进行画字节。首先依次取出字模的每个字节,在设置的列坐标上画一个字节;随后横坐标递增,并判断是否画完汉字的上一部分;随后画下一部分,直至画完一个汉字。

(5)偏移横坐标,画下一个汉字。如果屏幕宽度不够,则换下一行显示。

(6)最后释放申请的动态空间。

2.1 汉字取模

单片机汉字字库,M3,stm32,嵌入式硬件,单片机

         在软件上选择喜欢的字体以及字体大小,设置字体的宽高(这个是字体的尺寸。例如字体大小为12,宽高为16x16,实际生产的汉字大小就是16x16)。选择字库,可以选择GB2312或者GBK等。

单片机汉字字库,M3,stm32,嵌入式硬件,单片机

         这里我选择字库GBK,选择模式3,最后生成一个DZK后缀的字库。

单片机汉字字库,M3,stm32,嵌入式硬件,单片机

        在WinHex软件中打开生成的字库(直接打开是一堆乱码),就可以看到生成的十六进制编码形式的字库了,只需要复制这些十六进制文件到工程中写入FLASH即可。 

单片机汉字字库,M3,stm32,嵌入式硬件,单片机

        在WinHex中就可以看到汉字在字库的的位置,offset为偏移量。 由于生成的字库很大,不能一次性直接保存到工程中,要分批次写入flash。

3. W25Q64烧录字库

        在WinHex软件中选择所有十六进制,然后定义选快,这里选择分两次写入所以定义选块为起始到中间。

单片机汉字字库,M3,stm32,嵌入式硬件,单片机单片机汉字字库,M3,stm32,嵌入式硬件,单片机

最后复制选快,选择生成C源码。 

 单片机汉字字库,M3,stm32,嵌入式硬件,单片机

         粘贴到工程文件中,就是一个unsigned char类型的数组,一共383041字节,这个数字相对于MCU来说非常大了。

单片机汉字字库,M3,stm32,嵌入式硬件,单片机

         我这里用一个专门的文件保存这些字库。注意复制下一半字库时,应该从文件中间+1到文件结尾,不能直接从文件中间到文件结尾,否则文章中间这个字节的数据会有一个重复,后面的数据也都向后偏移了一个字节。读取的时候就会发生错误。

单片机汉字字库,M3,stm32,嵌入式硬件,单片机

         然后分次写入字库。

单片机汉字字库,M3,stm32,嵌入式硬件,单片机

        这里是先烧录前半段字库,font.c中的 #if 0改为#if 1。这里的起始地址可以根据自己的需求设置,起始地址这里为0x100000。此时将编译好的代码烧录到单片机时,就会很慢。这里是用的调试功能烧录代码,当代码运行到W25Q64的下一行时,表示字库烧录完成,然后改变偏移地址,写入下半段字库。最后屏蔽写字库函数,font.c的字库也可以删掉或者屏蔽掉。最后执行LCD显示汉字函数,测试字库是否写入成功。

单片机汉字字库,M3,stm32,嵌入式硬件,单片机

4.附件

工程代码:

链接:https://pan.baidu.com/s/1knCY6ndloHx6GPAyfEWpQg?pwd=1234 
提取码:1234

2023/07/21文章来源地址https://www.toymoban.com/news/detail-703021.html

到了这里,关于【STM32篇】LCD显示汉字(从W25Q64中读取GBK字库)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32--SPI通信与W25Q64(2)

    STM32–SPI通信与W25Q64(1) STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担 。 3线全双工同步传输 8或16位传输帧格式选择 主或从操作 支持多主模式 8个主模式波特率预分频系数(最大为fPCLK/2) 主模式和从模式下均可以由软件或硬

    2024年02月10日
    浏览(45)
  • 【STM32】软件SPI读写W25Q64芯片

    目录 W25Q64模块 W25Q64芯片简介 硬件电路 W25Q64框图 Flash操作注意事项 状态寄存器 ​编辑 指令集 INSTRUCTIONS​编辑 ​编辑 SPI读写W25Q64代码 硬件接线图 MySPI.c MySPI.h W25Q64 W25Q64.c W25Q64.h W25Q64_Ins.h main.c 测试 SPI通信(W25Q64芯片简介,使用SPI读写W25Q64存储器芯片)  SPI通信文章:【

    2024年02月19日
    浏览(43)
  • 【STM32 CubeMX】SPI W25Q64功能实现

    SPI Flash 存储器在嵌入式系统中扮演着重要角色,它可以为微控制器提供额外的存储空间,并且具有快速的读写速度和较大的存储容量。W25Q64 是一款常见的 SPI Flash 存储器,容量为64Mb,采用 SPI 接口进行通信。在 STM32 微控制器上实现对 W25Q64 的功能使用,可以通过 STM32 CubeMX 和

    2024年02月22日
    浏览(69)
  • 【STM32】SPI初步使用 读写FLASH W25Q64

    (1) SS( Slave Select):从设备选择信号线,常称为片选信号线,每个从设备都有独立的这一条 NSS 信号线,当主机要选择从设备时,把该从设备的 NSS 信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行 SPI通讯。所以 SPI通讯以 NSS 线置低电

    2024年02月10日
    浏览(53)
  • 26、江科大stm32视频学习笔记——W25Q64简介

    一、W25Q64简介 1、W25Q64的内存空间结构:  一页256字节,4K(4096 字节)为一个扇区,16个扇区为1块,容量为8M字节,共有128个块,2048 个扇区。   2、W25Q64每页大小由256字节组成,每页的256字节用一次页编程指令即可完成。 3、擦除指令分别支持: 16页(1个扇区)、128页、256页、全片

    2024年01月22日
    浏览(50)
  • 【STM32】STM32学习笔记-硬件SPI读写W25Q64(40)

    在大容量产品和互联型产品上,SPI接口可以配置为支持SPI协议或者支持I2S音频协议。SPI接口默认工作在SPI方式,可以通过软件把功能从SPI模式切换到I2S模式。 在小容量和中容量产品上,不支持I2S音频协议。 串行外设接口(SPI)允许芯片与外部设备以半/全双工、同步、串行方式

    2024年02月19日
    浏览(68)
  • 【STM32】STM32学习笔记-软件SPI读写W25Q64(38)

    在大容量产品和互联型产品上,SPI接口可以配置为支持SPI协议或者支持I 2 S音频协议。SPI接口默认工作在SPI方式,可以通过软件把功能从SPI模式切换到I2S模式。 在小容量和中容量产品上,不支持I 2 S音频协议。 串行外设接口(SPI)允许芯片与外部设备以半/全双工、同步、串行方

    2024年01月24日
    浏览(46)
  • Clion开发Stm32之存储模块(W25Q64)驱动编写

    涵盖之前文章: Clion开发STM32之HAL库SPI封装(基础库) 头文件 源文件

    2024年02月10日
    浏览(50)
  • STM-32:SPI通信协议/W25Q64简介—软件SPI读写W25Q64

    SPI是串行外设接口(Serial Peripheral Interface)的缩写,是美国摩托罗拉公司(Motorola)最先推出的一种同步串行传输规范,也是一种单片机外设芯片串行扩展接口,是一种高速、全双工、同步通信总线,所以可以在同一时间发送和接收数据,SPI没有定义速度限制,通常能达到甚

    2024年02月16日
    浏览(43)
  • STM32使用QUADSPI读写外部Nor Flash(以W25Q64为例)

    QUADSPI 是一种专用的通信接口,连接单、双或四(条数据线) SPI Flash 存储介质。该接 口可以在以下三种模式下工作: ①间接模式:使用 QUADSPI 寄存器执行全部操作。 ②状态轮询模式:周期性读取外部 Flash 状态寄存器,而且标志位置 1 时会产生中断(如擦除或烧写完成,会

    2024年02月11日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包