学习2__STM32--汉字显示
汉字显示操作流程
第一,进入主函数
int main(void)
{
u32 fontcnt;
u8 i,j;
u8 fontx[];//gbk码
u8 key,t; delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(); //串口初始化为9600
LED_Init(); //LED端口初始化
LCD_Init(); //初始化液晶
KEY_Init(); //按键初始化
usmart_dev.init(); //usmart初始化
mem_init(SRAMIN); //初始化内部内存池 exfuns_init(); //为fatfs相关变量申请内存
f_mount(,fs[]); //挂载SD卡
f_mount(,fs[]); //挂载FLASH.
key=KEY_Scan(); //按键扫描
LCD_ShowString(,,,,,"Warship STM32"); while(font_init()||key==KEY_UP) //检查字库
{
UPD:
LCD_Clear(WHITE); //清屏
POINT_COLOR=RED; //设置字体为红色
LCD_ShowString(,,,,,"Warship STM32");
while(SD_Initialize()) //检测SD卡
{
LCD_ShowString(,,,,,"SD Card Failed!");
delay_ms();
LCD_Fill(,,+,+,WHITE);
delay_ms();
}
LCD_ShowString(,,,,,"SD Card OK");
LCD_ShowString(,,,,,"Font Updating...");
key=update_font(,,,);//从SD卡更新
while(key)//更新失败
{
LCD_ShowString(,,,,,"Font Update Failed!");
delay_ms();
LCD_Fill(,,+,+,WHITE);
delay_ms();
}
LCD_ShowString(,,,,,"Font Update Success!");
delay_ms();
LCD_Clear(WHITE);//清屏
}
主函数主要是做了,外设初始化,磁盘挂载,字库检查,显示汉字信息
第二,进入检查字库函数
u8 font_init(void)
{
SPI_Flash_Init();
FONTINFOADDR=(*+)*; //W25Q64,6M以后
ftinfo.ugbkaddr=FONTINFOADDR+; //UNICODEGBK 表存放首地址固定地址
SPI_Flash_Read((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo));//读出ftinfo结构体数据
if(ftinfo.fontok!=0XAA)return ; //字库错误.
return ;
}
没有检测到字库就需要更新字库
第3行,初始化Flash
第4行,确定字库开始的地址,Flash的前6M给FatFS使用,后接500K用户使用区,
第5行,再接25Bytes的字库表头信息
第6行,读取表头结构体信息数据
第7行,检测字库表头结构体成员字体正确标志
第三,进入更新字库函数
u8 update_font(u16 x,u16 y,u8 size,u8 src)
{
u8 *gbk16_path;
u8 *gbk12_path;
u8 *unigbk_path;
u8 res;
if(src)//从25qxx更新
{
unigbk_path=(u8*)UNIGBK_25QPATH;
gbk12_path=(u8*)GBK12_25QPATH;
gbk16_path=(u8*)GBK16_25QPATH;
}else//从sd卡更新
{
unigbk_path=(u8*)UNIGBK_SDPATH;
gbk12_path=(u8*)GBK12_SDPATH;
gbk16_path=(u8*)GBK16_SDPATH;
}
res=0XFF;
ftinfo.fontok=0XFF;
SPI_Flash_Write((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo)); //清除之前字库成功的标志.防止更新到一半重启,导致的字库部分数据丢失.
SPI_Flash_Read((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo)); //重新读出ftinfo结构体数据
LCD_ShowString(x,y,,,size,"Updating UNIGBK.BIN");
res=updata_fontx(x+*size/,y,size,unigbk_path,); //更新UNIGBK.BIN
if(res)return ;
LCD_ShowString(x,y,,,size,"Updating GBK12.BIN ");
res=updata_fontx(x+*size/,y,size,gbk12_path,); //更新GBK12.FON
if(res)return ;
LCD_ShowString(x,y,,,size,"Updating GBK16.BIN ");
res=updata_fontx(x+*size/,y,size,gbk16_path,); //更新GBK16.FON
if(res)return ;
//全部更新好了
ftinfo.fontok=0XAA;
SPI_Flash_Write((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo)); //保存字库信息
return ;//无错误.
}
第7行,选择字库更新来源
第8行,读取字库所在目录
第19行,清除字库表头信息中的字库正确标志
第20行,将修改过的字库表头信息写入Flash(修改了字库正常标志)
第21行,将字库表头信息从Flash中读出,用以跟最后字库更新成功后的正常标志一起写入Flash
第23行,更新字库文件
第32行,在确认字库更新正确后,标志字库表头信息中的字库更新正常标志
第33行,将最终正确的字库表头写入Flash,供之后检查字库使用
字库更新底层函数
u8 updata_fontx(u16 x,u16 y,u8 size,u8 *fxpath,u8 fx)
{
u32 flashaddr=;
FIL * fftemp;
u8 *tempbuf;
u8 res;
u16 bread;
u32 offx=;
u8 rval=;
fftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL)); //分配内存
if(fftemp==NULL)rval=;
tempbuf=mymalloc(SRAMIN,); //分配4096个字节空间
if(tempbuf==NULL)rval=;
res=f_open(fftemp,(const TCHAR*)fxpath,FA_READ);
if(res)rval=; //打开文件失败
if(rval==)
{
if(fx==) //更新UNIGBK.BIN
{
ftinfo.ugbkaddr=FONTINFOADDR+sizeof(ftinfo); //信息头之后,紧跟UNIGBK转换码表
ftinfo.ugbksize=fftemp->fsize; //UNIGBK大小
flashaddr=ftinfo.ugbkaddr;
}else if(fx==) //GBK12
{
ftinfo.f12addr=ftinfo.ugbkaddr+ftinfo.ugbksize; //UNIGBK之后,紧跟GBK12字库
ftinfo.gbk12size=fftemp->fsize; //GBK12字库大小
flashaddr=ftinfo.f12addr; //GBK12的起始地址
}else //GBK16
{
ftinfo.f16addr=ftinfo.f12addr+ftinfo.gbk12size; //GBK12之后,紧跟GBK16字库
ftinfo.gkb16size=fftemp->fsize; //GBK16字库大小
flashaddr=ftinfo.f16addr; //GBK16的起始地址
}
while(res==FR_OK)//死循环执行
{
res=f_read(fftemp,tempbuf,,(UINT *)&bread); //读取数据
if(res!=FR_OK)break; //执行错误
SPI_Flash_Write(tempbuf,offx+flashaddr,); //从0开始写入4096个数据
offx+=bread;
fupd_prog(x,y,size,fftemp->fsize,offx); //进度显示
if(bread!=)break; //读完了.
}
f_close(fftemp);
}
myfree(SRAMIN,fftemp); //释放内存
myfree(SRAMIN,tempbuf); //释放内存
return res;
}
第14行,打开字库文件,获取fftemp对应结构体的文件信息
第20行,确认字库要写入Flash中的地址
第21行,确认字库文件的大小
第36行,从fftemp所指的字库文件中读取4096Bytes的数据到tempbuf缓冲区中,并且将当前读到数据的位置存入bread变量中
第38行,将读到的4096Byte的字库数据写入Flash中
第39行,字库的写入地址偏移增加
第41行,判断字库数据是否已读取完
学习2__STM32--汉字显示的更多相关文章
- 【STM32H7教程】第51章 STM32H7的LTDC应用之LCD汉字显示和2D图形显示
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第51章 STM32H7的LTDC应用之LCD汉字 ...
- STemwin汉字显示
硬件环境: STM32F429,电容屏800X480 5点触控RGB屏幕 ,SPI flash: 软件环境: UCOSIII,STemwin: 汉字显示方法: 1.在SPIflash中装在字库XBF_ ...
- Keil C51汉字显示的bug问题
一.缘起 这两天改进MCU的液晶显示方法,采用“即编即显”的思路,编写了一个可以直接显示字符串的程序.如程序调用disstr("我是你老爸");液晶屏上就会显示“我是你老爸”. 二 ...
- Keil C51汉字显示的bug问题(0xFD问题)
一.缘起 这两天改进MCU的液晶显示方法,采用“即编即显”的思路,编写了一个可以直接显示字符串的程序.如程序调用disstr("我是你老爸");液晶屏上就会显示“我是你老爸”. 二 ...
- Keil version 2汉字显示乱码的解决方案
Keil version 2汉字显示乱码的解决方案 Keil2对汉字的支持不好,在删除汉字字符时,一不小心会删除一半而留一半,这时并不显示错误或乱码,而是貌似都删除了,但编译程序可能会报错,这时再查错 ...
- LCD开发之汉字显示
一.LCD显示原理 利用液晶制成的显示器称为LCD,根据驱动方式可分为静态驱动.简单矩阵驱动以及主动矩阵驱动3种.当中,简单矩阵型又可再细分扭转向列型(TN)和超扭转式向列型(STN)两种,而主动矩阵 ...
- 一次永久解决cmd窗口汉字显示乱码
对于编译出的程序,在 cmd 和 power shell 运行时都不能正确显示汉字. 网上查,可以再命令窗口修改: 1.打开CMD.exe命令行窗口 2.通过 chcp命令改变代码页,UTF-8的代码 ...
- Ubuntu 汉字显示一半的修复
部分汉字(例如“复”)显示不正常,只显示一半,其原因是Ubuntu采用的字体Noto Sans CJK优先显示日文汉字,这一问题可以通过修改配置文件/etc/fonts/conf.avail/64-l ...
- emWin 工程之汉字显示
@2018-7-10 工程加入字库后,液晶屏显示非法文字,无法正确显示设置的文字 解决办法 将显示汉字的文件 <MainTask.c> 修改为 UTF-8 格式后显示正常,修改为 ANS ...
随机推荐
- 【php增删改查实例】第十九节 - session的使用: 让服务器知道你是谁?
因为HTTP请求是一种无状态的请求,所谓无状态,就是服务器不会记录下你本次请求的信息.http它是基于请求 - 相应模式的一种数据传输协议.就是说,你发送一个请求,我服务器给你一个响应,这件事情就算完 ...
- 你要的fpga&数字前端笔面试题都在这儿了
转自http://ninghechuan.com 你要的FPGA&数字前端笔面试题来了 FPGA&ASIC基本开发流程 题目:简述ASIC设计流程,并列举出各部分用到的工具. 勘误:C ...
- JDK8漫谈——集合更强大
解决什么问题 集合计算不足 解决重复代码 背后思想 管道 封装 数据处理 内容说明 是什么 计算担当.集合用于数据存储,流用于数据计算,不会修改原始数据 内置循环.高级迭代器,内置循环和计算 单向.数 ...
- Nginx挂载维护页或返回自定义响应信息
在服务停机升级或者服务暂不可用时,往往希望能够返回给用户更为明确和友好的响应信息.可以通过修改nginx配置文件,达到返回自定义信息的效果.有如下几种配置方式: (1)Nginx接收到的所有请求,都返 ...
- 系统重启后DNS地址默认修改修改引起的一次事故(Tomcat报错:java.net.UnknownHostException)
事故描述:公司的一个内部业务系统由于程序bug,导致系统崩溃,需要强制重启服务器.系统重启后,赶紧将业务程序启动.随后发现/etc/resolv.conf文件的DNS地址被修改成了默认地址.发现之后, ...
- 多校寒训TaoTao要吃鸡dp
题目描述 Taotao的电脑带不动绝地求生,所以taotao只能去玩pc版的荒野行动了, 和绝地求生一样,游戏人物本身可以携带一定重量m的物品,装备背包 之后可以多携带h(h为0代表没有装备背包)重量 ...
- 第六周-总结&结对编程
1.结对编程 结对编程的Partner依旧是郑蕊师姐(博客:http://www.cnblogs.com/zhengrui0452/) 我们一起改进的是郑蕊师姐做的“四则运算” 郑蕊师姐之前完成四则运 ...
- js实现随机的四则运算题目(2)-更新界面
上次的代码提交完成后,有很多bug.比如函数会重复调用执行,每点击一次按钮都会在生成题目的下方直接生成新的题目,于是我在代码前面添加了如下的代码: function play_allE() { doc ...
- 20135323符运锦期中总结----Linux系统的理解及学习心得
一.网易云课堂 1.各章节总结 第一周:计算机是如何工作的http://www.cnblogs.com/20135323fuyunjin/p/5222787.html 第二周:操作系统是如何工作的ht ...
- 小学生四则运算App实验成果
组名:会飞的小鸟 组员:徐侃 陈志棚 罗伟业 刘芮熔 成员分工: ①刘芮熔:设置安卓包.界面的代码,界面的排序. ②陈志棚:加减乘除的判断异常处理,例如除数不能为零的异常处理等问题. ③徐侃 ...