3、数码相框之电子书

本文档详细介绍了数码相框的显示器模块、字体点阵模块和文件编码模块的设计与实现,包括面向对象编程思想、点阵数据处理、编码方式提取等,并给出了在PC上显示的原理和步骤。通过模块化设计,便于功能扩展和代码维护。
摘要由CSDN通过智能技术生成

上一节:2、数码相框之显示文字

下一节:4、数码相框之编写通用的Makefile

本节源码在github仓库show_fileshow_file_pc中。

1、效果及框架

怎样在LCD上显示文字:

  • 去文件中获得“码”(ANSI、GBK、UTF-8、UTF-16LE、UTF_16BE
  • 根据“码”获得“字体数据”(点阵)
  • 把“点阵”在LCD上(FB显存)显示

怎样编写程序,以面向对象的思想进行编程,在写驱动程序时有三个主要的步骤:

  • 分配一个结构体
  • 设置这个结构体
  • 注册这个结构体

程序框架:
在这里插入图片描述
显示器模块:

fb.c : 实现在 /dev/fb 上面显示文字,点阵
crt.c : 如果用的板子不是真缓冲区,比如说台式机 crt.c
disp_manager.c : fb.c 向其注册 T_DispOpr 结构体。以后上面一层的应用程序根本看不到 fb.c
crt.c ,上面用的所有函数都是从 disp_manager.c 里面得到的。

字体点阵模块:

ascii.c gbk.c freetype.c 这三个模块负责别人给你一个编码,经过处理得到点阵。
ascii.c gbk.c freetype.c 这三个文件,每一个文件都会分配,设置一个 T_FontOpr 结构体,
并向 font_mangager.c 注册。以后上层的应用程序只会操作font_mangager.c 提供的函数,
不会直接调用 ascii.c gbk.c freetype.c 里的函数:

在这里插入图片描述
提取文件编码模块:

从文件里把文字编码给提取出来。以不同的编码方式保存的文件,提取编码的方式不一样。
ascii.c utf-8.c utf-16le.c utf-16be.c 都会分配,设置,一个 T_EncodingOpr 结构体, 
并向encoding_manager.c 注册。上层的应用程序都用 encoding_manager.c 提供的函数访问。

整合模块:
以上就是三大功能:显示器模块字体点阵模块提取文件编码模块
那么谁来用这三大功能呢?利用这三大功能,最终要在 LCD 上面显示。并且怎么去组织这些显示,比如说换行,翻页,上下页。由 draw.c 这个文件来用这三大功能:
在这里插入图片描述
体验用法:
1、在PC上编译
进入源码目录0 4 . s h o w _ f i l e _ 源 码_ 文档_图片_最终版执行make命令即可生成show_file应用程序,把show_fileMSYH.TTFhz.txtutf8.txtutf16be.txtutf16le.txt复制到开发板上。

2、在开发板上执行下列命令之一,即可在LCD上显示
用法如下:
在这里插入图片描述

./show_file -s 16 -h HZK16   -f ./MSYH.TTF hz.txt
./show_file -s 16 -h HZK16   -f ./MSYH.TTF utf8.txt
./show_file -s 16 -h HZK16   -f ./MSYH.TTF utf16be.txt
./show_file -s 16 -h HZK16   -f ./MSYH.TTF utf16le.txt

在这里插入图片描述
在这里插入图片描述
在开发板的串口里输入n并回车可以显示下一页文字,输入u并回车可以显示上一页文字,输入q并回车可以退出。

3、注意新宋字体simsun不支持16点阵大小的字体,这是它的缺陷。

2、代码阅读及编写

代码为04.show_file_源码_文档_图片_最终版04.show_file

2.1、显示器模块实现大致思路

在这里插入图片描述
顶层 Disp_manager.h 里定义一个 DispOpr 结构体类型:
在这里插入图片描述
底层的 fb.c 定义 DispOpr 结构体类型的变量:
在这里插入图片描述
fb.c 里面实现这些函数:
在这里插入图片描述
最后通过一个函数将 fb.c 里定义的 static T_DispOpr g_tFBOpr 结构体变量向上注册:
在这里插入图片描述
由上一层 disp_manager.c 来调用 fb.c 里的 FBInit 函数:
在这里插入图片描述

2.2、字体点阵模块大致思路

再回顾一下怎样在 LCD 上显示文件:
在这里插入图片描述
设计存放字体位图数据的结构体,要求能够支持 asciigbkfreetype 三种编码。
在这里插入图片描述
提取 asciigbkfreetype 三种编码方式的共性: 点阵:

ascii : 8 X 16 bit7 -----> bit0

一行一个字节,共 16 行,表示一个字符需要 16 字节
在这里插入图片描述

GBK : 16 X 16 bit7 -----> bit0 bit7 -----> bit0

一行两个字节,共 16 行,表示一个字符需要 32 字节。
在这里插入图片描述
freetype :
单色位图 MONO : 用 1bit 表示一个像素
anti-color :用 1byte 表示一个像素
在这里插入图片描述
下面先讲 freetype 单色图 MONO 是怎么根据编码值得到字体的点阵:
代码为04.show_file_源码_文档_图片_最终版\04.show_file\fonts 中的freetype.c

如果用 MONO 位图来表示:

字体点阵宽度 width 不一定是 8 的整数倍,假设字体点阵宽度 width = 17, 则第一行要用到三个字
节表示: bit7 -----> bit0 bit7 -----> bit0 bit7
下一行还是用三个字节表示: bit7 -----> bit0 bit7 -----> bit0 bit7
<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值