文章目录
本节源码在github仓库show_file和show_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_file
、MSYH.TTF
、hz.txt
、utf8.txt
、utf16be.txt
、utf16le.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
上显示文件:
设计存放字体位图数据的结构体,要求能够支持 ascii
、gbk
、freetype
三种编码。
提取 ascii
、gbk
、freetype
三种编码方式的共性: 点阵:
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
<