本文为大大维原创,最早于博客园发表,转载请注明出处!!!
一、前言:
随着LED的普及,以LED点阵为基础的显示设置层出不穷。例如,公交车的线路提示牌、高速公路的信息提示牌,安装在大楼上的广告屏幕等。下面,我们将由简单到复杂地探索各种LED点阵的使用方法,同样是基于Proteus的arduino仿真,以arduino uno R3为例,包含以下三个实验:LED点阵显示表情、LED点阵跑马灯、回纹灯。具体介绍如下:
二、仿真电路设计:
本次的三个实验用到的电路连接都是相同的,构建一个电路仿真图即可,仿真图如下:
电路图比较简单,只需将arduino最小系统引入,并将LED点阵接入arduino各口即可。用到的元器件有:ATMEGA328P、MATRIX-8*8点阵(颜色随自己喜好选择即可)、电阻、晶振、电容(同上文的最小电路构造)。
三、实验代码及仿真演示
1. LED点阵显示表情:
A、实验代码如下:
#define L1 0
#define L2 1
#define L3 2
#define L4 3
#define L5 4
#define L6 5
#define L7 6
#define L8 7
#define R1 8
#define R2 9
#define R3 10
#define R4 11
#define R5 12
#define R6 13
#define R7 14
#define R8 15
void lighten(int line,int row,int time){
pinMode(line,OUTPUT);
pinMode(row,OUTPUT);
digitalWrite(line,HIGH);
digitalWrite(row,LOW);
delay(time);
digitalWrite(line,LOW);
digitalWrite(row,HIGH);
}
int ledCoord[][2]={
{L3,R2},{L3,R3},{L3,R6},{L3,R7},
{L4,R2},{L4,R3},{L4,R6},{L4,R7},
{L6,R2},{L6,R7},
{L7,R3},{L7,R4},{L7,R5},{L7,R6}};
int leds=sizeof(ledCoord)/sizeof(ledCoord[0]);
int i=0;
void setup(){
}
void loop(){
lighten(ledCoord[i][0],ledCoord[i][1],1);
i++;
if(i>=leds) i=0;
}
B、仿真演示如下:
LED点阵屏上显示出一个笑脸。
2.LED点阵跑马灯:
A、实验代码如下:
#define L1 0
#define L2 1
#define L3 2
#define L4 3
#define L5 4
#define L6 5
#define L7 6
#define L8 7
#define R1 8
#define R2 9
#define R3 10
#define R4 11
#define R5 12
#define R6 13
#define R7 14
#define R8 15
void lighten(int line,int row,int time){
pinMode(line,OUTPUT);
pinMode(row,OUTPUT);
digitalWrite(line,HIGH);
digitalWrite(row,LOW);
delay(time);
digitalWrite(line,LOW);
digitalWrite(row,HIGH);
}
void setup(){
}
void loop(){
for(int i=L1;i<=L8;i++){
for(int j=R1;j<=R8;j++)
lighten(i,j,500);
}
}
B、仿真演示如下:
在LED点阵上,亮点从左向右,从上向下遍历。
3.回纹灯
A、实验代码如下:
#define L1 0
#define L2 1
#define L3 2
#define L4 3
#define L5 4
#define L6 5
#define L7 6
#define L8 7
#define R1 8
#define R2 9
#define R3 10
#define R4 11
#define R5 12
#define R6 13
#define R7 14
#define R8 15
void lighten(int line,int row,int time){
pinMode(line,OUTPUT);
pinMode(row,OUTPUT);
digitalWrite(line,HIGH);
digitalWrite(row,LOW);
delay(time);
digitalWrite(line,LOW);
digitalWrite(row,HIGH);
}
void setup(){
}
void loop(){
for(int z=0;z<9;z++){
for(int i=0;i<8-2*z;i++)
lighten(L1+z,R1+i+z,50);
for(int i=1;i<8-2*z;i++)
lighten(L1+i+z,R8-z,50);
for(int i=1;i<8-2*z;i++)
lighten(L8-z,R8-i-z,50);
for(int i=1;i<7-2*z;i++)
lighten(L8-i-z,R1+z,50);
}
}
B、仿真演示如下:
亮点循环向中间靠拢。
四、文章中用到的电路图及代码:
http://files.cnblogs.com/files/liujw2114/LED%E7%82%B9%E9%98%B5A.7z