yangqiang29 发表于 2013-1-10 20:52:21

Arduino最小系统驱动5*5 LED 点阵

一、目的:
功能:5*5点阵驱动,间隔2秒,循环显示数字0至9。
二、硬件:
1、最小系统ATMEGA-328P UNO
2、5*5点阵
3、220欧电阻*10
三、电路连接

点阵引脚接线
行:连接7,8,9,10,11
列:连接2,3,4,5,6

注:经过实验发现,此模块为共阴极,当行为LOW,列为HIGH时,LED点亮。
四、点阵相关知识:
共阴的,就是led的负极接在一起,靠分别控制led的正极来点亮模块或数码管
共阳的,就是led的正极接在一起,靠分别控制led的负极来点亮模块或数码管

五、实验效果



六、代码
/*
日期:2013-1-10
功能:5*5点阵驱动,间隔2秒,显示数字0至9。
作者:YQ
IDE:1.0.2
硬件:最小系统UNO

*/
//定义数字0-9的字库
const int NUM_1={{0,0,1,0,0},{0,0,1,1,0},{0,0,1,0,0},{0,0,1,0,0},{0,1,1,1,0}};
const int NUM_2={{0,1,1,1,0},{0,1,0,0,0},{0,1,1,1,0},{0,0,0,1,0},{0,1,1,1,0}};
const int NUM_3={{0,1,1,1,0},{0,1,0,0,0},{0,1,1,1,0},{0,1,0,0,0},{0,1,1,1,0}};
const int NUM_4={{0,1,0,1,0},{0,1,0,1,0},{0,1,1,1,0},{0,1,0,0,0},{0,1,0,0,0}};
const int NUM_5={{0,1,1,1,0},{0,0,0,1,0},{0,1,1,1,0},{0,1,0,0,0},{0,1,1,1,0}};
const int NUM_6={{0,1,1,1,0},{0,0,0,1,0},{0,1,1,1,0},{0,1,0,1,0},{0,1,1,1,0}};
const int NUM_7={{0,1,1,1,0},{0,1,0,0,0},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,0,0}};
const int NUM_8={{0,1,1,1,0},{0,1,0,1,0},{0,1,1,1,0},{0,1,0,1,0},{0,1,1,1,0}};
const int NUM_9={{0,1,1,1,0},{0,1,0,1,0},{0,1,1,1,0},{0,1,0,0,0},{0,1,1,1,0}};
const int NUM_0={{0,1,1,1,0},{0,1,0,1,0},{0,1,0,1,0},{0,1,0,1,0},{0,1,1,1,0}};


const int col={2,3,4,5,6};//定义列
const int row={7,8,9,10,11};//定义行

//存储点阵的像素点
int pixels;

int lastTime;
int flag=1;
void setup()
{
for(int thisPin=0;thisPin<5;thisPin++)
{
    pinMode(row,OUTPUT);
    pinMode(col,OUTPUT);
   
    digitalWrite(row,HIGH);
}
lastTime=millis();
memcpy(pixels,NUM_1,sizeof(NUM_1));
}

void loop()
{
refreshScreen();
int currentTime=millis();

//间隔2秒,循环将0-9的字库装入点阵的像素中
if(currentTime-lastTime==2000)
{
    switch(flag%10)
    {
      case 0:
          memcpy(pixels,NUM_0,sizeof(NUM_0));
          break;
      case 1:
          memcpy(pixels,NUM_1,sizeof(NUM_1));
          break;
      case 2:
          memcpy(pixels,NUM_2,sizeof(NUM_2));
          break;
      case 3:
          memcpy(pixels,NUM_3,sizeof(NUM_3));
          break;
      case 4:
          memcpy(pixels,NUM_4,sizeof(NUM_4));
          break;
      case 5:
          memcpy(pixels,NUM_5,sizeof(NUM_5));
          break;
      case 6:
          memcpy(pixels,NUM_6,sizeof(NUM_6));
          break;
      case 7:
          memcpy(pixels,NUM_7,sizeof(NUM_7));
          break;
      case 8:
          memcpy(pixels,NUM_8,sizeof(NUM_8));
          break;
      case 9:
          memcpy(pixels,NUM_9,sizeof(NUM_9));
          break;
      default:break;
    }
    lastTime=currentTime;
    flag++;
}
}
//根据pixels内容不停刷新点阵
void refreshScreen()
{
   for(int i=0;i<5;i++)
{
   digitalWrite(row , LOW);
   for(int j=0;j<5;j++)
   {
      int thisPixels = pixels;
      digitalWrite(col , thisPixels);
      if(thisPixels==HIGH)
      {
            digitalWrite(col,LOW);
      }
      }
      digitalWrite(row,HIGH);
    }
}

arduino-ice 发表于 2013-1-10 21:03:12

沙发!!!

小猪会轮滑 发表于 2013-1-10 21:47:12

:lol:lol:lol:lol:lol:lol:lol强子送我的5*5还没动.....放假了玩

Randy 发表于 2013-1-11 09:09:07

好教程,实用,顶一个!

幻生幻灭 发表于 2013-1-11 19:47:43

Arduino直驱的

不过代码好像不完整。 memcpy()没有定义吧

yangqiang29 发表于 2013-1-11 19:54:37

幻生幻灭 发表于 2013-1-11 19:47 static/image/common/back.gif
Arduino直驱的

不过代码好像不完整。 memcpy()没有定义吧

memcpy()是内存操作函数,不用定义,代码我在IDE1.0.2上已经编译通过了,可以直接使用。

jack4904 发表于 2013-1-12 07:17:17

原來有這函數能用阿, 學習了!
找了一下資料,memcpy()是屬於string.h 的函數, 類似 strncpy()
功用是從某一段記憶體複製 n 個字元到另一段記憶體。

禅轩 发表于 2013-1-13 09:15:45

const int NUM_1={{0,0,1,0,0},{0,0,1,1,0},{0,0,1,0,0},{0,0,1,0,0},{0,1,1,1,0}};第二个数组不该是、{0,0,1,0,0},么为啥是这个{0,0,1,1,0},

禅轩 发表于 2013-1-13 09:22:31

禅轩 发表于 2013-1-13 09:15 static/image/common/back.gif
const int NUM_1={{0,0,1,0,0},{0,0,1,1,0},{0,0,1,0,0},{0,0,1,0,0},{0,1,1,1,0}};第二个数组不该是 ...

- -!我错了。刚才弄了下 才发现为啥。

yangqiang29 发表于 2013-1-14 10:03:52

呵呵,被你发现了。

arduino_ykk 发表于 2013-5-22 05:28:17

驱动写得好!

arduino_ykk 发表于 2013-5-22 19:40:13

再膜拜一下,驱动写得如此漂亮!

马甲一号 发表于 2014-5-28 16:24:04

很好,没玩过点阵,有空也玩玩。

傻傻玩偶 发表于 2014-7-1 15:51:19

直接用arduino驱动的话是不是就不能用delay函数了啊,是不是用了delay函数之后就只能显示出一个点,不能显示一组点了啊。

FredKhoo 发表于 2014-12-22 14:38:15

我想问一下你最小系统上的复位键(reset键)是怎么接的,接RST引脚和GND吗?
页: [1] 2
查看完整版本: Arduino最小系统驱动5*5 LED 点阵