You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成保持MSB的右移二进制图案以驱动MAX7219 8x8矩阵?

解决MAX7219 8x8矩阵的特定二进制图案生成问题

你需要生成的图案是逐次点亮LED:先单独点亮第一行的每个LED(从右到左),然后保持第一行最左LED点亮的同时,依次点亮第一行的其他LED;第一行全亮后,以同样逻辑处理第二行(同时保持第一行全亮),直到所有LED全亮。当前已实现单位移位,但不知道如何保持高位点亮并叠加新的低位。


核心思路

这个图案本质是按二进制计数顺序点亮LED:每个计数对应一组点亮的LED,所有二进制位为1的位置对应的LED都会保持点亮,每次计数递增时新增一个LED。具体来说:

  • 每个LED对应一个唯一的二进制位(0~63)
  • 计数从0到63,每次计数时,把所有位为1的LED点亮

代码实现

首先实现显示屏刷新函数,用于同步所有行的状态:

void MAX7219_RefreshDisplay(uint8_t *row_data) {
    // 遍历8行,MAX7219的行地址为1~8
    for (uint8_t i = 0; i < 8; i++) {
        MAX7219_SendData(i + 1, row_data[i]);
    }
}

然后实现图案生成逻辑:

void GenerateTargetPattern() {
    uint8_t row_data[8];  // 存储8行的点亮状态,初始为0
    
    // 遍历所有计数(0到63,对应64个LED依次新增点亮)
    for (uint32_t count = 0; count < 64; count++) {
        memset(row_data, 0, sizeof(row_data));  // 重置当前行状态
        
        // 检查每个LED是否需要点亮
        for (uint8_t led_idx = 0; led_idx < 64; led_idx++) {
            if (count & (1UL << led_idx)) {
                uint8_t row = led_idx / 8;          // 计算LED所在行(0~7)
                uint8_t bit_pos = led_idx % 8;      // 计算LED在行内的位置(0~7)
                row_data[row] |= (1 << bit_pos);    // 点亮对应LED
            }
        }
        
        MAX7219_RefreshDisplay(row_data);  // 更新显示屏
        HAL_Delay(200);  // 控制切换速度,可根据需求调整
    }
}

代码说明

  1. LED索引映射:led_idx从0到63,对应8x8矩阵的每个LED。led_idx / 8得到所在行(0对应MAX7219的行1,7对应行8),led_idx % 8得到行内的位位置(0对应最右侧LED,7对应最左侧LED)。
  2. 二进制计数逻辑:count & (1UL << led_idx)判断当前计数的对应位是否为1,若是则点亮该LED。
  3. 刷新机制:每次计数更新后,重新计算所有行的状态并发送给MAX7219,确保所有已点亮的LED保持点亮。

替代简化实现(针对逐行阶段化点亮)

如果不需要完整的二进制计数顺序,只需要按你示例中的“先单行单位移位,再单行叠加高位,再下一行”的逻辑,可使用以下代码:

void GenerateStagePattern() {
    uint8_t row_data[8] = {0};
    
    for (uint8_t current_row = 0; current_row < 8; current_row++) {
        // 阶段1:单行从右到左单位移位点亮
        for (uint8_t bit_pos = 0; bit_pos < 8; bit_pos++) {
            row_data[current_row] = 1 << bit_pos;
            MAX7219_RefreshDisplay(row_data);
            HAL_Delay(200);
        }
        
        // 阶段2:保持当前行最左LED点亮,依次叠加其他位
        row_data[current_row] = 0x80;  // 先点亮最左位(MSB)
        for (uint8_t bit_pos = 0; bit_pos < 7; bit_pos++) {
            row_data[current_row] |= 1 << bit_pos;
            MAX7219_RefreshDisplay(row_data);
            HAL_Delay(200);
        }
        
        // 当前行保持全亮,进入下一行
        row_data[current_row] = 0xFF;
    }
}

内容的提问来源于stack exchange,提问作者Theja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 06:12:33