本帖最后由 bluebanboom 于 2017-10-14 19:35 编辑
网上大多数资料里都是直接GPIO模拟SPI来驱动Max7219点阵的,这样代码比较容易移植,因为在各个不同平台上GPIO的使用相对来说最为简单。但是这次我偏不走模拟,直接用原生SPI来驱动。之所以有这样的底气,是这两天在AndroidThings上彻底掌握了Max7219点阵的驱动原理,再来写代码真是得心应手,没有什么难度而言了。
关于Max7219点阵的驱动详解请参考这篇帖子
《【Raspberry Pi 3 开发板 试用体验】AndroidThings MAX7219点阵》 https://bbs.icxbk.com/community/thread-97808-1-1.html。
由于ESP32兼容Arduino,所以只要熟悉Arduino的SPI操作即可。首先来看看ESP32相关的引脚,如下图所示:
将Max7219的DIN连接IO23,CLK连接IO18,CS连接D8,GND接Ground,VCC接3.3V。
由于不用模拟SPI了,所以核心函数只有一个,而且Arduino的SPI提供了transfer16函数,可以直接传输16位数据,这样就不用分两次传输了。
void WriteMax7219(byte addr, byte data) {
digitalWrite(pinCS, LOW);
word w = word(addr, data);
SPI.transfer16(w);
digitalWrite(pinCS, HIGH);
}
接下来就是初始化函数了,有了核心函数之后,什么都简单了
void InitMax7219() {
WriteMax7219(0x09, 0x00); //译码方式:不译码
WriteMax7219(0x0a, 0x03); //亮度
WriteMax7219(0x0b, 0x07); //扫描界限;8个数码管显示
WriteMax7219(0x0c, 0x01); //掉电模式:0,普通模式:1
WriteMax7219(0x0f, 0x00); //显示测试:1;测试结束,正常显示:0
}
完整的代码如下所示,真的是非常的简单:
#include
int pinCS = D8;
byte disp = {
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00},
{0x00,0x00,0x3C,0x24,0x24,0x3C,0x00,0x00},
{0x00,0x7E,0x42,0x42,0x42,0x42,0x7E,0x00},
{0xFF,0x81,0x81,0x81,0x81,0x81,0x81,0xFF}
};
void WriteMax7219(byte addr, byte data) {
digitalWrite(pinCS, LOW);
word w = word(addr, data);
SPI.transfer16(w);
digitalWrite(pinCS, HIGH);
}
void InitMax7219() {
WriteMax7219(0x09, 0x00); //译码方式:不译码
WriteMax7219(0x0a, 0x03); //亮度
WriteMax7219(0x0b, 0x07); //扫描界限;8个数码管显示
WriteMax7219(0x0c, 0x01); //掉电模式:0,普通模式:1
WriteMax7219(0x0f, 0x00); //显示测试:1;测试结束,正常显示:0
}
void setup() {
SPI.begin();
pinMode(pinCS, OUTPUT);
InitMax7219();
}
void loop() {
for(int j=0;j<5;j++)
{
for(int i=1;i<9;i++)
WriteMax7219(i,disp);
delay(200);
}
}
最终的连接图如下:
本帖最后由 bluebanboom 于 2017-10-14 19:35 编辑
网上大多数资料里都是直接GPIO模拟SPI来驱动Max7219点阵的,这样代码比较容易移植,因为在各个不同平台上GPIO的使用相对来说最为简单。但是这次我偏不走模拟,直接用原生SPI来驱动。之所以有这样的底气,是这两天在AndroidThings上彻底掌握了Max7219点阵的驱动原理,再来写代码真是得心应手,没有什么难度而言了。
关于Max7219点阵的驱动详解请参考这篇帖子
《【Raspberry Pi 3 开发板 试用体验】AndroidThings MAX7219点阵》 https://bbs.icxbk.com/community/thread-97808-1-1.html。
由于ESP32兼容Arduino,所以只要熟悉Arduino的SPI操作即可。首先来看看ESP32相关的引脚,如下图所示:
将Max7219的DIN连接IO23,CLK连接IO18,CS连接D8,GND接Ground,VCC接3.3V。
由于不用模拟SPI了,所以核心函数只有一个,而且Arduino的SPI提供了transfer16函数,可以直接传输16位数据,这样就不用分两次传输了。
void WriteMax7219(byte addr, byte data) {
digitalWrite(pinCS, LOW);
word w = word(addr, data);
SPI.transfer16(w);
digitalWrite(pinCS, HIGH);
}
接下来就是初始化函数了,有了核心函数之后,什么都简单了
void InitMax7219() {
WriteMax7219(0x09, 0x00); //译码方式:不译码
WriteMax7219(0x0a, 0x03); //亮度
WriteMax7219(0x0b, 0x07); //扫描界限;8个数码管显示
WriteMax7219(0x0c, 0x01); //掉电模式:0,普通模式:1
WriteMax7219(0x0f, 0x00); //显示测试:1;测试结束,正常显示:0
}
完整的代码如下所示,真的是非常的简单:
#include
int pinCS = D8;
byte disp = {
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00},
{0x00,0x00,0x3C,0x24,0x24,0x3C,0x00,0x00},
{0x00,0x7E,0x42,0x42,0x42,0x42,0x7E,0x00},
{0xFF,0x81,0x81,0x81,0x81,0x81,0x81,0xFF}
};
void WriteMax7219(byte addr, byte data) {
digitalWrite(pinCS, LOW);
word w = word(addr, data);
SPI.transfer16(w);
digitalWrite(pinCS, HIGH);
}
void InitMax7219() {
WriteMax7219(0x09, 0x00); //译码方式:不译码
WriteMax7219(0x0a, 0x03); //亮度
WriteMax7219(0x0b, 0x07); //扫描界限;8个数码管显示
WriteMax7219(0x0c, 0x01); //掉电模式:0,普通模式:1
WriteMax7219(0x0f, 0x00); //显示测试:1;测试结束,正常显示:0
}
void setup() {
SPI.begin();
pinMode(pinCS, OUTPUT);
InitMax7219();
}
void loop() {
for(int j=0;j<5;j++)
{
for(int i=1;i<9;i++)
WriteMax7219(i,disp);
delay(200);
}
}
最终的连接图如下: