基于Arduino使用MAX7219点阵屏
产品介绍
MAX7219是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储每一个数据。只有一个外部寄存器用来设置各个LED的段电流。一个方便的四线串行接口可以联接通用的微处理器。每个数据可以寻址在更新时不需要改写所有的显示。MAX7219同样允许用户对每一个数据选择编码或者不编码。整个设备包含一个μA的低功耗关闭模式,模拟和数字亮度控制,一个扫描限制寄存器,允许用户显示1-8位数据,还有一个让所有LED发光的检测模式。只需要3个IO口即可驱动1个点阵!点阵显示时无闪烁!支持级联!
(MAX7219点阵屏正面)
产品参数
- 产品尺寸:32mm*32mm*14mm
- 单个模块:可以驱动一个8*8共阴点阵
- 工作电压:5V
- 带4个螺丝孔:孔径3mm
- 带输入/输出:接口,支持多个模块级联
使用方法
1. 模块左边为输入端口,右边为输出端口; 2. 控制单个模块时,只需要将输入端口接到CPU; 3. 多个模块级联时,第一个模块的输入端接CPU,输出端接第二个模块的输入端,第二个模块的输出端接第三个模块的输入端,以此类推。
接线方式
MAX7219点阵屏 Arduino Nano VCC <------> 5V GND <------> GND DIN <------> D11 CS <------> D9 CLK <------> D13
(MAX7219点阵屏反面)
一块点阵屏使用方法Mixly 图形化编程程序
点阵初始化设置,对应接线方式正确,因现在只使用一个点阵屏,所以水平点阵屏数值为1,竖直点阵屏为1。
(点阵初始化)
点阵图案通过打钩的方式确定要点亮的二极管,注意,不同的点阵图案,变量名不一样,如点阵先显示一个大爱心的图案,1秒后,显示小爱心图案。这里,两个点阵图案屏幕序号相同,但是数组变量不同,变量相同的情况下,程序会编译失败。
(点阵图案显示程序)
程序上传之后,点阵图案开始时隔1秒跳动变化。
(大爱心点阵图案)
程序实现代码
- #include <SPI.h>
- #include <Adafruit_GFX.h>
- #include <Max72xxPanel.h>
- Max72xxPanel myMatrix = Max72xxPanel(9,1,1);
- uint8_t LEDArray[8];
- const uint8_t A[8] PROGMEM ={0x00,0x18,0x3c,0x7e,0xff,0xff,0x66,0x00};
- const uint8_t B[8] PROGMEM ={0x00,0x00,0x18,0x3c,0x7e,0x24,0x00,0x00};
- void setup(){
- }
- void loop(){
- memcpy_P (&LEDArray, &A, 8);
- for(int index_i=0; index_i<8; index_i++)
- {
- for(int index_j=0*8; index_j<0*8+8; index_j++)
- {
- if((LEDArray[index_i]&0x01)>0)
- myMatrix.drawPixel(index_j, 7-index_i,1);
- else
- myMatrix.drawPixel(index_j, 7-index_i,0);
- LEDArray[index_i] = LEDArray[index_i]>>1;
- }
- }
- myMatrix.write();
- delay(1000);
- memcpy_P (&LEDArray, &B, 8);
- for(int index_i=0; index_i<8; index_i++)
- {
- for(int index_j=0*8; index_j<0*8+8; index_j++)
- {
- if((LEDArray[index_i]&0x01)>0)
- myMatrix.drawPixel(index_j, 7-index_i,1);
- else
- myMatrix.drawPixel(index_j, 7-index_i,0);
- LEDArray[index_i] = LEDArray[index_i]>>1;
- }
- }
- myMatrix.write();
- delay(1000);
- }
复制代码
多块点阵屏使用方法
点阵屏可多块连接使用,多块点阵屏连接使用,会造成图案乱码现象,原因是开机瞬间,电路中出现较多的紊乱信号,而MAX7219的引脚输入阻抗比较大,容易收到这些信号的影响,而且MAX7219内部电路在输入过载的情况下会出现类似运放阻塞的问题。解决方法是在MAX7219的Load引脚处接一个10K的电阻到地线,这样开机时的紊乱信号就不能在Load引脚处产生足够大的电压,这种方法能够100%解决绕线变压器电源和小功率开关电源的影响。但是当整机中有使用100W的大功率开关电源,则在Load引脚处接电阻,即使接1K电阻,也不能保证100%安全。这时,采用的方法是单独为 Max7219电路做一个软启动电源电路,只需要用一个Mosfet管,一个10K电阻和100uF电容就可以让Max7219在整机上电约100ms后才上电,实际测试,这种方案也是100%成功的。
(四块点阵屏连接)
Mixly 图形化编程程序
四块点阵屏连接使用时,在点阵初始化中,水平点阵屏数改为4,数值点屏数不变,屏幕序号则是从0开始,第二个连接的点阵屏屏幕序号为1,其他两个点阵屏屏幕序号同理。用四块点阵屏,设计一个5的点数,主要屏幕序号、变量的不同,根据连接角度,设计点阵图案。
(点数5程序)
程序实现代码
- #include <SPI.h>
- #include <Adafruit_GFX.h>
- #include <Max72xxPanel.h>
- Max72xxPanel myMatrix = Max72xxPanel(9,4,1);
- uint8_t LEDArray[8];
- const uint8_t Q[8] PROGMEM ={0xc0,0xc0,0x00,0x1e,0x1e,0x1e,0x1e,0x00};
- const uint8_t R[8] PROGMEM ={0x00,0x1e,0x1e,0x1e,0x1e,0x00,0xc0,0xc0};
- const uint8_t S[8] PROGMEM ={0xc0,0xc0,0x00,0x1e,0x1e,0x1e,0x1e,0x00};
- const uint8_t T[8] PROGMEM ={0x00,0x1e,0x1e,0x1e,0x1e,0x00,0xc0,0xc0};
- void setup(){
- }
- void loop(){
- myMatrix.setIntensity(10);
- memcpy_P (&LEDArray, &Q, 8);
- for(int index_i=0; index_i<8; index_i++)
- {
- for(int index_j=0*8; index_j<0*8+8; index_j++)
- {
- if((LEDArray[index_i]&0x01)>0)
- myMatrix.drawPixel(index_j, 7-index_i,1);
- else
- myMatrix.drawPixel(index_j, 7-index_i,0);
- LEDArray[index_i] = LEDArray[index_i]>>1;
- }
- }
- myMatrix.write();
- memcpy_P (&LEDArray, &R, 8);
- for(int index_i=0; index_i<8; index_i++)
- {
- for(int index_j=1*8; index_j<1*8+8; index_j++)
- {
- if((LEDArray[index_i]&0x01)>0)
- myMatrix.drawPixel(index_j, 7-index_i,1);
- else
- myMatrix.drawPixel(index_j, 7-index_i,0);
- LEDArray[index_i] = LEDArray[index_i]>>1;
- }
- }
- myMatrix.write();
- memcpy_P (&LEDArray, &S, 8);
- for(int index_i=0; index_i<8; index_i++)
- {
- for(int index_j=2*8; index_j<2*8+8; index_j++)
- {
- if((LEDArray[index_i]&0x01)>0)
- myMatrix.drawPixel(index_j, 7-index_i,1);
- else
- myMatrix.drawPixel(index_j, 7-index_i,0);
- LEDArray[index_i] = LEDArray[index_i]>>1;
- }
- }
- myMatrix.write();
- memcpy_P (&LEDArray, &T, 8);
- for(int index_i=0; index_i<8; index_i++)
- {
- for(int index_j=3*8; index_j<3*8+8; index_j++)
- {
- if((LEDArray[index_i]&0x01)>0)
- myMatrix.drawPixel(index_j, 7-index_i,1);
- else
- myMatrix.drawPixel(index_j, 7-index_i,0);
- LEDArray[index_i] = LEDArray[index_i]>>1;
- }
- }
- myMatrix.write();
- }
复制代码
(显示点数5图案)
|