# 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 函数内) 原移位拼接循环 → 新布局移位逻辑: ```c // 数字本体(区域内列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` 声明(原移位逻辑专用)。 ## 验证方法 ```bash # 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 显示