欢迎访问装备制造资讯网!

装备制造资讯网

您现在的位置是: 首页 > 装备制造业 >详情

电子制造技术书籍阅读(基于STM32F4的电子阅读器制作教程(含代码))

发布时间:2024-03-28 18:58:59 装备制造业 75次 作者:装备制造资讯网

一、项目功能要求

项目说明:

电子制造技术书籍阅读(基于STM32F4的电子阅读器制作教程(含代码))

项目偏软件,但是要依赖于自己对硬件的熟悉和驱动才能完成

用到的主要技术:

SD卡驱动(难–不过可移植SD卡驱动细节可在用完再了解其驱动协议)FatFs文件系统移植使用LCD屏驱动(加载字库文件做字库在LCD上的显示)

功能要求:

开机Logo电子书列表扫描电子书列表显示及小说选择菜单阅读功能:字体选择字体大小选择字体颜色设置阅读背景设置书签设置能够记录每本电子书的退出时处于什么阅读位置下次进入从该位置继续阅读目录生成功能(字符匹配)章节跳转功能(基于目录生成功能)阅读翻页设置(滚动/切换)二、材料准备

1、普中STM32F4ZGT6最小系统板一块(或者其他STM32F4板子)

(注意要买能插LCD屏的)

作用:主控芯片、处理各种数据

2、800*4804.3寸电容触摸LCD屏(我用的正点原子的屏)

作用:显示与触摸控制

3、一张32G以下的SD卡和一个读卡器

作用:存储小说文件与图片文件

二、硬件连接

1、把屏幕插到开发板上即可

三、相关知识点

(一)、txt文件数据的读取

1、谈谈txt文件

学过C语言的文件IO都知道,用open函数打开后,用read函数读取的第一个字节开始就是文本内容,txt文件是文档文件,对于我们程序员来说文档文件是最容易操作的文件类型之一,因为它不像图片那样还需要考虑头部的一大堆信息

2、读取txt文件数据

利用FATFS文件系统提供的函数f_open、f_read即可对数据进行读取出来,当然读取出来的都是文字的编码,可以先用串口函数打印出来看看数据对不对printf(“%s\r\n”,buf);

(二)汉字的显示(具体代码参考正点原子“汉字显示实验”)

1、汉字的显示原理

1)学习过屏幕驱动的应该都知道,屏幕的显示无非就是在屏幕上打相应颜色的点,比如要显示一个字符‘A’那么我只需要知道‘A’相应的点阵数据就可以把它显示出来,汉字也一样。

2、汉字库的存储

2)但是汉字与字符不同的是,汉字有1万多个,字符却只有100多个,并且汉字的显示明显比字符的点阵复杂程度高,比如说字体是12的字符占用点阵是12x6,每个字符需要12x6/8=9个字节的存储空间。字体是12的汉字占用12x12的点阵,每个汉字需要12x12/8=18个字节存储空间,这还是最小字体,大的字体所需要的存储空间只会成倍增加

3)一般12号字体的汉字库需要500K字节、16号字体700K、24号字体1.6M、32号字体3M,这对于单片机来说数据量太大了,内部FLASH512K~1M表示压力很大

4)需要把汉字库通过SD卡再保存到外部FILASH才行,w25q128无疑是个好选择,它拥有16M的存储空间,SPI通信协议,读写速度也是相当快。

(三)txt文件数据显示到MCU屏

1、数据编码格式的问题

有关显示汉字就必然会涉及编码格式的问题,不同的编码格式对应的汉字编码是不同的,比如UTF-8编码的文件用GB2312编码打开就会乱码。

同理,比如文档的格式是UTF-8编码,但是我的字库是GBK编码,读出来的数据直接显示到屏幕就必然会乱码

四、下载调试

1、SD卡根目录文件拷贝

下载好本博客配套资料,把下面两个文件夹拷贝到SD卡根目录下

2、初始化外部FLASH-W25Q128用keil打开代码工程,编译通过后下载下载完成等待外部FLASH-W25Q128初始化完成,一开始会黑屏一段时间,是在擦除FLASH,然后会提示字库加载进度,直到LCD显示阅读界面为止

如果下载代码后运行不正常:

1)注释掉这些代码,编译下载

2)不要断电,取消注释这段代码,编译下载,下载完成后W25Q128初始化完成,应该就可以运行

3、动态logo

4、进入主界面

啥都没有,先导入图书

5、导入图书

找到0:/TXT目录下的.txt文件,选择导入

导入“斗罗大陆.txt”,主界面开始显示

如果没有匹配图片会显示默认图片

6、删除图书

点击左下角删除图书,再点击X即可移除图书操作,只是移除,并不是真正删除。

7、阅读界面

阅读界面都是根据页数匹配相应文字,因为读写速度问题加上需要算法识别加载,翻页加载过程都会有一段时间

8、目录功能

自动检测目录,通过检测“第”与“章”加上相应算法就可以检测显示目录,并记录偏移,可以跳转,上划可以显示下一页目录

9、设置字体、背景

可以设置显示背景,字体颜色,字体大小来适应自己喜欢的阅读方式

1)24号字体、白天

2)24号字体、护眼

3)12号字体、护眼

4)24号字体、夜间

五、程序设计

代码过长,只展示部分代码,完整代码可进群免费领取扫码进群领资料:

#include"sys.h"#include"delay.h"#include"usart.h"#include"led.h"#include"lcd.h"#include"key.h"#include"sram.h"#include"malloc.h"#include"usmart.h"#include"sdio_sdcard.h"#include"malloc.h"#include"w25qxx.h"#include"ff.h"#include"exfuns.h"#include"fontupd.h"#include"text.h"#include"piclib.h"#include"string.h"#include"math.h"#include"touch.h"u8menu_num;//当前主菜单页数u32page;//当前页数//charchapter_name[50];//当前章节名u32page_offset[1000];//保存页数偏移//u32page_off_mult;//页数偏移倍数u8txt_num;//当前书架图书数量u8txt_path_name[30][60];//导入图书路径u32bookmark[30];//保存对应书签也就是页数下次进入直接偏移页数chartxt_name[4][30]={"","","",""};//显示4本图书名字u8pname[60];//正在打开的文件名路径intSIZE=24;//初始化字体charbuff[2500];//一页数据缓冲文档intpage_mul_cnt=0;//存取次数一次1000页intnow_page_mul;//当前1000页的倍数u32data_offset;//读取偏移读写flash用//显示主界面voidmenu(void);//获取触摸键值u16get_ts_val(intkey);//读取文件数据到LCDintread_to_lcd(void);//更新小说名u8lcd_dis_files(u8*path);//阅读模式voidread_mode(void);//设置字体格式intsetting(void);//设置界面voidshow_setting(void);//目录功能u32txt_dir_scan(void);//文件系统功能导入小说voidfatfs_choose(void);//读取数据到flashvoidfile_data_to_w25q(void);//根据页码得到页数u32ident_get_page(u32page_offset);//遍历文件显示到屏幕u8mf_scan_file(u8*path);//刷新显示书架名字voidre_dis_txtname(inti);//带路径的文件名转不带路径文件名char*path_change(char*oldpath);//根据页数得到页码u32ident_get_offset(u32page);//更新内存1000页页码voidupdate_page_offset(void);//读出书签数据voidread_bookmark(void);//保存书签数据到flashvoidsave_bookmark(void);//保存书名数据到flashvoidsave_bookinfo(void);//删除小说voiddel_txt(u8*path);//删除小说控制界面voiddel_txt_ctrl(void);intmain(void){DIRpicdir;//图片目录u8key;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168);//初始化延时函数uart_init(115200);//初始化串口波特率为115200LED_Init();//初始化LEDLCD_Init();//LCD初始化KEY_Init();//按键初始化tp_dev.init();//触摸初始化W25QXX_Init();//初始化W25Q128usmart_dev.init(168);//初始化USMARTmy_mem_init(SRAMIN);//初始化内部内存池my_mem_init(SRAMCCM);//初始化CCM内存池exfuns_init();//为fatfs相关变量申请内存f_mount(fs[0],"0:",1);//挂载SD卡f_mount(fs[1],"1:",1);//挂载FLASH.while(font_init());//检查字库delay_ms(150);piclib_init();//初始化画图delay_ms(150);LCD_Clear(GBLUE);//清屏ai_load_picfile("0:/SYSTEM/PICTURE/logo.gif",0,0,lcddev.width,lcddev.height,1);//显示图read_bookmark();//读出图书书签数据memset(page_offset,0,1000*4);//清空页码数组menu_num=1;//显示第一页//lcd_dis_files("0:/TXT");//更新系统书名menu();//显示主界面while(1){key=get_ts_val(1);if(key!=0){printf("key=%d\n",key);switch(key)//选择要打开的图书{case1:if(txt_num-4*(menu_num-1)>=1){strcpy((char*)pname,(char*)txt_path_name[0+(menu_num-1)*4]);//把要打开的书籍名称赋值page=bookmark[0+(menu_num-1)*4];//根据flash保存的书签初始化进入的页数if(page>=0xffff)page=0;read_mode();//进入阅读模式bookmark[0+(menu_num-1)*4]=page;//退出保存书签save_bookmark();}break;case2:if(txt_num-4*(menu_num-1)>=2){strcpy((char*)pname,(char*)txt_path_name[1+(menu_num-1)*4]);page=bookmark[1+(menu_num-1)*4];if(page>=0xffff)page=0;read_mode();//进入阅读模式bookmark[1+(menu_num-1)*4]=page;save_bookmark();}break;case3:if(txt_num-4*(menu_num-1)>=3){strcpy((char*)pname,(char*)txt_path_name[2+(menu_num-1)*4]);page=bookmark[2+(menu_num-1)*4];if(page>=0xffff)page=0;read_mode();//进入阅读模式bookmark[2+(menu_num-1)*4]=page;save_bookmark();}break;case4:if(txt_num-4*(menu_num-1)>=4){strcpy((char*)pname,(char*)txt_path_name[3+(menu_num-1)*4]);page=bookmark[3+(menu_num-1)*4];if(page>=0xffff)page=0;read_mode();//进入阅读模式bookmark[3+(menu_num-1)*4]=page;save_bookmark();}break;case5://导入图书fatfs_choose();//文件系统选择文件导入save_bookinfo();//保存书籍数据到flashprintf("当前图书数量:%d\r",txt_num);break;case6:del_txt_ctrl();//删除图书break;case111:if((txt_num-1)/4+1>menu_num)menu_num++;printf("menu_num=%d\n",menu_num);//上一页break;case222:if(1

六、硬件框图

嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击下方链接,0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!

点击这里找小助理0元领取:扫码进群领资料