---
video: //player.bilibili.com/player.html?isOutside=true&aid=112661857634338&bvid=BV1chgieRExi&cid=500001592209944&p=1&high_quality=1&autoplay=0
---
# Max7219点阵屏

我们已经了解了传统的 8x8点阵屏 是如何工作的。这节教程来了解 Max7219 芯片的点阵。  

![](https://cdn.zhiyanbang.com/md15/WeChat7390533dc15a1d75d15dfab58145caff.jpg)

MAX7219是一款集成化的串行输入/输出共阴极显示驱动器，广泛应用于控制LED点阵屏。它能够连接微处理器与8位数字的7段数字LED显示，也可以用来驱动64个独立的LED，形成8x8的点阵屏。MAX7219芯片通过简化的接口和编程方式，使得点阵屏的控制变得容易，因此它在各种电子项目和DIY活动中非常受欢迎。

##  原理讲解

### 基本特性：  


- 控制方式：MAX7219支持串行数据输入，可以通过SPI或类似接口进行控制。
- 显示能力：能够驱动64个LED，形成8x8的点阵，适合显示字符和图形。
- 寄存器设置：内部有多个寄存器，包括亮度控制、扫描限制、解码模式等，允许用户自定义显示效果。
- 扩展性：可以通过DOUT引脚实现多个MAX7219芯片的级联，扩展显示区域。

### 引脚讲解

- DIN：串行数据输入端口，数据在时钟上升沿被载入内部的16位寄存器。
- CS：片选端，低电平时串行数据被载入移位寄存器。
- CLK：时钟输入端，数据在CLK的上升沿移入内部移位寄存器。
- VCC：正极电压输入，通常为+5V。
- GND: 接地

### SPI 讲解

![](https://cdn.zhiyanbang.com/md15/WeChat0ba63a61e88bd8c4f3618887a8dc16f6.jpg)

SPI（Serial Peripheral Interface，串行外设接口）是一种常见的串行通信协议，用于微控制器和各种外围设备之间的通信。SPI通信协议定义了一种高速、全双工、同步的数据传输方式，通常用于连接微控制器和传感器、显示器、存储器等外设。

![](https://cdn.zhiyanbang.com/md15/WeChat824abafb8868d349b47a9ee555ed13fe.jpg)

![](https://cdn.zhiyanbang.com/md15/WeChatc169fc1cdcc175b363bf87a4cb39f90e.jpg)


- SPI的优点：
    - 简单：SPI协议简单，易于实现。
    - 高速：SPI支持高速数据传输。
    - 全双工：可以同时发送和接收数据。
    - 灵活性：支持多种通信模式。


### esp32 的SPI 引脚

![](https://cdn.zhiyanbang.com/md15/%2FWeChat8b8e8225fd09333b005e2eb621f92f91.jpg)


## 硬件

| 器件 | 数量 |
|--------|--------|
| ESP32 | 1 |
| max7219 8x8点阵屏 | 1 |



![](https://cdn.zhiyanbang.com/md15/WeChatcbbe2a1af781b70c9fc633fd1dc96d56.jpg)



## 软件


### 如何添加库文件

- <a href="https://www.zhiyanbang.com/website/md/37?content_id=8FTWlHStRzhu45Uw" target="_blank">点击这里</a>

### 库文件



```javascript
function max7219(spi, cs, screens) {
    screens = screens || 1;
    spi.write({
        data: [0xf, 0x0],
        count: screens
    }, cs); // display test off (can get stuck on)
    spi.write({
        data: [0xa, 0xf],
        count: screens
    }, cs); // intensity  -full
    spi.write({
        data: [0xb, 0x7],
        count: screens
    }, cs); // scan limit - all 8 chars
    spi.write({
        data: [0xc, 0],
        count: screens
    }, cs); // shutdown
    return {
        /// Display the given characters - only 0123456789-EHLP are possible, but '.' is also decoded
        set: function(val) {
            spi.write([0x9, 0xff], cs); // decode all as numbers
            var map = "0123456789-EHLP ";
            var a = new Array(8);
            a.fill(15); // all off
            val = val.toString();
            var hadDot = false;
            var j = 7;
            for (var i = val.length - 1; i >= 0; i--) {
                if (val[i] != ".") {
                    if (j >= 0)
                        a[j--] = map.indexOf(val[i]) | (hadDot ? 128 : 0);
                    hadDot = false;
                } else hadDot = true;
            }
            for (i = 0; i < 8; i++)
                spi.write([8 - i, a[i]], cs);
            spi.write([0x0c, 1], cs); // no shutdown
        },
        // Send the given raw LED data to the display
        raw: function(val) {
            spi.write({
                data: [0x9, 0],
                count: screens
            }, cs); // output raw data
            for (var row = 0; row < 8; row++) {
                digitalWrite(cs, 0);
                for (var i = screens - 1; i >= 0; i--) {
                    spi.write([8 - row, val[i + row * screens]]);
                }
                digitalWrite(cs, 1);
            }
            spi.write({
                data: [0x0C, 1],
                count: screens
            }, cs); // no shutdown
        },
        // Turn display off
        off: function() {
            spi.write({
                data: [0xc, 0],
                count: screens
            }, cs);
        },
        // Turn display on
        on: function() {
            spi.write({
                data: [0xc, 1],
                count: screens
            }, cs);
        },
        // Set intensity (0 to 1)
        intensity: function(i) {
            spi.write({
                data: [0xA, E.clip(i * 15, 0, 15)],
                count: screens
            }, cs);
        },
        // Test the display
        displayTest: function(mode) {
            spi.write({
                data: [0xf, mode === true],
                count: screens
            }, cs);
        },
        // Set the scan limit
        scanLimit: function(limit) {
            spi.write({
                data: [0xb, limit - 1],
                count: screens
            }, cs);
        }
    };
}


if (typeof exports !== "undefined") {
    exports.connect = max7219;
}


```
- 如何使用

```javascript
SPI2.setup({ sck: D18, mosi: D23 });
var disp = require("MAX7219").connect(SPI2, D5);


var g = Graphics.createArrayBuffer(8,8,1); // Create graphics
g.flip = function() { disp.raw(g.buffer); }; // To send to the display
g.setRotation(2, 0);
g.drawString("Hi");
g.flip(); // update what's on the display
```



