2.8 KiB
2.8 KiB
LED 3 位数点阵显示工程(32×16)
32×16 LED 点阵显示 3 位数字的布局调整工程。
需求背景
原布局:2空 | 7亮 | 4空 | 7亮 | 4空 | 7亮 | 1空 = 32 列
(最左 2 列不亮、数字间 4 列不亮、最右 1 列不亮)
新布局:1空 | [2空 + 7亮 + 1空] ×3 | 1空 = 32 列
- LED 最左 / 最右各留 1 列边界不亮
- 每个数字单元固定 10 列宽:左侧 2 列不亮 + 数字 7 列 + 右侧 1 列不亮
- 数字本体位置:列 3-9 / 13-19 / 23-29
文件说明
| 文件 | 说明 |
|---|---|
led3number.c |
修改后的完整代码(可直接替换工程原文件) |
led3number_original.c |
修改前的原始上传版本(对照用) |
led3number_sim.py |
Python 模拟器:复现填充+移位逻辑,可渲染 32×16 点阵图 |
led3number_test.c |
独立 C 验证程序(gcc 编译,与模拟器输出逐列对照) |
gen_led3number.py |
生成脚本:从原始文件生成修改后的 led3number.c |
gen_c_test.py |
生成脚本:从原始文件生成 led3number_test.c |
核心改动(read_code 函数内)
原移位拼接循环 → 新布局移位逻辑:
// 数字本体(区域内列2-8, 7列) → 全局列 3-9 / 13-19 / 23-29
for(i=0;i<16;i++)
{
uint8_t s2 = code12_ram[2][i]; // 数字1 高字节
uint8_t s3 = code12_ram[3][i]; // 数字1 低字节
uint8_t s4 = code12_ram[4][i]; // 数字2 高字节
uint8_t s5 = code12_ram[5][i]; // 数字2 低字节
uint8_t s6 = code12_ram[6][i]; // 数字3 高字节
uint8_t s7 = code12_ram[7][i]; // 数字3 低字节
code12_ram[2][i] = (s2 >> 1) & 0x1F; // 数字1 → 列3-7
code12_ram[3][i] = ((s2 & 0x01) << 7) | ((s3 >> 1) & 0x40) // 数字1 → 列8-9
| ((s4 >> 3) & 0x07); // 数字2 → 列13-15
code12_ram[4][i] = ((s4 & 0x07) << 5) | ((s5 & 0x80) >> 3) // 数字2 → 列16-19
| ((s6 >> 5) & 0x01); // 数字3 → 列23
code12_ram[5][i] = ((s6 & 0x1F) << 3) | ((s7 & 0x80) >> 5); // 数字3 → 列24-29
}
另:移除已废弃的 move_reg1/move_reg2 声明(原移位逻辑专用)。
验证方法
# 1. Python 模拟(可看 32×16 点阵图)
python3 led3number_sim.py
# 2. C 独立验证(gcc 编译,输出与模拟器逐列对照)
gcc -Wall -Wextra -O2 -o led3number_test led3number_test.c && ./led3number_test
已验证数字组合:123 / 456 / 888 / 000 / 999 / 111,布局全部正确。
注意事项
- 协议行为未改动:显示数据流后 3 个字符(第 1 个字符被丢弃,原逻辑如此)
- 空格字符处理未改动
- 字库结构:每字符 16 位宽,数字本体 7 列位于区域内列 2-8,MSB 显示