南京大学数字系统II实验参考
- 实验二,帧缓冲设备实验,请checkout到1.0版本
- 实验四,触摸屏移植基于帧缓冲设备实验代码开发,参考最新版本即可
本工程在 Linux (帧缓冲 /dev/fb0 触摸屏 /dev/input/event1) 环境下实现:
- 基础图形绘制:像素、直线、矩形、填充矩形、圆、填充圆、三角形等。
- BMP 图片加载与显示。
- ASCII 8x8 字体与少量自定义汉字/或外部 HZK16 字库存取显示。
- 小球弹跳与简单动画演示。
- 触摸交互(基于 tslib):实现“触摸画板”功能,可在屏幕上绘制轨迹并根据退出条件离开。
目标平台:LoongArch 交叉编译环境,使用 loongarch64-linux-gnu-gcc。
显示默认适配分辨率:1024x768(可根据实际帧缓冲自动获取分辨率)。
draw_code/
├── main.c // 程序入口
├── draw.c/.h // 帧缓冲初始化与基础绘图函数
├── bmp.c/.h // BMP 图像加载与显示
├── char.c/.h // ASCII 字符与自定义汉字 / HZK16 字库显示
├── ball.c/.h // 小球弹跳动画
├── touch.c/.h // 触摸屏初始化与画板功能(printboard)
├── tslib.h // tslib 接口头文件
├── lib/ // 交叉链接使用的共享库(含 libts.so 等)
├── HZK16 // 16x16 汉字点阵(如需汉字显示)
├── image.bmp // 示例 BMP 图片(若需要测试图片显示)
├── Makefile // 编译规则
├── compilation_notes.md // 编译与链接实验心得
└── README.md // 本说明文件
- 帧缓冲设备:
/dev/fb0可访问(必要时使用sudo)。 - 触摸屏输入及 tslib 已正确部署(libts.so 位于
lib/或指定的-L路径)。 - 若需汉字显示:放置
HZK16字库文件到可执行文件同目录。 - 若需 BMP 测试:准备
image.bmp(24位或32位真彩 BMP)。
在工程目录执行:
make生成的可执行程序为:graphics_app
清理:
make clean交叉编译若找不到 libts.so,需要在 Makefile 中确保:
LDFLAGS = -L./lib -lts -lm或根据实际库路径调整 -L 选项。
运行前请确认下列文件与可执行程序同目录(根据实际需求):
| 文件 | 用途 |
|---|---|
| image.bmp | BMP 图片显示测试 |
| HZK16 | 汉字点阵字库(使用 HZK16 模式时) |
| libts.so* | 触摸库(通过 -L./lib -lts 链接) |
运行程序:
./graphics_app必要时使用:
sudo ./graphics_app- 初始化帧缓冲并打印分辨率与色深信息。
- 基础像素级绘图(
draw_pixel)。 - 线段绘制(Bresenham 算法)、矩形 / 填充矩形、圆 / 填充圆、三角形。
- 屏幕清除与全屏填充(背景色)。
- 显示 BMP 图片:
bmp_load+bmp_draw。 - 字符显示:
draw_char/draw_string,支持数字、大小写字母、部分符号。 - 汉字显示:两种方式
- 自定义小集合汉字点阵(
hanzi_fonts) - 外部 HZK16 字库通过偏移读取(
load_hzk16_font+draw_hzk16_char)
- 自定义小集合汉字点阵(
- 小球弹跳动画:
ball_init/ball_update/fill_circle。 - 触摸画板功能:
printboard,实时采集触摸点绘制轨迹。
函数声明(见 touch.h):
void printboard(uint32_t fg_color, uint32_t bg_color, int timeout_ms);行为说明:
- 进入后清屏为
bg_color。 - 有触摸时:在触点绘制半径 3 的小圆,并用直线连接上一个触点形成笔迹。
- 退出条件:
- 触摸落点在左上角矩形区域 (0
40,040) - 长时间无触摸且达到
timeout_ms(若timeout_ms<=0则不因超时退出)
- 触摸落点在左上角矩形区域 (0
- 建议在进入画板前已调用:
graphics_init(); touch_init();
示例片段(可放入 main.c 测试):
if (graphics_init() != 0) return -1;
if (touch_init() != 0) { graphics_cleanup(); return -1; }
// 启动触摸画板:白色前景,黑色背景,无触摸 30 秒自动退出
printboard(0x00FFFFFF, 0x00000000, 30000);
touch_close();
graphics_cleanup();- 使用自定义点阵:确保所需汉字已在
hanzi_fonts中定义。 - 使用 HZK16:加载函数原型示例:
int load_hzk16_font(const char *path); // 读取整块到内存
void free_hzk16_font(void); // 释放映射- 绘制:
draw_hzk16_char(x, y, (const unsigned char*)"汉字", 0x00FF00FF);请注意:GB2312 两字节编码时,每个汉字偏移 = (区码-1)*94 + (位码-1))*32。
| 现象 | 原因 | 解决 |
|---|---|---|
undefined reference to ts_setup |
链接缺失 -lts |
在 LDFLAGS 补全 -L路径 -lts |
cannot find -lts |
未提供库搜索路径 | 使用 -L./lib 或绝对路径 |
| 触摸无反应 | 权限或设备路径错误 | 确认 /dev/input/event* 权限,尝试 sudo |
| 汉字不显示 | 未加载字库或编码不匹配 | 确认 HZK16 文件、编码是否 GB2312 |
| BMP 显示错位 | 位深或行填充处理错误 | 确认 24/32 位与行对齐 (row_padded) 计算 |
| 汉字无法显示 | 代码编码方式需要使用GB2312 | 修改代码编码方式 |
本工程示例代码仅用于南京大学数字系统II实验学习参考。
NJUEE231180007
欢迎补充改进与反馈!