通过MAX7219模块驱动矩阵屏
本文必看
1、此文功能实现完成后可以挑战下使用LED矩阵玩贪吃蛇小游戏
2、由于精力有限,Python版本暂不提供了,对应逻辑可以参考如下代码即可。
3、首先需要启用树莓派的SPI接口
所需材料
- 树莓派
- MAX7219模块
- 8 * 8 Led矩阵
模块以及针脚介绍
MAX7219
MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。该芯片具有10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED的段电流。
各引脚的功能为:
- DIN:串行数据输入端
- DOUT:串行数据输出端,用于级连扩展
- LOAD:内部寄存器锁存时钟
- CLK:串行移位寄存器时钟
- DIG0~DIG7:8位LED位选线,从共阴极LED中吸入电流
- SEG A-G,DP:数码管段数据输出
- ISET: 通过一个10k电阻和Vcc相连,设置段电流
寄存器地址:
例如我们想关机,则写入指令0x0C 0x00
第一个字节是地址,第二个字节是值,同理开机则这么表示0x0C 0x01
。 而例如0x0A
对应的地址是控制亮度的。
电路连接图
树莓派、MAX7219模块连接图
字符点阵
我们想在矩阵屏输出一个A
怎么表示呢?
{0x00, 0x7C, 0x7E, 0x13, 0x13, 0x7E, 0x7C, 0x00}, // ' A '
为什么是这样的数据表示呢?因为16进制的0x7C
进制转为8位数的二进制为01111100
,我们把这8个16进制全部转换后得到如下阵列:
0 0 0 0 0 0 0 0
0 1 1 1 1 1 0 0
0 1 1 1 1 1 1 0
0 0 0 1 0 0 1 1
0 0 0 1 0 0 1 1
0 1 1 1 1 1 1 0
0 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0
试想一下,我们平常的显示器编码是有多么复杂才能显示那么多五颜六色的图案!
测试程序
首先通过二维数组排列我们想要的图形,坐标为1的点亮,为0的熄灭。
{0, 0, 1, 1, 1, 1, 0, 0},
{0, 1, 0, 0, 0, 0, 1, 0},
{1, 0, 1, 0, 0, 1, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 1, 0, 0, 1, 0, 1},
{1, 0, 0, 1, 1, 0, 0, 1},
{0, 1, 0, 0, 0, 0, 1, 0},
{0, 0, 1, 1, 1, 1, 0, 0}
转为16进制字符点阵得到如下数组
{0x3c, 0x42, 0xa5, 0x81, 0xa5, 0x99, 0x42, 0x3c}
程序启动类如下,点击启动后即可看到屏幕上出现一个笑脸😊图案,当然你也可以通过这个二维数组,输出想要的图案或者文字。
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.spi.SpiChannel;
import com.pi4j.io.spi.SpiDevice;
import com.pi4j.io.spi.SpiFactory;
import org.example.Application;
import org.example.components.MAX7219;
/**
* 〈SmilingFaceApp〉
*
* @author 丁乾文
* @date 2022/5/29 01:22
* @since 1.0.0
*/
public class SmilingFaceApp extends Application {
public static int[][] xl1 = {
{0, 0, 1, 1, 1, 1, 0, 0},
{0, 1, 0, 0, 0, 0, 1, 0},
{1, 0, 1, 0, 0, 1, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 1, 0, 0, 1, 0, 1},
{1, 0, 0, 1, 1, 0, 0, 1},
{0, 1, 0, 0, 0, 0, 1, 0},
{0, 0, 1, 1, 1, 1, 0, 0}
};
public static char[] xl2 = {0x3c, 0x42, 0xa5, 0x81, 0xa5, 0x99, 0x42, 0x3c};
public SmilingFaceApp(GpioController gpio) {
super(gpio);
}
@Override
public void execute() throws Exception {
// 初始化屏幕
SpiDevice spiDevice = SpiFactory.getInstance(SpiChannel.CS0, SpiDevice.DEFAULT_SPI_SPEED, SpiDevice.DEFAULT_SPI_MODE);
MAX7219 max7219 = new MAX7219(spiDevice);
// 设置亮度
max7219.setBrightness(11);
// 先清除屏幕
max7219.clear().refresh();
// 开机
max7219.setEnabled(true);
// 2进制方式
// max7219.push(xl1);
// 16进制方式
max7219.push(xl2);
Thread.sleep(10000);
max7219.setEnabled(false);
}
}
完整代码见:pi4j-demo