windseeker 发表于 2013-7-16 16:48:28

请问一个LED点阵的问题

本帖最后由 windseeker 于 2013-7-16 16:50 编辑

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

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

如下代码:
int g1 = 10;
    int g2 = 9;
    int lt = 7;
    int sk = 8;
    int pa=2;
    int pb=3;
    int pc=4;
    int pd=5;
    int en=13;
    int r1=12;
    int r2=11;
   
    unsigned char g={
      {0xFF,0xFF,0xFF,0xFF,0xC0,0x03,0xDF,0xFB,0xDF,0xFB,0xC0,0x1B,0xFF,0xDB,0xFF,0xDB,
0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xC0,0x1B,0xDF,0xFB,},
      {0xFF,0xFF,0xFF,0xFF,0x00,0x0F,0x7F,0xEF,0x7F,0xEF,0x60,0x6F,0x6F,0x6C,0x6F,0x6D,
0x6F,0x6D,0x6F,0x6C,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,},
      {0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0xF7,0xFE,0xF7,0xFE,0xF0,0x06,0x3F,0xF6,0xBF,0xF6,
0xBF,0xF6,0x3F,0xF6,0xFF,0xF6,0xFF,0xF6,0xFF,0xF6,0xFF,0xF6,0xF0,0x06,0xF7,0xFE, },
    {0xFF,0xFF,0xFF,0xFF,0xC0,0x03,0xDF,0xFB,0xDF,0xFB,0xD8,0x03,0xDB,0xFF,0xDB,0xFF,
0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xD8,0x03,0xDF,0xFB, },
{0xDF,0xFB,0xDC,0x03,0xDD,0xFF,0xDD,0xFF,0xDD,0xFF,0xDD,0xFF,0xDD,0xFF,0xDD,0xFF,
0xDD,0xFF,0xDD,0xFF,0xDC,0x03,0xDF,0xFB,0xDF,0xFB,0xC0,0x03,0xFF,0xFF,0xFF,0xFF,},
{0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6F,0x6C,0x6F,0x6D,
0x6F,0x6D,0x6F,0x6C,0x60,0x6F,0x7F,0xEF,0x7F,0xEF,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,},
{0xF7,0xFE,0xF0,0x06,0xFF,0xF6,0xFF,0xF6,0xFF,0xF6,0xFF,0xF6,0x3F,0xF6,0xBF,0xF6,
0xBF,0xF6,0x3F,0xF6,0xF0,0x06,0xF7,0xFE,0xF7,0xFE,0xF0,0x00,0xFF,0xFF,0xFF,0xFF,},
{0xDF,0xFB,0xC0,0x1B,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,0xFF,0xDB,
0xFF,0xDB,0xFF,0xDB,0xC0,0x1B,0xDF,0xFB,0xDF,0xFB,0xC0,0x03,0xFF,0xFF,0xFF,0xFF,},      
    };
   
    unsigned char num={
    {0xC7,0xBB,0xB3,0xAB,0x9B,0xBB,0xC7,0xFF,}, /* 1 */
    {0xEF,0xCF,0xEF,0xEF,0xEF,0xEF,0xC7,0xFF,}, /* 2 */
    {0xFF,0xC3,0xDB,0xE7,0xDB,0xDB,0xE3,0xFF,}, /* 3 */
    {0xFF,0xC3,0xDB,0xE7,0xDB,0xDB,0xE3,0xFF,}, /* 4 */
    {0xFF,0xC3,0xDB,0xE7,0xDB,0xDB,0xE3,0xFF,}, /* 5 */
    {0xFF,0xC3,0xDB,0xE7,0xDB,0xDB,0xE3,0xFF,}, /* 6 */
    {0xFF,0xC3,0xDB,0xE7,0xDB,0xDB,0xE3,0xFF,}, /* 7 */
    {0xFF,0xC3,0xDB,0xE7,0xDB,0xDB,0xE3,0xFF,}, /* 8 */
    };
   
   
    unsigned char b[]={
      {    0,0,0,0      },
      {    1,0,0,0      },
      {    0,1,0,0      },
      {    1,1,0,0      },
      {    0,0,1,0      },
      {    1,0,1,0      },
      {    0,1,1,0      },
      {    1,1,1,0      },
      {    0,0,0,1      },
      {    1,0,0,1      },
      {    0,1,0,1      },
      {    1,1,0,1      },
      {    0,0,1,1      },
      {    1,0,1,1      },
      {    0,1,1,1      },
      {    1,1,1,1      }
    };
   
    void setup ()
    {
      pinMode(r1,OUTPUT);
      pinMode(r2,OUTPUT);
      pinMode(g1,OUTPUT);
      pinMode(g2,OUTPUT);
      pinMode(lt,OUTPUT);
      pinMode(sk,OUTPUT);
      pinMode(pa,OUTPUT);
      pinMode(pb,OUTPUT);
      pinMode(pc,OUTPUT);
      pinMode(pd,OUTPUT);
      pinMode(en,OUTPUT);
      digitalWrite(en,HIGH);
      digitalWrite(g1,HIGH);
      digitalWrite(g2,HIGH);
      digitalWrite(r1,HIGH);
      digitalWrite(r2,HIGH);
    }
    void loop()
    {
      unsigned char a=0;
      for(a=0; a<16;a++)
      {
      
      shiftOut(g1,sk,MSBFIRST,g);
      shiftOut(g1,sk,MSBFIRST,g);
      shiftOut(g1,sk,MSBFIRST,g);
      shiftOut(g1,sk,MSBFIRST,g);
      shiftOut(g1,sk,MSBFIRST,g);
      shiftOut(g1,sk,MSBFIRST,g);
      shiftOut(g1,sk,MSBFIRST,g);
      shiftOut(g1,sk,MSBFIRST,g);
      
      
      digitalWrite(lt,HIGH);
      
      digitalWrite(pa,b);
      digitalWrite(pb,b);
      digitalWrite(pc,b);
      digitalWrite(pd,b);
   
      digitalWrite(lt,LOW);
               
      }
      
    for(a=0; a<16;a++)
      {
      
      shiftOut(g2,sk,MSBFIRST,g);
      shiftOut(g2,sk,MSBFIRST,g);
      shiftOut(g2,sk,MSBFIRST,g);
      shiftOut(g2,sk,MSBFIRST,g);
      shiftOut(g2,sk,MSBFIRST,g);
      shiftOut(g2,sk,MSBFIRST,g);
      shiftOut(g2,sk,MSBFIRST,g);
      shiftOut(g2,sk,MSBFIRST,g);
      
      
      digitalWrite(lt,HIGH);
      
      digitalWrite(pa,b);
      digitalWrite(pb,b);
      digitalWrite(pc,b);
      digitalWrite(pd,b);
   
      digitalWrite(lt,LOW);
               
      }
    }

smching 发表于 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/08/18/ready-set-oscillate-the-fastest-way-to-change-arduino-pins/

windseeker 发表于 2013-7-16 22:25:29

smching 发表于 2013-7-16 19:54 static/image/common/back.gif
可能是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.
此处说明了,循环里的不会提速,我也试了,没有改进,所以不知道该用什么方法了

smching 发表于 2013-7-17 18:49:43

windseeker 发表于 2013-7-16 22:25 static/image/common/back.gif
多谢大大指点,但是我仔细看了看的描述:
This library consists of a complex header file that transl ...

原来还有这回事,我没注意到。谢谢你提醒

windseeker 发表于 2013-7-17 22:20:13

smching 发表于 2013-7-17 18:49 static/image/common/back.gif
原来还有这回事,我没注意到。谢谢你提醒

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

smching 发表于 2013-8-1 22:53:53

windseeker 发表于 2013-7-17 22:20 static/image/common/back.gif
如您所教,直接写入寄存器会快很多,但是我不知道怎么写代码,能提示我一下吗?多谢

我暂时也找不到更好的方法
都必须使用or,nor,xor,and等来完成。
例:
for (int z=0; z<10; z++)
{
    PORTD = e;
    PORTD = ~e;
}
页: [1]
查看完整版本: 请问一个LED点阵的问题