代码
#include <stdio.h> // 标准输入输出头文件
// 添加字库头文件
#include "font.h" // 自定义字体操作头文件
#include <stdio.h> // 标准输入输出头文件(重复包含)
#include <sys/types.h> // 系统数据类型定义
#include <sys/stat.h> // 文件状态信息
#include <fcntl.h> // 文件控制选项
#include <sys/mman.h> // 内存映射相关
#include <unistd.h> // UNIX标准函数
int fd; // 全局文件描述符
// 全局变量,所有函数都可以访问
int (*lcd)[800] = NULL; // 定义指向LCD显存的二维数组指针
// 映射LCD设备
int init_lcd()
{
// 1.打开LCD设备文件
fd = open("/dev/fb0", O_RDWR); // 以读写方式打开帧缓冲设备
if (fd == -1) // 检查是否打开成功
{
perror("打开LCD设备失败\n"); // 打印错误信息
return -1; // 返回错误码
}
else
{
printf("打开LCD设备成功\n"); // 成功提示
}
// 2.映射LCD设备到内存空间
lcd = mmap(NULL, 800 * 480 * 4, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (lcd == MAP_FAILED) // 检查映射是否成功
{
perror("映射LCD设备失败\n"); // 打印错误信息
return -1; // 返回错误码
}
else
{
printf("映射LCD设备成功\n"); // 成功提示
}
return 0; // 初始化成功
}
//释放LCD资源
void free_lcd()
{
// 3.解除内存映射
munmap(lcd, 800 * 480 * 4); // 释放映射的内存区域
close(fd); // 关闭设备文件
}
int main()
{
// 初始化LCD设备
init_lcd(); // 调用初始化函数
// 1.加载开发板的字库文件
/*
[root@GEC6818 /usr/share/fonts]#pwd
/usr/share/fonts
[root@GEC6818 /usr/share/fonts]#ls
DroidSansFallback.ttf msyh.ttf
请自己进入开发板的/usr/share/fonts 查看字库文件
*/
font *f = fontLoad("/usr/share/fonts/DroidSansFallback.ttf"); // 加载字体文件
// 2.设置字体的大小
fontSetSize(f, 64); // 设置字体大小为64像素
/*
// 3.创建一块画布(注释掉的旧方法)
bitmap *bm = createBitmap(250, 80, 4);
// 4.把中文汉字显示到画布上
fontPrint(f, bm, 0, 0, "今天很热!", 0, 0);
// 5.画布显示到LCD设备中
show_font_to_lcd((unsigned int *)lcd, 350, 215, bm);
*/
// 自定义一块画布(新方法)
bitmap bm; // 定义位图结构体
bm.height = 480; // 设置画布高度为480像素
bm.width = 800; // 设置画布宽度为800像素
bm.byteperpixel = 4; // 每个像素4字节(32位色)
bm.map = (u8 *)lcd; // 将画布映射到LCD显存
// 4.在画布上显示字体
fontPrint(f, &bm, 0, 0, "今天很开心!", getColor(0, 0, 0, 255), 0);
// 参数说明: 字体对象,画布指针,x坐标,y坐标,显示文本,颜色(黑色),背景色(透明)
free_lcd(); // 释放LCD资源
return 0; // 程序正常退出
}
代码功能说明:
LCD初始化:
打开帧缓冲设备(
/dev/fb0
)将设备内存映射到用户空间
提供资源释放函数
字体显示:
加载TrueType字体文件
设置字体大小
直接在LCD显存上绘制文字
关键技术:
使用
mmap
映射显存自定义位图结构直接操作显存
支持中文TrueType字体渲染
硬件平台说明:
针对GEC6818开发板设计
使用800x480分辨率的LCD屏
字体文件路径为
/usr/share/fonts/
注意事项:
需要配套的
font.h
头文件实现字体操作直接操作显存需要root权限
颜色格式为ARGB(32位)
注释部分展示了另一种创建独立画布的方法