代码详细注释:嵌入式Linux LCD汉字显示程序(基于font.h字库头文件)
代码
#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]#lsDroidSansFallback.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位)
注释部分展示了另一种创建独立画布的方法