Arduino 学习笔记 | 单片机控制驱动MAX7219 8*8 LED点阵显示模块

第一部分
8 x 8点阵模块

不带MAX7219驱动的8×8 點矩陣LED(如下图),从左侧有写字的一侧开始,L接正电,C接负电。

  • 列L (1、2、3、4、5、6、7、8)
  • 行C(1、2、3、4、5、6、7、8)
    不带MAX7219驱动的8*8LED模块

Arduino接线

因为Arduino Uno引脚有限,所以就只接了6个引脚做6*6LED灯示例。

在这里插入图片描述

实验一: 点亮(L4,C1)LED灯

注意:PIN0 、PIN1引脚为串口UART下载程序引脚,下载程序是先拔掉导线。

int line[6] = {0,1,2,3,4,5};
int col [6] = {8,9,10,11,12,13};
void setup() {


  Serial.begin(9600);
  
  for(int i=0;i<6;i++)
  {
    pinMode(line[i],OUTPUT);//输出模式
    pinMode(col[i],OUTPUT);

   // 注意: L为 HIGH时,C为LOW时LED点亮
    digitalWrite(line[i],LOW);//初始化关闭所有LED灯  
    digitalWrite(col[i],HIGH);//

    Serial.print(line[i]);
    Serial.print("-");
      
    }

}

void loop() {

  digitalWrite(line[3],HIGH);//点亮点阵上的(L4,C1)LED灯
  digitalWrite(col[0],LOW);

}

在这里插入图片描述
实验二: 点亮 “X” 形状LED灯

//定义6 * 6的二维数组appear[6][6]  二维数组格式: 阵列[][] appear[c][l]   
//1为点亮LED,0为熄灭LED。
int appear[6][6] = { {1,0,0,0,0,1},
                     {0,1,0,0,1,0},
                     {0,0,1,1,0,0},
                     {0,0,1,1,0,0},
                     {0,1,0,0,1,0},
                     {1,0,0,0,0,1}};



int col [6] = {8,9,10,11,12,13};//一维数组定义 col 的6个脚位 (行)
int line[6] = {0,1,2,3,4,5};//一维数组定义 line 的6个脚位   (列)

//二维数组定义 阵列[行][列]appear[c][l]   1为点亮LED,0为熄灭LED。
int appear[6][6] = { {1,0,0,0,0,1},
                     {0,1,0,0,1,0},
                     {0,0,1,1,0,0},
                     {0,0,1,1,0,0},
                     {0,1,0,0,1,0},
                     {1,0,0,0,0,1}};
void setup() {


  Serial.begin(9600);
  
  for(int i=0;i<6;i++)
  {
    pinMode(col[i],OUTPUT);//输出模式
    pinMode(line[i],OUTPUT);


   // 注意: L为 HIGH时,C为LOW时LED点亮   
    digitalWrite(col[i],HIGH);//初始化关闭LED灯  
    digitalWrite(line[i],LOW);//



    }

}

void loop() {
//  digitalWrite(line[3],HIGH);//点亮点阵上的(L4,C1)LED灯
//  digitalWrite(col[0],LOW);

    for(int c=0;c<6;c++){
      for(int l=0;l<6;l++){

        if(appear[c][l]==1)
        {
          digitalWrite(col[c],LOW);//点亮c行,l列的LED灯
          digitalWrite(line[l],HIGH);

          }          
           Serial.print(appear[c][l]);//打印二维数组的第c行,l列的数值
          
//         Serial.print(c);//打印行数
//         Serial.print(l);//打印列数
           Serial.print("  ");
         
        }
        Serial.print("\n");//换行
         
      }

      while(1)
      {
        ;
        }
}

在这里插入图片描述


第二部分

MAX7219简介

在这里插入图片描述

MAX7219 是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储每一个数据。只有一个外部寄存器用来设置各个LED的段电流。
在这里插入图片描述

在这里插入图片描述

一个方便的四线串行接口可以联接通用的微处理器。每个数据可以寻址在更新时不需要改写所有的显示。MAX7219同样允许用户对每一个数据选择编码或者不编码。

一个方便的四线串行接口可以联接通用的微处理器。每个数据可以寻址在更新时不需要改写所有的显示。MAX7219同样允许用户对每一个数据选择编码或者不编码。
整个设备包含一个150μA的低功耗关闭模式,模拟和数字亮度控制,一个扫描限制寄存器允许用户显示1-8位数据,还有一个让所有LED发光的检测模式。

只需要3个IO口即可驱动1个点阵!点阵显示时无闪烁!支持级联!

接线说明:

  • 1.模块左边为输入端口,右边为输出端口。

  • 2.控制单个模块时,只需要将输入端口接到CPU

  • 3.多个模块级联时,第1个模块的输入端接CPU,输出端接第2个模块的输入端,第2个模块的输出端接第3个模块的输入端,以此类推…

以Arduino Nano为例:

  • VCC → 5V
  • GND → GND
  • DIN → D11
  • CS → D10
  • CLK → D13
    在这里插入图片描述
    正如您在上面的布线方案中看到的那样,仅需要5条线,并且我们使用Arduino Nano(也可与UNO一起使用)。如上图所示连接这些电线,将USB电缆连接到Arduino Nano和计算机。现在我们准备加载代码,但是首先我们需要为MAX7219-Display安装必要的。请在下面查看操作方法:

在这里插入图片描述
在Arduino IDE中下载库文件的时候,报错。

另辟蹊径,在YouTube上找到了一个8*8LED数码管的教程视频地址GitHub获取库文件。

实验一:

//Viral Science  www.viralsciencecreativity.com  www.youtube.com/c/viralscience
//LED 8x8 Matrix Display DEMO
//Libary link:https://github.com/wayoda/LedControl
//Chinse wedsite: CSDN -> Naiva

#include <LedControl.h>
int DIN = 11;
int CS =  10;
int CLK = 13;

LedControl lc=LedControl(DIN,CLK,CS,0);

void setup(){
 lc.shutdown(0,false);       
 lc.setIntensity(0,15);      //Adjust the brightness maximum is 15
 lc.clearDisplay(0);    
}

void loop(){ 
    
    //Facial Expression
    byte smile[8]=   {0x3C,0x42,0xA5,0x81,0xA5,0x99,0x42,0x3C};
    byte neutral[8]= {0x3C,0x42,0xA5,0x81,0xBD,0x81,0x42,0x3C};
    byte sad[8]=   {0x3C,0x42,0xA5,0x81,0x99,0xA5,0x42,0x3C};
   
    //Arrow
    byte arrow_up[8]= {0x18,0x3C,0x7E,0xFF,0x18,0x18,0x18,0x18};
    byte arrow_down[8]= {0x18,0x18,0x18,0x18,0xFF,0x7E,0x3C,0x18};
   
    
    //Alternate Pattern
    byte d1[8]= {0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55};
    byte d2[8]= {0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA};
    
    //Moving car
    byte b1[8]= {0x00,0x00,0x00,0x00,0x18,0x3C,0x18,0x3C};//8*8LED点阵 取模软件生成
    byte b2[8]= {0x00,0x00,0x00,0x18,0x3C,0x18,0x3C,0x00};
    byte b3[8]= {0x00,0x00,0x18,0x3C,0x18,0x3C,0x00,0x00};
    byte b4[8]= {0x00,0x18,0x3C,0x18,0x3C,0x00,0x00,0x00};
    byte b5[8]= {0x18,0x3C,0x18,0x3C,0x00,0x00,0x00,0x00};
    byte b6[8]= {0x3C,0x18,0x3C,0x00,0x00,0x00,0x00,0x18};
    byte b7[8]= {0x18,0x3C,0x00,0x00,0x00,0x00,0x18,0x3C};
    byte b8[8]= {0x3C,0x00,0x00,0x00,0x00,0x18,0x3C,0x18};


//Moving car
    printByte(b1);
    delay(50);
    printByte(b2);
    delay(50);
    printByte(b3);
    delay(50);
    printByte(b4);
    delay(50);
    printByte(b5);
    delay(50);
    printByte(b6);
    delay(50);
    printByte(b7);
    delay(50);
    printByte(b8);
    delay(50);

//alternate pattern
    printByte(d1);
    delay(100);

    printByte(d2);
    delay(100);

//Arrow
    printByte(arrow_up);
    delay(2000);

    printByte(arrow_down);
    delay(2000);

   
//Facial Expression   
    printByte(smile);
     
    delay(1000);

    printByte(neutral);
    
    delay(1000);

    printByte(sad);    

    delay(1000);
   
 
}

void printByte(byte character [])
{
  int i = 0;
  for(i=0;i<8;i++)
  {
    lc.setRow(0,i,character[i]);
  }
}

在这里插入图片描述

在这里插入图片描述

本文资料下载
~~密码WeChat :Zero903828673 ~~


参考资料

  • 8
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是使用Arduino按键控制MAX7219芯片8*8点阵倒数计时的基本步骤: 1. 连接MAX7219芯片和ArduinoMAX7219芯片的数据线(DIN)、时钟线(CLK)和使能线(CS)连接到Arduino的数字引脚上。具体的引脚可以根据你所使用MAX7219模块来确定。同时,还需要将Arduino的电源和MAX7219模块的电源连接。 2. 编写代码 在Arduino IDE中打开一个新的Sketch,然后编写代码。首先需要定义MAX7219芯片的引脚,以及按键的引脚。接着,需要定义一个8x8的数组来存储点阵上的图案。然后,需要使用一个计时器来实现倒数计时功能,每当计时器的时间到达一定值时,就需要在数组中修改对应的元素值,然后将数组中的值写入到MAX7219模块中。最后,需要使用一个循环来定时更新MAX7219模块的状态。 下面是一个示例代码: ``` #include <LedControl.h> // 定义MAX7219芯片引脚 const int DIN_PIN = 10; const int CLK_PIN = 11; const int CS_PIN = 12; // 定义按键引脚 const int BUTTON_PIN = 2; // 初始化MAX7219芯片 LedControl lc = LedControl(DIN_PIN, CLK_PIN, CS_PIN, 1); // 定义8x8的数组 int matrix[8][8] = { {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0} }; // 定义计时器 unsigned long previousMillis = 0; const long interval = 1000; // 每秒更新一次 void setup() { // 初始化MAX7219芯片 lc.shutdown(0, false); lc.setIntensity(0, 8); lc.clearDisplay(0); // 设置按键引脚为输入模式 pinMode(BUTTON_PIN, INPUT); } void loop() { // 每隔一段时间更新MAX7219模块的状态 unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; updateMatrix(); } // 检测按键是否按下 if (digitalRead(BUTTON_PIN) == HIGH) { // 重置倒数计时 resetCountdown(); } } void updateMatrix() { // 获取当前的倒数时间 int countdown = getCountdown(); // 将倒数时间转换成8x8的图案 for (int row = 0; row < 8; row++) { for (int col = 0; col < 8; col++) { if (countdown % 2 == 1) { matrix[row][col] = 1; } else { matrix[row][col] = 0; } countdown /= 2; } } // 更新MAX7219模块的状态 for (int row = 0; row < 8; row++) { for (int col = 0; col < 8; col++) { lc.setLed(0, row, col, matrix[row][col]); } } } int getCountdown() { // 在这里获取倒数时间,可以从外部传入或者通过其他方式获取 return 60; // 假设倒数时间为60秒 } void resetCountdown() { // 在这里进行倒数计时的重置,可以通过外部传入或者其他方式实现 } ``` 这个示例代码使用LedControl驱动MAX7219模块。在setup()函数中,初始化MAX7219模块和按键,并将点阵数组中的所有元素置为0。在loop()函数中,使用一个计时器来实现每秒更新一次MAX7219模块的状态。同时,检测按键是否按下,如果按下则重置倒数计时。在updateMatrix()函数中,获取当前的倒数时间,并将倒数时间转换成8x8的图案。最后,使用两个循环来更新MAX7219模块的状态。 3. 上传代码 编写完成代码后,将Arduino连接到电脑上,选择正确的开发板和串口,然后上传代码到Arduino中。 4. 测试 将按键连接到Arduino上,并将MAX7219模块接上电源。然后按下按键,倒数计时开始,MAX7219模块上对应的LED会逐渐变亮。过一段时间后,MAX7219模块上的LED会变成全亮,表示倒数计时结束。通过修改代码中的getCountdown()函数和resetCountdown()函数可以实现更多的倒数计时功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naiva

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值