极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 27264|回复: 17

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

[复制链接]
发表于 2013-1-10 20:52:21 | 显示全部楼层 |阅读模式
一、目的:
功能: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的负极来点亮模块或数码管

五、实验效果



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

  7. */
  8. //定义数字0-9的字库
  9. const int NUM_1[5][5]={{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}};
  10. const int NUM_2[5][5]={{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}};
  11. const int NUM_3[5][5]={{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}};
  12. const int NUM_4[5][5]={{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}};
  13. const int NUM_5[5][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}};
  14. const int NUM_6[5][5]={{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}};
  15. const int NUM_7[5][5]={{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}};
  16. const int NUM_8[5][5]={{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}};
  17. const int NUM_9[5][5]={{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}};
  18. const int NUM_0[5][5]={{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}};


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

  21. //存储点阵的像素点
  22. int pixels[5][5];

  23. int lastTime;
  24. int flag=1;
  25. void setup()
  26. {
  27.   for(int thisPin=0;thisPin<5;thisPin++)
  28.   {
  29.     pinMode(row[thisPin],OUTPUT);
  30.     pinMode(col[thisPin],OUTPUT);
  31.    
  32.     digitalWrite(row[thisPin],HIGH);
  33.   }
  34.   lastTime=millis();
  35.   memcpy(pixels,NUM_1,sizeof(NUM_1));
  36. }

  37. void loop()
  38. {
  39.   refreshScreen();
  40.   int currentTime=millis();
  41.   
  42.   //间隔2秒,循环将0-9的字库装入点阵的像素中
  43.   if(currentTime-lastTime==2000)
  44.   {
  45.     switch(flag%10)
  46.     {
  47.       case 0:
  48.           memcpy(pixels,NUM_0,sizeof(NUM_0));
  49.           break;
  50.       case 1:
  51.           memcpy(pixels,NUM_1,sizeof(NUM_1));
  52.           break;
  53.       case 2:
  54.           memcpy(pixels,NUM_2,sizeof(NUM_2));
  55.           break;
  56.       case 3:
  57.           memcpy(pixels,NUM_3,sizeof(NUM_3));
  58.           break;
  59.       case 4:
  60.           memcpy(pixels,NUM_4,sizeof(NUM_4));
  61.           break;
  62.       case 5:
  63.           memcpy(pixels,NUM_5,sizeof(NUM_5));
  64.           break;
  65.       case 6:
  66.           memcpy(pixels,NUM_6,sizeof(NUM_6));
  67.           break;
  68.       case 7:
  69.           memcpy(pixels,NUM_7,sizeof(NUM_7));
  70.           break;
  71.       case 8:
  72.           memcpy(pixels,NUM_8,sizeof(NUM_8));
  73.           break;
  74.       case 9:
  75.           memcpy(pixels,NUM_9,sizeof(NUM_9));
  76.           break;
  77.       default:break;
  78.     }
  79.     lastTime=currentTime;
  80.     flag++;
  81.   }
  82. }
  83. //根据pixels内容不停刷新点阵
  84. void refreshScreen()
  85. {
  86.    for(int i=0;i<5;i++)
  87.   {
  88.      digitalWrite(row[i] , LOW);
  89.      for(int j=0;j<5;j++)
  90.      {
  91.         int thisPixels = pixels[i][j];
  92.         digitalWrite(col[j] , thisPixels);
  93.         if(thisPixels==HIGH)
  94.         {
  95.             digitalWrite(col[j],LOW);
  96.         }
  97.       }
  98.       digitalWrite(row[i],HIGH);
  99.     }
  100. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-1-10 21:03:12 来自手机 | 显示全部楼层
沙发!!!
回复 支持 反对

使用道具 举报

发表于 2013-1-10 21:47:12 | 显示全部楼层
强子送我的5*5还没动.....放假了玩
回复 支持 反对

使用道具 举报

发表于 2013-1-11 09:09:07 | 显示全部楼层
好教程,实用,顶一个!
回复 支持 反对

使用道具 举报

发表于 2013-1-11 19:47:43 | 显示全部楼层
Arduino直驱的

不过代码好像不完整。 memcpy()没有定义吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-1-11 19:54:37 | 显示全部楼层
幻生幻灭 发表于 2013-1-11 19:47
Arduino直驱的

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

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

使用道具 举报

发表于 2013-1-12 07:17:17 | 显示全部楼层
原來有這函數能用阿, 學習了!
找了一下資料,  memcpy()是屬於string.h 的函數, 類似 strncpy()
功用是從某一段記憶體複製 n 個字元到另一段記憶體。
回复 支持 反对

使用道具 举报

发表于 2013-1-13 09:15:45 | 显示全部楼层
const int NUM_1[5][5]={{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
const int NUM_1[5][5]={{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}};第二个数组不该是 ...

- -!我错了。刚才弄了下 才发现为啥。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-1-14 10:03:52 | 显示全部楼层
呵呵,被你发现了。
回复 支持 反对

使用道具 举报

发表于 2013-5-22 05:28:17 | 显示全部楼层
驱动写得好!
回复 支持 反对

使用道具 举报

发表于 2013-5-22 19:40:13 | 显示全部楼层
再膜拜一下,驱动写得如此漂亮!
回复 支持 反对

使用道具 举报

发表于 2014-5-28 16:24:04 | 显示全部楼层
很好,没玩过点阵,有空也玩玩。
回复 支持 反对

使用道具 举报

发表于 2014-7-1 15:51:19 | 显示全部楼层
直接用arduino驱动的话是不是就不能用delay函数了啊,是不是用了delay函数之后就只能显示出一个点,不能显示一组点了啊。
回复 支持 反对

使用道具 举报

发表于 2014-12-22 14:38:15 | 显示全部楼层
我想问一下你最小系统上的复位键(reset键)是怎么接的,接RST引脚和GND吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 02:26 , Processed in 0.044196 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表