功能介绍
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-f
byte s0[8] = {0x00, 0x38, 0x44, 0x44, 0x44, 0x44, 0x44, 0x38}; //0
byte s1[8] = {0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38}; //1
byte s2[8] = {0x00, 0x78, 0x08, 0x08, 0x78, 0x40, 0x40, 0x78}; //2
byte s3[8] = {0x00, 0x78, 0x08, 0x08, 0x78, 0x08, 0x08, 0x78}; //3
byte s4[8] = {0x00, 0x08, 0x18, 0x28, 0x48, 0x7C, 0x08, 0x08}; //4
byte s5[8] = {0x00, 0x78, 0x40, 0x40, 0x78, 0x08, 0x08, 0x78}; //5
byte s6[8] = {0x00, 0x78, 0x40, 0x40, 0x78, 0x48, 0x48, 0x78}; //6
byte s7[8] = {0x00, 0x78, 0x48, 0x08, 0x08, 0x08, 0x08, 0x08}; //7
byte s8[8] = {0x00, 0x78, 0x48, 0x48, 0x78, 0x48, 0x48, 0x78}; //8
byte s9[8] = {0x00, 0x78, 0x48, 0x48, 0x78, 0x08, 0x08, 0x78}; //9
byte z_a[8] = {0x00, 0x38, 0x44, 0x44, 0x44, 0x7C, 0x44, 0x44}; //A
byte z_b[8] = {0x00, 0x40, 0x40, 0x40, 0x70, 0x48, 0x48, 0x70}; //b
byte z_c[8] = {0x00, 0x38, 0x44, 0x40, 0x40, 0x40, 0x44, 0x38}; //c
byte z_d[8] = {0x00, 0x78, 0x24, 0x24, 0x24, 0x24, 0x24, 0x78}; //D
byte z_e[8] = {0x00, 0x40, 0x40, 0x78, 0x40, 0x40, 0x78}; //E
byte z_f[8] = {0x00, 0x78, 0x40, 0x40, 0x70, 0x40, 0x40, 0x40}; //F
byte smile[8] = {0x3C, 0x42, 0xA5, 0x81, 0xA5, 0x99, 0x42, 0x3C}; //笑脸
byte neutral[8] = {0x3C, 0x42, 0xA5, 0x81, 0xBD, 0x81, 0x42, 0x3C}; //标准脸
//创建一个对象,名称是lc
LedControl lc = LedControl(DIN, CLK, CS, 4);
byte i = 0;
void setup() {
lc.shutdown(0, false); //启动时,MAX72XX处于省电模式
lc.setIntensity(0, 8); //将亮度设置为8
lc.clearDisplay(0); //清除显示
}
void loop() {
lc.setIntensity(0, i); //亮度设置
printByte(neutral);//显示标准脸
delay(1000);
switch (i) {
case 0: printByte(s0); //显示0
break;
case 1: printByte(s1); //显示1
break;
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,普通模式:1
Write_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); //模式1
delay(100);
disp_number(1,1);
delay(100);
disp_number(2,2); //模式2
delay(100);
disp_number(3,2);
delay(100);
disp_number(4,3); //模式3
delay(100);
disp_number(5,3);
delay(100);
disp_number(6,4); //模式4
delay(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时间,如此循环。