IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 关于在LCD上写字的这件事(字库串口录入加调用) -> 正文阅读

[嵌入式]关于在LCD上写字的这件事(字库串口录入加调用)

如何在LCD上写字

  • 说明: 在LCD上显示ASCII码时,会先将ASCII码对应的图像数组录入到内部FLASH,再直接读取写入就好。但是由于字库过大,甚至比芯片内部FLASH的存储内存还大,所以需要将字库录入外部FLASH,由于字库中每个汉字的顺序也是固定的,所以可以定位到对应的FLASH存储区来读取汉字图像信息。
  • 思路:我采用的是最简单粗暴的方式,通过串口发送字库的二进制文件到单片机中,单片机接收到信息再转存到FLASH中。

1.字库录入

(1)芯片清除
一般外部FLASH的封装库都会带有这个API函数(或类似名称),因为写入FLASH非0xFF的内存会失败,所以要先擦除数据,再进行不检查(即默认内存都是0xFF)写入。

W25QXX_Erase_Chip();

(2)写入字库存在标志位
FONTINFOADDR:自定义的汉字存储区域的起始地址,一个地址对应了FLASH中一个字节。
0xAA:自定义的字库存在标志,这个需要跟使用的字库检测代码相匹配。

#define FONTINFOADDR  1024*1024*25
data = 0xAA;
W25QXX_Write(&rev_buff,FONTINFOADDR,1);

(3)开启串口接收中断

__HAL_UART_ENABLE_IT(huart,UART_IT_RXNE);

(4)定义接收中断处理函数

void User_USART_IRQHandler(UART_HandleTypeDef* huart)
{
	uint8_t Res;
	if((__HAL_UART_GET_FLAG(huart,UART_FLAG_RXNE)!=RESET))  
	{
		HAL_UART_Receive(huart,&Res,1,100);
		W25QXX_Write_NoCheck(&Res,addr,1);
		addr ++;
	}
}

上面的addr在录入不同规格的字库时为不同的值。

#define GBK12_SIZE 574560
#define GBK16_SIZE 766080
#define GBK24_SIZE 1723680
#define GBK32_SIZE 3064320

//录入GBK12字库
addr = FONTINFOADDR + 1; // 加1时为了偏移掉标志位

//录入GBK16字库
addr = FONTINFOADDR + 1 + GBK12_SIZE;

//录入GBK24字库
addr = FONTINFOADDR + 1 + GBK12_SIZE + GBK16_SIZE;

//录入GBK32字库
addr = FONTINFOADDR + 1 + GBK12_SIZE + GBK16_SIZE + GBK24_SIZE;

(5)生成字库
我用的是点阵字库生成器V3.8,正点原子的资料里有,我也会把软件和字库文件都上传到CSDN上。生成字库要注意几个点
在这里插入图片描述

  1. 字体选择中文(PRC GBK)
  2. 宽和高用来确定点阵大小,比如GBK12对应宽高都是12,以此类推。
  3. 修改字体大小,保证预览图正常显示。
  4. 修改模式,这个决定了生成字库的编码格式,这个要和显示汉字的解码函数相匹配,我采用的是模式二。

(6)字库写入

  1. 单片机运行。
  2. 串口打开对应规格字库的.DZK文件, 勾选16进制发送,然后发送文件。
  3. 修改addr值,重复1和2。
    在这里插入图片描述

2.字库解码

  • 里面的W25QXX_Read函数要替换成自己外部FLASH的写入函数。
/**
*@brief 从字库中查找出字模
*@param code 字符串的开始地址,GBK码
*@param mat  数据存放地址 (size/8+((size%8)?1:0))*(size) bytes大小	
*@param size 字体大小
*@note W25QXX_Read函数要替换成自己外部FLASH的写入函数
*/ 
void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size)
{		    
	unsigned char qh,ql;
	unsigned char i;					  
	unsigned long foffset; 
	u8 csize=(size/8+((size%8)?1:0))*(size);//得到字体一个字符对应点阵集所占的字节数	 
	qh=*code;
	ql=*(++code);
	if(qh<0x81||ql<0x40||ql==0xff||qh==0xff)//非 常用汉字
	{   		    
	    for(i=0;i<csize;i++)*mat++=0x00;//填充满格
	    return; //结束访问
	}          
	if(ql<0x7f)ql-=0x40;//注意!
	else ql-=0x41;
	qh-=0x81;   
	foffset=((unsigned long)190*qh+ql)*csize;	//得到字库中的字节偏移量  		  
	switch(size)
	{
		case 12:
			W25QXX_Read(mat,foffset+ftinfo.f12addr,csize);
			break;
		case 16:
			W25QXX_Read(mat,foffset+ftinfo.f16addr,csize);
			break;
		case 24:
			W25QXX_Read(mat,foffset+ftinfo.f24addr,csize);
			break;
		case 32:
			W25QXX_Read(mat,foffset+ftinfo.f32addr,csize);
			break;
			
	}     												    
}  

/**
 *@brief 显示一个指定大小的汉字
 *@param x,y 汉字的坐标
 *@param font 汉字GBK码
 *@param size 字体大小
 *@param mode 0,正常显示,1,叠加显示
 *@note LCD_Fast_DrawPoint函数需要换成自己的LCD绘点函数
 */     
void Show_Font(u16 x,u16 y,u8 *font,u8 size,u8 mode)
{
	u8 temp,t,t1;
	u16 y0=y;
	u8 dzk[128];   
	u8 csize=(size/8+((size%8)?1:0))*(size);			//得到字体一个字符对应点阵集所占的字节数	 
	if(size!=12&&size!=16&&size!=24&&size!=32)return;	//不支持的size
	Get_HzMat(font,dzk,size);	//得到相应大小的点阵数据 
	for(t=0;t<csize;t++)
	{   												   
		temp=dzk[t];			//得到点阵数据                          
		for(t1=0;t1<8;t1++)
		{
			if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);
			else if(mode==0)LCD_Fast_DrawPoint(x,y,BACK_COLOR); 
			temp<<=1;
			y++;
			if((y-y0)==size)
			{
				y=y0;
				x++;
				break;
			}
		}  	 
	}  
}

效果图:
在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-06 12:23:33  更:2021-10-06 12:24:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:41:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码