最新消息:380元/半年,推荐全网最具性价比的一站式编程学习平台码丁实验室

Arduino 8X8LED矩阵用法详解

Arduino 少儿编程 4144浏览 0评论

友情提示:380元/半年,儿童学编程,就上码丁实验室

Arduino 8X8LED矩阵用法详解


需要的元件

8X8LED矩阵一个(红色,共阳极)

560欧电阻8个

移位寄存器74HC595两个

面包板一个

Arduino UNO一个

跳线若干

基本原理接线图

Arduino 8X8LED矩阵用法详解

16个针脚

Arduino 8X8LED矩阵用法详解

两个移位寄存器和arduino接线图

Arduino 8X8LED矩阵用法详解

行与列比特分布图

列要是0(LOW),行要是1(HIGH),对应的LED才会被点亮

例如要让矩阵显示如下所示的图形(黑点表示LED点亮):

Arduino 8X8LED矩阵用法详解

显示图形

参照行列比特分布图,可以得到如下比特分布图:

Arduino 8X8LED矩阵用法详解

比特分布图

arduino代码如下:

#define DATA 6

#define LATCH 8

#define CLOCK 10

void setup() {

  // put your setup code here, to run once:

pinMode(DATA,OUTPUT);

pinMode(LATCH,OUTPUT);

pinMode(CLOCK,OUTPUT);

}

void loop() {

  // put your main code here, to run repeatedly:

digitalWrite(LATCH,LOW);

shiftOut(DATA,CLOCK,MSBFIRST,B10101010);//列

shiftOut(DATA,CLOCK,MSBFIRST,~B10101010);//行

digitalWrite(LATCH,HIGH);

do{}while(1);

}

其中涉及到比特运算(非):

~B10101010==B01010101

取反操作

效果如下图:

效果图

如何只点亮一盏LED灯

现在需要得到如下的效果:

Arduino 8X8LED矩阵用法详解

第一行第一列的LED

对照比特分布图得到下图:

Arduino 8X8LED矩阵用法详解

第一行第一列LED的比特分布图

arduino代码如下:

#define DATA 6

#define LATCH 8

#define CLOCK 10

void setup() {

  // put your setup code here, to run once:

pinMode(DATA,OUTPUT);

pinMode(LATCH,OUTPUT);

pinMode(CLOCK,OUTPUT);

}

void loop() {

  // put your main code here, to run repeatedly:

digitalWrite(LATCH,LOW);

shiftOut(DATA,CLOCK,MSBFIRST,~B00000001);//列

shiftOut(DATA,CLOCK,MSBFIRST,B00000001);//行

digitalWrite(LATCH,HIGH);

do{}while(1);

}

注意到一点,如果默认列LED比特全是0则:

要想让第一行的LED亮,则第一行的“行比特”将是B00000001,对应的十进制数是1

同理,要想让第二行的LED亮,则第二行的“行比特”将是B00000010,对应十进制数是2

要想让第七行LED亮,则第七行的“行比特”将是B10000000,对应十进制128

而列则需要取反。

下例将写一个函数,指定对应的行和列便可以点亮对应的LED,而不需要再和比特分布图进行比较。

点亮单个LED函数

arduino代码如下:

#define DATA 6

#define LATCH 8

#define CLOCK 10

void setup() {

  // put your setup code here, to run once:

pinMode(DATA,OUTPUT);

pinMode(LATCH,OUTPUT);

pinMode(CLOCK,OUTPUT);

}

int binary[]={1,2,4,8,16,32,64,128};

int r,c=0;

void setLed(int row,int column,int del)

{

  digitalWrite(LATCH,LOW);

  shiftOut(DATA,CLOCK,MSBFIRST,~binary[column]);//列

  shiftOut(DATA,CLOCK,MSBFIRST,binary[row]);//行

  digitalWrite(LATCH,HIGH);

  delay(del);

  }

void loop()

{

  for(int i=0;i<8;i++)

  {

    for(int j=0;j<8;j++)

    {

      setLed(i,j,100);

      }

    }

  }

其中的setLed函数便可以直接指定对应的行和列来点亮对应的LED。代码中的两个嵌套For循环将使LED从第一行第一列逐行扫表到第把行第八列。

利用人眼视觉暂留的效果,可以制作一些图形,见下例

生成图形

例如生成下列图形

Arduino 8X8LED矩阵用法详解

要生成的图形

arduino代码如下:

#define DATA 6

#define LATCH 8

#define CLOCK 10

void setup() {

  // put your setup code here, to run once:

pinMode(DATA,OUTPUT);

pinMode(LATCH,OUTPUT);

pinMode(CLOCK,OUTPUT);

}

int binary[]={1,2,4,8,16,32,64,128};

int r,c=0;

void setLed(int row,int column,int del)

{

  digitalWrite(LATCH,LOW);

  shiftOut(DATA,CLOCK,MSBFIRST,~binary[column]);//列

  shiftOut(DATA,CLOCK,MSBFIRST,binary[row]);//行

  digitalWrite(LATCH,HIGH);

  delay(del);

  }

void loop()

{

  setLed(0,0,0);

  setLed(0,1,0);

  setLed(0,2,0);

  setLed(0,5,0);

  setLed(0,6,0);

  setLed(0,7,0);

  setLed(1,0,0);

  setLed(1,1,0);

  setLed(1,2,0);

  setLed(1,5,0);

  setLed(1,6,0);

  setLed(1,7,0);

  setLed(3,2,0);

  setLed(3,5,0);

  setLed(4,2,0);

  setLed(4,3,0);

  setLed(4,4,0);

  setLed(4,5,0);

  setLed(6,0,0);

  setLed(6,1,0);

  setLed(6,6,0);

  setLed(6,7,0);

  setLed(7,1,0);

  setLed(7,2,0);

  setLed(7,3,0);

  setLed(7,4,0);

  setLed(7,5,0);

  setLed(7,6,0);

  }

效果图如下:

Arduino 8X8LED矩阵用法详解

笑脸图形

但是这种方法太过繁琐,下例将介绍一种更直观的方法

生成图形二

arduino代码如下:

#define DATA 6

#define LATCH 8

#define CLOCK 10

void setup() {

  // put your setup code here, to run once:

pinMode(DATA,OUTPUT);

pinMode(LATCH,OUTPUT);

pinMode(CLOCK,OUTPUT);

}

int binary[]={1,2,4,8,16,32,64,128};

byte smile[]={

              B00011000,

              B00011000,

              B11111111,

              B11011011,

              B11000011,

              B11111111,

              B00111100,

              B10000001

  };

void loop()

{

  for(int i=0;i<8;i++)

  {

    digitalWrite(LATCH,LOW);

    shiftOut(DATA,CLOCK,MSBFIRST,smile[i]);//列

    shiftOut(DATA,CLOCK,MSBFIRST,binary[i]);//行

    digitalWrite(LATCH,HIGH);

    }

    delay(1);

  }

注意:

smile数组中,各比特中的0代表的就是需要亮的矩阵LED,这让显示图形变得很直观,大家可以尝试改变一下图形。

动画

在介绍矩阵动画之前,先介绍一下两种比特位操作符,位左移操作符(<<)和位右移操作符(>>)

例子如下图:

Arduino 8X8LED矩阵用法详解

位左移操作符

位左移操作符,比特位向左移动,右边空出补零。

同理,右移操作符,比特位向右移动,左边空出补零。

byte a=B11110001;

byte b=a>>4;

b将变成B00001111。

arduino代码如下:

#define DATA 6

#define LATCH 8

#define CLOCK 10

void setup() {

  // put your setup code here, to run once:

pinMode(DATA,OUTPUT);

pinMode(LATCH,OUTPUT);

pinMode(CLOCK,OUTPUT);

}

int binary[]={1,2,4,8,16,32,64,128};

byte smile[]={

              B00011000,

              B00011000,

              B11111111,

              B11011011,

              B11000011,

              B11111111,

              B00111100,

              B10000001

  };

void loop()

{

  for(int shift=0;shift<9;shift++)

  {

     for(int stay=0;stay<30;stay++)

       {

           for(int i=0;i<8;i++)

               {

                  digitalWrite(LATCH,LOW);

                  shiftOut(DATA,CLOCK,MSBFIRST,smile[i]<<shift);//列

                  shiftOut(DATA,CLOCK,MSBFIRST,binary[i]);//行

                  digitalWrite(LATCH,HIGH);

                }//end i

                  delay(1);

  }//end stay

  }//end shift

  }//end loop

这里还是只用了arduino三个数字针脚哦!!!!


喜欢文章,欢迎大家转发!!!

 

您必须 登录 才能发表评论!