完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
说明: 在LCD上显示ASCII码时,会先将ASCII码对应的图像数组录入到内部FLASH,再直接读取写入就好。但是由于字库过大,甚至比芯片内部FLASH的存储内存还大,所以需要将字库录入外部FLASH,由于字库中每个汉字的顺序也是固定的,所以可以定位到对应的FLASH存储区来读取汉字图像信息。
(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上。生成字库要注意几个点
/** *@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 } 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 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; } } } } |
|
|
|
只有小组成员才能发言,加入小组>>
3120 浏览 9 评论
2819 浏览 16 评论
3332 浏览 1 评论
8693 浏览 16 评论
3921 浏览 18 评论
9540浏览 3评论
871浏览 3评论
440浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
442浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2168浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-15 00:22 , Processed in 0.892050 second(s), Total 49, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号