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

取反操作

效果如下图:

Arduino 8X8LED矩阵用法详解

效果图

如何只点亮一盏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三个数字针脚哦!!!!


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

|