uint8_t val[BLOCKS];
uint8_t character_len = sizeof(table1) / 8;
// pos:点阵右沿对应的val数组元素编号. 因为要无缝滚屏, 用右沿做求余不会产生跳变
// lpos: 点阵左沿对应的val数组元素编号, 每次根据点阵右沿和点阵宽度计算得到
uint16_t pos = 0, lpos = 0;
// cpos: 点阵左沿对应的文字编号
// bpos: 在这个文字中, 当前移动到第几个bit, 值从0-7
uint8_t i, j, cpos = 0, bpos = 0, tcpos = 0;
lpos = pos + sizeof(table1) - BLOCKS * 8;
cpos = lpos / 8; // 第几个字
bpos = lpos % 8; // 字的第几个bit
for (i = 0; i < 8; i++) // 对每一行, 对val的每个元素赋值
{
// 从第cpos个字的bpos位开始, 填满每个点阵对应的byte
for (j = 0; j < BLOCKS; j++)
{
// 高位部分
tcpos = (cpos + j) % character_len;
val[j] = table1[tcpos * 8 + i] << bpos;
// 低位部分
tcpos = (cpos + j + 1) % character_len;
val[j] |= table1[tcpos * 8 + i] >> (8 - bpos);
}
// 地址1-8 共几块 写入数据
Max7219_multiWrite(i+1, BLOCKS, val);
}
// 每处理完一屏, pos右移一位
pos = (pos + 1) % sizeof(table1);
HAL_Delay(70);
这段程序看了好久没看懂,各位有没有理解的麻烦给讲一下每段的意思
|