极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11157|回复: 5

请问一个LED点阵的问题

[复制链接]
发表于 2013-7-16 16:48:28 | 显示全部楼层 |阅读模式
本帖最后由 windseeker 于 2013-7-16 16:50 编辑

看了论坛一个大哥的帖子后,我也尝试用2560驱动了一个08接口的64X32的点阵,打算做个时钟玩玩,但是现在发现点阵屏闪的非常 厉害,请各位大哥瞧瞧咋回事。

症状为,当只驱动部分点阵时就比较好,当驱动整个屏时就非常闪,因为2560的晶振时16m的,是不是这个晶振不够啊,能更换为更高频率的不。

如下代码:
  1.   int g1 = 10;
  2.     int g2 = 9;
  3.     int lt = 7;
  4.     int sk = 8;
  5.     int pa=2;
  6.     int pb=3;
  7.     int pc=4;
  8.     int pd=5;
  9.     int en=13;
  10.     int r1=12;
  11.     int r2=11;
  12.      
  13.     unsigned char g[8][32]={
  14.       {0xFF,0xFF,0xFF,0xFF,0xC0,0x03,0xDF,0xFB,0xDF,0xFB,0xC0,0x1B,0xFF,0xDB,0xFF,0xDB,
  15. 0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xC0,0x1B,0xDF,0xFB,},
  16.       {0xFF,0xFF,0xFF,0xFF,0x00,0x0F,0x7F,0xEF,0x7F,0xEF,0x60,0x6F,0x6F,0x6C,0x6F,0x6D,
  17. 0x6F,0x6D,0x6F,0x6C,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,},
  18.       {0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0xF7,0xFE,0xF7,0xFE,0xF0,0x06,0x3F,0xF6,0xBF,0xF6,
  19. 0xBF,0xF6,0x3F,0xF6,0xFF,0xF6,0xFF,0xF6,0xFF,0xF6,0xFF,0xF6,0xF0,0x06,0xF7,0xFE, },
  20.     {0xFF,0xFF,0xFF,0xFF,0xC0,0x03,0xDF,0xFB,0xDF,0xFB,0xD8,0x03,0xDB,0xFF,0xDB,0xFF,
  21. 0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xD8,0x03,0xDF,0xFB, },
  22. {0xDF,0xFB,0xDC,0x03,0xDD,0xFF,0xDD,0xFF,0xDD,0xFF,0xDD,0xFF,0xDD,0xFF,0xDD,0xFF,
  23. 0xDD,0xFF,0xDD,0xFF,0xDC,0x03,0xDF,0xFB,0xDF,0xFB,0xC0,0x03,0xFF,0xFF,0xFF,0xFF,},
  24. {0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6C,0x6F,0x6D,
  25. 0x6F,0x6D,0x6F,0x6C,0x60,0x6F,0x7F,0xEF,0x7F,0xEF,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,},
  26. {0xF7,0xFE,0xF0,0x06,0xFF,0xF6,0xFF,0xF6,0xFF,0xF6,0xFF,0xF6,0x3F,0xF6,0xBF,0xF6,
  27. 0xBF,0xF6,0x3F,0xF6,0xF0,0x06,0xF7,0xFE,0xF7,0xFE,0xF0,0x00,0xFF,0xFF,0xFF,0xFF,},
  28. {0xDF,0xFB,0xC0,0x1B,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,
  29. 0xFF,0xDB,0xFF,0xDB,0xC0,0x1B,0xDF,0xFB,0xDF,0xFB,0xC0,0x03,0xFF,0xFF,0xFF,0xFF,},      
  30.     };
  31.    
  32.     unsigned char num[8][8]={
  33.     {0xC7,0xBB,0xB3,0xAB,0x9B,0xBB,0xC7,0xFF,}, /* 1 */
  34.     {0xEF,0xCF,0xEF,0xEF,0xEF,0xEF,0xC7,0xFF,}, /* 2 */
  35.     {0xFF,0xC3,0xDB,0xE7,0xDB,0xDB,0xE3,0xFF,}, /* 3 */
  36.     {0xFF,0xC3,0xDB,0xE7,0xDB,0xDB,0xE3,0xFF,}, /* 4 */
  37.     {0xFF,0xC3,0xDB,0xE7,0xDB,0xDB,0xE3,0xFF,}, /* 5 */
  38.     {0xFF,0xC3,0xDB,0xE7,0xDB,0xDB,0xE3,0xFF,}, /* 6 */
  39.     {0xFF,0xC3,0xDB,0xE7,0xDB,0xDB,0xE3,0xFF,}, /* 7 */
  40.     {0xFF,0xC3,0xDB,0xE7,0xDB,0xDB,0xE3,0xFF,}, /* 8 */  
  41.     };
  42.    
  43.    
  44.     unsigned char b[][4]={
  45.       {    0,0,0,0        }  ,
  46.       {    1,0,0,0        }  ,
  47.       {    0,1,0,0        }  ,
  48.       {    1,1,0,0        }  ,
  49.       {    0,0,1,0        }  ,
  50.       {    1,0,1,0        }  ,
  51.       {    0,1,1,0        }  ,
  52.       {    1,1,1,0        }  ,
  53.       {    0,0,0,1        }  ,
  54.       {    1,0,0,1        }  ,
  55.       {    0,1,0,1        }  ,
  56.       {    1,1,0,1        }  ,
  57.       {    0,0,1,1        }  ,
  58.       {    1,0,1,1        }  ,
  59.       {    0,1,1,1        }  ,
  60.       {    1,1,1,1        }
  61.     };
  62.      
  63.     void setup ()
  64.     {
  65.       pinMode(r1,OUTPUT);
  66.       pinMode(r2,OUTPUT);
  67.       pinMode(g1,OUTPUT);
  68.       pinMode(g2,OUTPUT);
  69.       pinMode(lt,OUTPUT);
  70.       pinMode(sk,OUTPUT);
  71.       pinMode(pa,OUTPUT);
  72.       pinMode(pb,OUTPUT);
  73.       pinMode(pc,OUTPUT);
  74.       pinMode(pd,OUTPUT);
  75.       pinMode(en,OUTPUT);
  76.       digitalWrite(en,HIGH);
  77.       digitalWrite(g1,HIGH);
  78.       digitalWrite(g2,HIGH);
  79.       digitalWrite(r1,HIGH);
  80.       digitalWrite(r2,HIGH);
  81.     }
  82.     void loop()
  83.     {
  84.       unsigned char a=0;
  85.       for(a=0; a<16;a++)
  86.       {
  87.         
  88.         shiftOut(g1,sk,MSBFIRST,g[0][a*2]);
  89.         shiftOut(g1,sk,MSBFIRST,g[0][a*2+1]);
  90.         shiftOut(g1,sk,MSBFIRST,g[1][a*2]);
  91.         shiftOut(g1,sk,MSBFIRST,g[1][a*2+1]);
  92.         shiftOut(g1,sk,MSBFIRST,g[2][a*2]);
  93.         shiftOut(g1,sk,MSBFIRST,g[2][a*2+1]);
  94.         shiftOut(g1,sk,MSBFIRST,g[3][a*2]);
  95.         shiftOut(g1,sk,MSBFIRST,g[3][a*2+1]);
  96.         
  97.         
  98.         digitalWrite(lt,HIGH);  
  99.         
  100.         digitalWrite(pa,b[a][0]);
  101.         digitalWrite(pb,b[a][1]);
  102.         digitalWrite(pc,b[a][2]);
  103.         digitalWrite(pd,b[a][3]);
  104.      
  105.         digitalWrite(lt,LOW);
  106.                
  107.       }
  108.       
  109.     for(a=0; a<16;a++)
  110.       {
  111.         
  112.         shiftOut(g2,sk,MSBFIRST,g[4][a*2]);
  113.         shiftOut(g2,sk,MSBFIRST,g[4][a*2+1]);
  114.         shiftOut(g2,sk,MSBFIRST,g[5][a*2]);
  115.         shiftOut(g2,sk,MSBFIRST,g[5][a*2+1]);
  116.         shiftOut(g2,sk,MSBFIRST,g[6][a*2]);
  117.         shiftOut(g2,sk,MSBFIRST,g[6][a*2+1]);
  118.         shiftOut(g2,sk,MSBFIRST,g[7][a*2]);
  119.         shiftOut(g2,sk,MSBFIRST,g[7][a*2+1]);
  120.         
  121.         
  122.         digitalWrite(lt,HIGH);  
  123.         
  124.         digitalWrite(pa,b[a][0]);
  125.         digitalWrite(pb,b[a][1]);
  126.         digitalWrite(pc,b[a][2]);
  127.         digitalWrite(pd,b[a][3]);
  128.      
  129.         digitalWrite(lt,LOW);
  130.                
  131.       }
  132.     }
复制代码
回复

使用道具 举报

发表于 2013-7-16 19:54:00 | 显示全部楼层
可能是digitalwrite引起的,因为digitalwrite的速度很慢。
直接写入寄存器会快很多
http://code.google.com/p/digitalwritefast/
http://www.skpang.co.uk/blog/archives/323
http://www.billporter.info/2010/ ... hange-arduino-pins/

评分

参与人数 1 +1 收起 理由
幻生幻灭 + 1 赞一个!

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-16 22:25:29 | 显示全部楼层
smching 发表于 2013-7-16 19:54
可能是digitalwrite引起的,因为digitalwrite的速度很慢。
直接写入寄存器会快很多
http://code.google.c ...

多谢大大指点,但是我仔细看了看的描述:
This library consists of a complex header file that translates digitalWriteFast, pinModeFast, digitalReadFast into the corresponding PORT commands. It provides syntax that is as novice-friendly as the arduino's pin manipulation commands but an order of magnitude faster. It can speed things up when the pin number is known at compile time, so that digitalWrite(9,HIGH); is speeded up. On the other hand a loop with digitalWrite(i,HIGH); or a called function with the pin number as a passed argument will not be faster.
此处说明了,循环里的不会提速,我也试了,没有改进,所以不知道该用什么方法了
回复 支持 反对

使用道具 举报

发表于 2013-7-17 18:49:43 | 显示全部楼层
windseeker 发表于 2013-7-16 22:25
多谢大大指点,但是我仔细看了看的描述:
This library consists of a complex header file that transl ...

原来还有这回事,我没注意到。谢谢你提醒
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-17 22:20:13 | 显示全部楼层
smching 发表于 2013-7-17 18:49
原来还有这回事,我没注意到。谢谢你提醒

如您所教,直接写入寄存器会快很多,但是我不知道怎么写代码,能提示我一下吗?多谢
回复 支持 反对

使用道具 举报

发表于 2013-8-1 22:53:53 | 显示全部楼层
windseeker 发表于 2013-7-17 22:20
如您所教,直接写入寄存器会快很多,但是我不知道怎么写代码,能提示我一下吗?多谢

我暂时也找不到更好的方法
都必须使用or,nor,xor,and等来完成。
例:
for (int z=0; z<10; z++)
  {
    PORTD = e;
    PORTD = ~e;
  }
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-5-2 11:29 , Processed in 0.040392 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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