当前位置: 首页 > news >正文

代码详细注释:嵌入式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;  // 程序正常退出
}

代码功能说明:

  1. LCD初始化

    • 打开帧缓冲设备(/dev/fb0)

    • 将设备内存映射到用户空间

    • 提供资源释放函数

  2. 字体显示

    • 加载TrueType字体文件

    • 设置字体大小

    • 直接在LCD显存上绘制文字

  3. 关键技术

    • 使用mmap映射显存

    • 自定义位图结构直接操作显存

    • 支持中文TrueType字体渲染

硬件平台说明:

  • 针对GEC6818开发板设计

  • 使用800x480分辨率的LCD屏

  • 字体文件路径为/usr/share/fonts/

注意事项:

  1. 需要配套的font.h头文件实现字体操作

  2. 直接操作显存需要root权限

  3. 颜色格式为ARGB(32位)

  4. 注释部分展示了另一种创建独立画布的方法

http://www.lryc.cn/news/582740.html

相关文章:

  • 移动机器人的认知进化:Deepoc大模型重构寻迹本质
  • 数据库表设计:图片存储与自定义数据类型的实战指南
  • FlashAttention 深入浅出
  • C++STL详解(一):string类
  • Spring Boot:影响事务回滚的几种情况
  • Java List 使用详解:从入门到精通
  • 联通线路物理服务器选择的关键要点
  • 短视频矩阵系统的崛起:批量发布功能与多平台矩阵的未来
  • Redis基础学习(五大值数据类型的常用操作命令)
  • 中韩SD-WAN网络加速专线:提升国内与韩国公司网络性能的关键
  • ThreadPoolTaskExecutor 的使用案例
  • 东南亚主播解决方案|东南亚 TikTok 直播专线:纯净住宅 IP 、直播不卡顿
  • 分布式理论:CAP、Base理论
  • iOS打包流程
  • C++11 算法详解:std::copy_if 与 std::copy_n
  • 库制作与原理
  • Web前端开发: :where(伪类函数选择器)
  • Python之--列表
  • 实时音视频通过UDP打洞实现P2P优先通信
  • Python爬虫实战:研究python-nameparser库相关技术
  • nvm npm nrm 使用教程
  • Crazyflie支持MATLAB/Simulink控制 基于NOKOV度量动捕系统实现
  • 安装 asciidoctor-vscode 最新版
  • 【Python篇】PyCharm 安装与基础配置指南
  • Spring AI 基本组件详解 —— ChatClient、Prompt、Memory
  • Fiddler-关于抓取Android手机包,安装证书后页面加载失败,提示当前证书不可信存在安全风险的问题
  • Rust 中字符串类型区别解析
  • Rust 仿射类型(Affine Types)
  • AR/VR 显示画质失真?OAS百叶窗波导案例破难题
  • Linux网络:UDP socket创建流程与简单通信