🚗 LED 3位数点阵显示工程:数字布局调整为 [2空+7亮+1空]x3 + 左右各1列边界(附模拟器/C验证)

This commit is contained in:
2026-08-19 18:59:38 +08:00
parent 576b83cf73
commit e6fb2a1cdd
8 changed files with 959 additions and 0 deletions
+85
View File
@@ -0,0 +1,85 @@
#include <stdio.h>
#include <stdint.h>
#include <string.h>
static const unsigned char Code_Number_16_12[17][32] = {
/* 0 */ { 0x00, 0x00, 0x3F, 0x02, 0x3F, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x3F, 0x02, 0x3F, 0x02, 0x00, 0x00 },
/* 1 */ { 0x00, 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00 },
/* 2 */ { 0x00, 0x00, 0x3F, 0x02, 0x3F, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x3F, 0x02, 0x3F, 0x02, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3F, 0x02, 0x3F, 0x02, 0x00, 0x00 },
/* 3 */ { 0x00, 0x00, 0x3F, 0x02, 0x3F, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x3F, 0x02, 0x3F, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x3F, 0x02, 0x3F, 0x02, 0x00, 0x00 },
/* 4 */ { 0x00, 0x00, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x3F, 0x02, 0x3F, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00 },
/* 5 */ { 0x00, 0x00, 0x3F, 0x02, 0x3F, 0x02, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3F, 0x02, 0x3F, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x3F, 0x02, 0x3F, 0x02, 0x00, 0x00 },
/* 6 */ { 0x00, 0x00, 0x3F, 0x02, 0x3F, 0x02, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3F, 0x02, 0x3F, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x3F, 0x02, 0x3F, 0x02, 0x00, 0x00 },
/* 7 */ { 0x00, 0x00, 0x3F, 0x02, 0x3F, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00 },
/* 8 */ { 0x00, 0x00, 0x3F, 0x02, 0x3F, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x3F, 0x02, 0x3F, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x3F, 0x02, 0x3F, 0x02, 0x00, 0x00 },
/* 9 */ { 0x00, 0x00, 0x3F, 0x02, 0x3F, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x31, 0x02, 0x3F, 0x02, 0x3F, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x3F, 0x02, 0x3F, 0x02, 0x00, 0x00 },
/* 10 */ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
/* 11 */ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
/* 12 */ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
/* 13 */ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
/* 14 */ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
/* 15 */ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
/* 16 */ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
};
/* 模拟: 填充 + 新移位 (照抄 led3number_new.c 逻辑) */
static void process(const uint8_t chars[4], uint8_t out[4][16])
{
uint8_t code12[8][16];
int roll, i;
memset(code12, 0, sizeof(code12));
for (roll = 0; roll < 4; roll++) {
uint8_t cc = chars[roll];
for (i = 0; i < 16; i++) {
if (cc == 0x20) {
code12[roll*2][i] = Code_Number_16_12[10][i*2];
code12[roll*2+1][i] = Code_Number_16_12[10][i*2+1];
} else {
code12[roll*2][i] = Code_Number_16_12[cc-0x30][i*2];
code12[roll*2+1][i] = (uint8_t)(Code_Number_16_12[cc-0x30][i*2+1] << 6);
}
}
}
for (i = 0; i < 16; i++) {
uint8_t s2 = code12[2][i];
uint8_t s3 = code12[3][i];
uint8_t s4 = code12[4][i];
uint8_t s5 = code12[5][i];
uint8_t s6 = code12[6][i];
uint8_t s7 = code12[7][i];
code12[2][i] = (uint8_t)((s2 >> 1) & 0x1F);
code12[3][i] = (uint8_t)(((s2 & 0x01) << 7) | ((s3 >> 1) & 0x40) | ((s4 >> 3) & 0x07));
code12[4][i] = (uint8_t)(((s4 & 0x07) << 5) | ((s5 & 0x80) >> 3) | ((s6 >> 5) & 0x01));
code12[5][i] = (uint8_t)(((s6 & 0x1F) << 3) | ((s7 & 0x80) >> 5));
}
memcpy(out, &code12[2][0], 64);
}
static void render(const char *name, const uint8_t out[4][16])
{
int r, c;
printf("=== %s ===\n", name);
printf("col: ");
for (c = 0; c < 32; c++) printf("%d", c % 10);
printf("\n");
for (r = 0; r < 16; r++) {
printf("%2d ", r);
for (c = 0; c < 32; c++) {
uint8_t byte = out[c/8][r];
int bit = (byte >> (7 - (c % 8))) & 1;
putchar(bit ? '#' : '.');
}
printf("\n");
}
}
int main(void)
{
uint8_t out[4][16];
/* 字符: 第1个被丢弃(协议), 后3个显示; 0x20=空格 */
process((uint8_t[]){'1','2','3','0'}, out); render("NEW 123+0", out);
process((uint8_t[]){' ','4','5','6'}, out); render("NEW 456+7", out);
process((uint8_t[]){'8','8','8','8'}, out); render("NEW 888+8", out);
return 0;
}