极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 24383|回复: 14

UNO直接驱动LED点阵

[复制链接]
发表于 2012-11-25 10:11:29 | 显示全部楼层 |阅读模式
本帖最后由 ttyp 于 2012-11-25 10:28 编辑

看很多人玩点阵,LZ心痒,也买了一个。可惜没玩过,买错了,买了一个(红绿)双色点阵,有24个脚,而手头也没有2560,UNO端口太少了,后来偶然机会,知道模拟口也可以当作数字口用的,A0-A4对于端口号是14-18.

问题又来了,后来问店主要双色点阵的资料,店主居然说没有,连电压范围参数也没有,唯一知道的就是点阵是共阳的。LZ只能靠万用表一个个测量了,把万用表打到测量二极管一档,黑笔为负,红笔为正,依次测量,送算是测量出来了,如下图:



由于端口不够,绿色的颜色不显眼,于是只接了红色的,绿色弃用!下面是端口连接,图我就不画了。

23-PIN2
22-PIN3
20-PIN4
19-PIN5
17-PIN6
16-PIN7
14-PIN8
13-PIN9

02-PIN10
03-PIN11
05-PIN12
06-PIN13
08-A0
09-A1
11-A2
12-A3

这是代码:

  1. /*
  2. * Show messages on an 8x8 led matrix,
  3. * scrolling from right to left.
  4. *
  5. * Uses FrequencyTimer2 library to
  6. * constantly run an interrupt routine
  7. * at a specified frequency. This
  8. * refreshes the display without the
  9. * main loop having to do anything.
  10. *
  11. */

  12. #include <MsTimer2.h>

  13. #define SPACE { \
  14.     {0, 0, 0, 0, 0, 0, 0, 0},  \
  15.     {0, 0, 0, 0, 0, 0, 0, 0}, \
  16.     {0, 0, 0, 0, 0, 0, 0, 0}, \
  17.     {0, 0, 0, 0, 0, 0, 0, 0}, \
  18.     {0, 0, 0, 0, 0, 0, 0, 0}, \
  19.     {0, 0, 0, 0, 0, 0, 0, 0}, \
  20.     {0, 0, 0, 0, 0, 0, 0, 0}, \
  21.     {0, 0, 0, 0, 0, 0, 0, 0} \
  22. }

  23. #define H { \
  24.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  25.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  26.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  27.     {0, 1, 1, 1, 1, 1, 1, 0}, \
  28.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  29.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  30.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  31.     {0, 1, 0, 0, 0, 0, 1, 0}  \
  32. }

  33. #define E  { \
  34.     {0, 1, 1, 1, 1, 1, 1, 0}, \
  35.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  36.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  37.     {0, 1, 1, 1, 1, 1, 1, 0}, \
  38.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  39.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  40.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  41.     {0, 1, 1, 1, 1, 1, 1, 0}  \
  42. }

  43. #define L { \
  44.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  45.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  46.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  47.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  48.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  49.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  50.     {0, 1, 0, 0, 0, 0, 0, 0}, \
  51.     {0, 1, 1, 1, 1, 1, 1, 0}  \
  52. }

  53. #define O { \
  54.     {0, 0, 0, 1, 1, 0, 0, 0}, \
  55.     {0, 0, 1, 0, 0, 1, 0, 0}, \
  56.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  57.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  58.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  59.     {0, 1, 0, 0, 0, 0, 1, 0}, \
  60.     {0, 0, 1, 0, 0, 1, 0, 0}, \
  61.     {0, 0, 0, 1, 1, 0, 0, 0}  \
  62. }

  63. byte col = 0;
  64. byte leds[8][8];

  65. // pin[xx] on led matrix connected to nn on Arduino (-1 is dummy to make array start at pos 1)
  66. int pins[17]= {17,15,13,11,9,7,5,3,2,4,6,8,10,12,14,16};;


  67. // col[xx] of leds = pin yy on led matrix
  68. int cols[8] = {pins[0], pins[1], pins[2], pins[3], pins[4], pins[5], pins[6], pins[7]};

  69. // row[xx] of leds = pin yy on led matrix
  70. int rows[8] = {pins[8], pins[9], pins[10], pins[11], pins[12], pins[13], pins[14], pins[15]};

  71. const int numPatterns = 6;
  72. byte patterns[numPatterns][8][8] = {
  73.   H,E,L,L,O,SPACE
  74. };

  75. int pattern = 0;

  76. void setup() {
  77.   // sets the pins as output
  78.   for (int i = 0; i < 16; i++) {
  79.     pinMode(pins[i], OUTPUT);
  80.   }

  81.   // set up cols and rows
  82.   for (int i = 1; i <= 8; i++) {
  83.     digitalWrite(cols[i - 1], LOW);
  84.   }

  85.   for (int i = 1; i <= 8; i++) {
  86.     digitalWrite(rows[i - 1], LOW);
  87.   }

  88.   clearLeds();

  89.   MsTimer2::set(1, display); // 500ms period
  90.   MsTimer2::start();

  91.   setPattern(pattern);
  92. }

  93. void loop() {
  94.     pattern = ++pattern % numPatterns;
  95.     slidePattern(pattern, 300);
  96. }

  97. void clearLeds() {
  98.   // Clear display array
  99.   for (int i = 0; i < 8; i++) {
  100.     for (int j = 0; j < 8; j++) {
  101.       leds[i][j] = 0;
  102.     }
  103.   }
  104. }

  105. void setPattern(int pattern) {
  106.   for (int i = 0; i < 8; i++) {
  107.     for (int j = 0; j < 8; j++) {
  108.       leds[i][j] = patterns[pattern][i][j];
  109.     }
  110.   }
  111. }

  112. void slidePattern(int pattern, int del) {
  113.   for (int l = 0; l < 8; l++) {
  114.     for (int i = 0; i < 7; i++) {
  115.       for (int j = 0; j < 8; j++) {
  116.         leds[j][i] = leds[j][i+1];
  117.       }
  118.     }
  119.     for (int j = 0; j < 8; j++) {
  120.       leds[j][7] = patterns[pattern][j][0 + l];
  121.     }
  122.     delay(del);
  123.   }
  124. }

  125. // Interrupt routine
  126. void display() {
  127.   digitalWrite(cols[col], LOW);  // Turn whole previous column off
  128.   col++;
  129.   if (col == 8) {
  130.     col = 0;
  131.   }
  132.   for (int row = 0; row < 8; row++) {
  133.     if (leds[7-col][row] == 1) {
  134.       digitalWrite(rows[row], LOW);  // Turn on this led
  135.     }
  136.     else {
  137.       digitalWrite(rows[row], HIGH); // Turn off this led
  138.     }
  139.   }
  140.   digitalWrite(cols[col], HIGH); // Turn whole column on at once (for equal lighting times)
  141. }
复制代码


这是效果,实际为HELLO向左滚动!!




这是我买的点阵

这是我参考的链接:http://arduino.cc/playground/Main/DirectDriveLEDMatrix
由于它使用的库太老了,我把它使用的定时库改成了mstimer2

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2012-11-25 10:22:10 | 显示全部楼层
800K的图片都无法提交?说上传太大?
回复 支持 反对

使用道具 举报

发表于 2012-11-25 10:24:36 | 显示全部楼层
ttyp 发表于 2012-11-25 10:22
800K的图片都无法提交?说上传太大?

额。。图片限制为400K了~~~
回复 支持 反对

使用道具 举报

发表于 2012-11-25 16:03:43 | 显示全部楼层
点阵屏的教程,论坛还没有呢,顶楼主!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-25 16:27:06 | 显示全部楼层
smfox10 发表于 2012-11-25 16:03
点阵屏的教程,论坛还没有呢,顶楼主!

有的,不过是用芯片驱动的,还有5*5的教程
回复 支持 反对

使用道具 举报

发表于 2012-11-25 16:34:12 | 显示全部楼层
这段时间比较流行点阵屏啊。。。{:soso_e102:}
回复 支持 反对

使用道具 举报

发表于 2012-11-25 18:10:34 | 显示全部楼层
ttyp 发表于 2012-11-25 16:27
有的,不过是用芯片驱动的,还有5*5的教程

我有写595x2驱动点阵。。不过沉了{:3_60:}

http://www.geek-workshop.com/thread-2570-1-1.html
回复 支持 反对

使用道具 举报

发表于 2012-11-26 09:30:04 | 显示全部楼层
点阵屏一般都是用74595芯片或者是DM163或者是....等其他的芯片来专门驱动,直接驱动都IO口太吃力了!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-26 10:03:32 | 显示全部楼层
Randy 发表于 2012-11-26 09:30
点阵屏一般都是用74595芯片或者是DM163或者是....等其他的芯片来专门驱动,直接驱动都IO口太吃力了!

没有芯片只能直驱了,再说用最小系统驱动也不错啊,可以做很多东西,有时还省芯片和布线
回复 支持 反对

使用道具 举报

发表于 2012-11-26 10:10:20 | 显示全部楼层
ttyp 发表于 2012-11-26 10:03
没有芯片只能直驱了,再说用最小系统驱动也不错啊,可以做很多东西,有时还省芯片和布线

在没有其他多余的驱动IC情况下,考虑成本和方便的问题,直驱是OK的,但是这样有时候会很不稳定的哦!做产品的话还是建议选用专驱动IC!DIY的话就无所谓了。爱怎么玩就怎么玩!哈哈!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-26 10:34:20 | 显示全部楼层
Randy 发表于 2012-11-26 10:10
在没有其他多余的驱动IC情况下,考虑成本和方便的问题,直驱是OK的,但是这样有时候会很不稳定的哦!做产 ...

不稳定是指是么?没接限流电阻?开始接了的,亮度很暗,后来听说led打开的时间很短是不会有问题的
回复 支持 反对

使用道具 举报

发表于 2012-11-26 11:03:19 | 显示全部楼层
ttyp 发表于 2012-11-26 10:34
不稳定是指是么?没接限流电阻?开始接了的,亮度很暗,后来听说led打开的时间很短是不会有问题的

开机时和开机后都会有电流波动,而且是直接主控过来的。接不接都没什么,我说了不是产品考虑的不多,能用就好!哈哈!
回复 支持 反对

使用道具 举报

发表于 2012-11-26 23:15:12 | 显示全部楼层
“由于它使用的库太老了,我把它使用的定时库改成了mstimer2”  请教楼住这句话意思
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-27 08:54:08 | 显示全部楼层
jinhao 发表于 2012-11-26 23:15
“由于它使用的库太老了,我把它使用的定时库改成了mstimer2”  请教楼住这句话意思

就是换了一个定时库啊,原链接的库太老了,1.0.2上编译不通过
回复 支持 反对

使用道具 举报

发表于 2013-4-22 16:14:11 | 显示全部楼层
我使用了您的程序 显示错误
sketch_apr22c.cpp: In function 'void setup()':
sketch_apr22c:32: error: 'MsTimer2' has not been declared
sketch_apr22c:33: error: 'MsTimer2' has not been declared
是怎么回事啊 本人菜鸟 急需这方面的知识 求高手加我QQ670096828  指导我下  感激不尽
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-5-14 10:07 , Processed in 0.045955 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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