功能介绍
MAX7219点阵显示模块是采用MAX7219驱动芯片对一片8x8的点阵LED屏实现驱动点亮的显示模块。MAX7219驱动芯片一片集成化的串行输入/输出共阴极显示驱动器,可以连接条线图显示器或者64个独立的LED。该芯片可以实现信号的联级驱动,也就是可以多个MAX7219显示模块之间串联起来使用,在使用时,串联的所有模块都只需要3个Arduino引脚就可以完成所有模块的显示。因为模块可以串联使用,所以市面上也有直接设计成多个8x8点阵一体的模块,使用时将会省去模块间的接线,更为方便。的供电电压为5VDC。MAX7219点阵显示模块实物如图3.19.1所示。



图3.19.1 MAX7219点阵显示模块实物图
接线说明
| Arduino | MAX7219显示模块 | 说明 |
|---|---|---|
| VCC/+/5V | VCC/+/5V | 供电引脚 |
| GND/G/- | GND/G/- | 电源地线 |
| D11 | DIO | IDE编程时根据不同的库,使用引脚不同,Mixly编程时智能使用改表格中的引脚 |
| D9 | CS | |
| D13 | CLK |
使用说明:
1.按照接线说明完成接线,注意供电引脚必须连接正确。
2(a).Arduino IDE编程
采用Arduino IDE编程时,需要用到库文件,可以通过Arduino IDE的“库管理器”查找所需要的库使用。在“库管理器”中可以搜索“MAX7219”关键词会得到多个和MAX7219相关的库,可以根据自己的情况选择合适的库使用,但是以上搜索得到的库或多或少都存在一些问题,在此推荐一个库“LedControl”,该库可以用于使用MAX7221和MAX7219驱动的SPI总线88 LED显示屏及7段LED数码管。定义一个对象最多可以驱动8块88LED显示屏(每块64个LED,总共512个)或8个7段数码管,需占用三个Arduino的IO口。如需驱动超过8个设备只能定义多个对象,但需要占用更多的IO口。这个库文件,只是可以设定屏上哪个LED点亮哪个LED点灭,想要让LED点阵像跑马灯一样显示出动态效果,需要自己编写相应的程序。对于该库的具体使用方法,可以参考链接:https://www.yuque.com/docs/share/233b5b82-1469-47c5-bf59-85cde80603b6?# 《LedControl库使用说明》 。
对于MAX7219点阵屏的使用,本人采用直接数字口驱动的方式写了一个例程,实现滚动显示数字0-9,详细代码请参看参考程序。
2(b).Mixly编程
采用Mixly编程时,MAX7219点阵显示模块在“显示器”—>“点阵屏”下,展开后将会有多个个MAX7219点阵显示模块相关的程序模块,其中MAX7219点阵初始化模块为必须的程序模块,它用来设置连接到Arduino主板的点阵模块的硬件信息,其中连接的3个引脚中“CS”引脚为可变引脚,其余两个引脚为不可改变引脚,直接使用默认引脚连接即可;“水平点阵屏数”和“竖直点阵屏数”默认为1,也就是单个8x8点阵屏的模块。使用时按照实际连接数设置。其他MAX7219点阵的程序模块为非必须模块,使用时参照程序模块的文字描述使用,模块的文字描述足以说明程序模块的功能了,在此不在详细介绍。具体使用方法请参看参考程序。
参考程序:
Arduino 参考程序
MAX7219的参考程序在此给出两个样例程序,样例程序一是基于LedControl库编写的,实现亮度16级调节,并显示当前的亮度等级;样例程序二是直接采用Arduino的数字接口方式,直接编写MAX7219驱动函数来实现滚动显示数字0-9。样例程序二的驱动函数是根据MAX7219芯片数据手册编写,需要了解更多的硬件知识。
样例程序一:
#include <LedControl.h>//定义MAX7219的硬件连接接口int DIN = 11;int CS = 7;int CLK = 13;//定义显示字符数组0-9,a-fbyte s0[8] = {0x00, 0x38, 0x44, 0x44, 0x44, 0x44, 0x44, 0x38}; //0byte s1[8] = {0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38}; //1byte s2[8] = {0x00, 0x78, 0x08, 0x08, 0x78, 0x40, 0x40, 0x78}; //2byte s3[8] = {0x00, 0x78, 0x08, 0x08, 0x78, 0x08, 0x08, 0x78}; //3byte s4[8] = {0x00, 0x08, 0x18, 0x28, 0x48, 0x7C, 0x08, 0x08}; //4byte s5[8] = {0x00, 0x78, 0x40, 0x40, 0x78, 0x08, 0x08, 0x78}; //5byte s6[8] = {0x00, 0x78, 0x40, 0x40, 0x78, 0x48, 0x48, 0x78}; //6byte s7[8] = {0x00, 0x78, 0x48, 0x08, 0x08, 0x08, 0x08, 0x08}; //7byte s8[8] = {0x00, 0x78, 0x48, 0x48, 0x78, 0x48, 0x48, 0x78}; //8byte s9[8] = {0x00, 0x78, 0x48, 0x48, 0x78, 0x08, 0x08, 0x78}; //9byte z_a[8] = {0x00, 0x38, 0x44, 0x44, 0x44, 0x7C, 0x44, 0x44}; //Abyte z_b[8] = {0x00, 0x40, 0x40, 0x40, 0x70, 0x48, 0x48, 0x70}; //bbyte z_c[8] = {0x00, 0x38, 0x44, 0x40, 0x40, 0x40, 0x44, 0x38}; //cbyte z_d[8] = {0x00, 0x78, 0x24, 0x24, 0x24, 0x24, 0x24, 0x78}; //Dbyte z_e[8] = {0x00, 0x40, 0x40, 0x78, 0x40, 0x40, 0x78}; //Ebyte z_f[8] = {0x00, 0x78, 0x40, 0x40, 0x70, 0x40, 0x40, 0x40}; //Fbyte smile[8] = {0x3C, 0x42, 0xA5, 0x81, 0xA5, 0x99, 0x42, 0x3C}; //笑脸byte neutral[8] = {0x3C, 0x42, 0xA5, 0x81, 0xBD, 0x81, 0x42, 0x3C}; //标准脸//创建一个对象,名称是lcLedControl lc = LedControl(DIN, CLK, CS, 4);byte i = 0;void setup() {lc.shutdown(0, false); //启动时,MAX72XX处于省电模式lc.setIntensity(0, 8); //将亮度设置为8lc.clearDisplay(0); //清除显示}void loop() {lc.setIntensity(0, i); //亮度设置printByte(neutral);//显示标准脸delay(1000);switch (i) {case 0: printByte(s0); //显示0break;case 1: printByte(s1); //显示1break;case 2: printByte(s2);break;case 3: printByte(s3);break;case 4: printByte(s4);break;case 5: printByte(s5);break;case 6: printByte(s6);break;case 7: printByte(s7);break;case 8: printByte(s8);break;case 9: printByte(s9);break;case 10: printByte(z_a);break;case 11: printByte(z_b);break;case 12: printByte(z_c);break;case 13: printByte(z_d);break;case 14: printByte(z_e);break;case 15: printByte(z_f);break;}delay(1000);printByte(smile);//显示标准脸delay(1000);i++;if (i > 15)i = 1;}//点阵显示函数void printByte(byte character []){int i = 0;for (i = 0; i < 8; i++){lc.setRow(0, i, character[i]);}}
样例程序二:
/*-------------------------------------------* Arduino nano板驱动max7219点阵显示* 滚动显示数字0-9* 显示方式有5种* 0-普通显示,直接显示数字* 1-滚动显示,出现:下方,消失:上方* 2-滚动显示,出现:下方,消失:下方* 3-滚动显示,出现:上方,消失:下方* 4-滚动显示,出现:上方,消失:上方* 作者:@毕世良* 时间:2020年1月9*------------------------------------------*/int Max7219_pin_CLK=13;int Max7219_pin_CS=7;int Max7219_pin_DIN=11;byte disp[9]={0}; //显示缓存区,每次刷新前需要更新byte static disp1[11][9]={{0x00,0x1C,0x22,0x22,0x22,0x22,0x22,0x1C},//0/{0x00,0x08,0x0C,0x0A,0x08,0x08,0x08,0x1E},//1/{0x00,0x1E,0x10,0x10,0x1E,0x02,0x02,0x1E},//2/{0x00,0x1E,0x10,0x10,0x1E,0x10,0x10,0x1E},//3/{0x08,0x0C,0x0A,0x09,0x1F,0x08,0x1E,0x00},//4/{0x00,0x1E,0x02,0x02,0x1E,0x10,0x10,0x1E},//5/{0x00,0x1E,0x02,0x02,0x1E,0x12,0x12,0x1E},//6/{0x00,0x1E,0x12,0x08,0x08,0x08,0x08,0x08},//7/{0x00,0x1E,0x12,0x12,0x1E,0x12,0x12,0x1E},//8/{0x00,0x1E,0x12,0x12,0x1E,0x10,0x10,0x1E},//9/};//--------------------------------------------//功能:向MAX7219(U3)写入字节//入口参数:DATA 要写入的数据//出口参数:无//说明:void Write_Max7219_byte(byte DATA){byte i;digitalWrite(Max7219_pin_CS,LOW);for(i=8;i>=1;i--){ //串行数据写入max7219芯片内digitalWrite(Max7219_pin_CLK,LOW);if((DATA&0x80)==0x80){ //如果要写的这位为高digitalWrite(Max7219_pin_DIN,HIGH);}else{ //否则digitalWrite(Max7219_pin_DIN,LOW);}DATA=DATA<<1; //要写入的数据左移一位digitalWrite(Max7219_pin_CLK,HIGH);}}//-------------------------------------------//功能:向MAX7219写入数据//入口参数:address:要写入的地址0-9、dat:要写入的数据 8位//出口参数:无//说明:void Write_Max7219(byte address,byte dat){digitalWrite(Max7219_pin_CS,LOW);Write_Max7219_byte(address); //写入地址,即数码管编号Write_Max7219_byte(dat); //写入数据,即数码管显示数字digitalWrite(Max7219_pin_CS,HIGH);}//***************************//max7219初始化函数//*************************void Init_MAX7219(void){Write_Max7219(0x09, 0x00); //译码方式:BCD码Write_Max7219(0x0a, 0x03); //亮度Write_Max7219(0x0b, 0x07); //扫描界限;8个数码管显示Write_Max7219(0x0c, 0x01); //掉电模式:0,普通模式:1Write_Max7219(0x0f, 0x00); //显示测试:1;测试结束,正常显示:0}//*************************//max7219滚动显示函数一个数字函数//参数:number 需要显示的数字//mode:显示模式,1-从下向上出现,向上消失 2-从下向上出现,向下消失 3-从上向下出现,向下消失 4-从上向下出现,向上消失 0-普通显示,直接出来//显示向上滚动//******************************void disp_number(byte numbre_dat,byte mode1){byte i,j,k;if(mode1==0){ // 0 直接显示for(k=0;k<8;k++){disp[k]=disp1[numbre_dat][7-k];}for(i=1;i<9;i++){ //写数据到MAX7219芯片Write_Max7219(i,disp[i-1]);}delay(500);}else if(mode1==1){for(j=0;j<16;j++){if(j<8){ // 1 出现方式 ,自下而上if(j==0){disp[0]=disp1[numbre_dat][j];}else{for(k=j;k>0;k--){disp[k]=disp[k-1];}disp[0]=disp1[numbre_dat][j];}}else{ // 1 消失的方式 向上for(k=7;k>0;k--){disp[k]=disp[k-1];}disp[0]=0;}for(i=1;i<9;i++){ //写数据到MAX7219芯片Write_Max7219(i,disp[i-1]);delay(10);}if(j==7){delay(400);}}}else if(mode1==2){for(j=0;j<16;j++){if(j<8){ // 2 出现方式 ,自下而上if(j==0){disp[0]=disp1[numbre_dat][j];}else{for(k=j;k>0;k--){disp[k]=disp[k-1];}disp[0]=disp1[numbre_dat][j];}}else{ // 2 消失的方式 向下for(k=0;k<8;k++){disp[k]=disp[k+1];}disp[7]=0;}for(i=1;i<9;i++){ //写数据到MAX7219芯片Write_Max7219(i,disp[i-1]);delay(10);}if(j==7){delay(400);} //当显示完整后等待一下}}else if(mode1==3){for(j=0;j<16;j++){if(j<8){ // 3 出现方式,自上而下if(j==0){disp[7]=disp1[numbre_dat][7-j];}else{for(k=j;k>0;k--){disp[7-k]=disp[7-k+1];}disp[7]=disp1[numbre_dat][7-j];}}else{ // 3 消失方式,向上for(k=0;k<8;k++){disp[k]=disp[k+1];}disp[7]=0;}for(i=1;i<9;i++){ //写数据到MAX7219芯片Write_Max7219(i,disp[i-1]);delay(10);}if(j==7){delay(400);}}}else if(mode1==4){for(j=0;j<16;j++){if(j<8){ // 4 出现方式,自上而下if(j==0){disp[7]=disp1[numbre_dat][7-j];}else{for(k=j;k>0;k--){disp[7-k]=disp[7-k+1];}disp[7]=disp1[numbre_dat][7-j];}}else{ // 4 消失方式,向下for(k=7;k>0;k--){disp[k]=disp[k-1];}disp[0]=0;}for(i=1;i<9;i++){ //写数据到MAX7219芯片Write_Max7219(i,disp[i-1]);delay(10);}if(j==7){delay(400);}}}}void setup() {pinMode(Max7219_pin_CS,OUTPUT);pinMode(Max7219_pin_CLK,OUTPUT);pinMode(Max7219_pin_DIN,OUTPUT);Init_MAX7219(); //初始化MAX7219芯片}void loop() {disp_number(0,1); //模式1delay(100);disp_number(1,1);delay(100);disp_number(2,2); //模式2delay(100);disp_number(3,2);delay(100);disp_number(4,3); //模式3delay(100);disp_number(5,3);delay(100);disp_number(6,4); //模式4delay(100);disp_number(7,4);delay(100);disp_number(8,0); //模式0 普通显示delay(100);disp_number(9,0);delay(100);}
样例程序二是直接采用digitalWrite()函数实现数据串行写入MAX7219芯片,其实Arduino官方已经写好了一个函数“shiftout”,用该函数同样可以实现数据的串行写入芯片内,该函数的使用方法请参照附录2中常用函数。
Mixly参考程序

以上参考程序实现在MAX7219点阵显示屏上滚动显示“Arduino”几个字符2S时间,再显示一个斜向的双向箭头符号2S时间,再显示字幕“M”2S时间,最后关闭显示2S时间,如此循环。
