友情提示:380元/半年,儿童学编程,就上码丁实验室。
需要的元件
8X8LED矩阵一个(红色,共阳极)
560欧电阻8个
移位寄存器74HC595两个
面包板一个
Arduino UNO一个
跳线若干
基本原理接线图
16个针脚
两个移位寄存器和arduino接线图
行与列比特分布图
列要是0(LOW),行要是1(HIGH),对应的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);
}
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灯
现在需要得到如下的效果:
第一行第一列的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);
}
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代码如下:
#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代码如下:
#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,这让显示图形变得很直观,大家可以尝试改变一下图形。
动画
在介绍矩阵动画之前,先介绍一下两种比特位操作符,位左移操作符(<<)和位右移操作符(>>)
例子如下图:
位左移操作符
位左移操作符,比特位向左移动,右边空出补零。
同理,右移操作符,比特位向右移动,左边空出补零。
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三个数字针脚哦!!!!
喜欢文章,欢迎大家转发!!!