请问一个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);
}
} 可能是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/ 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.
此处说明了,循环里的不会提速,我也试了,没有改进,所以不知道该用什么方法了 windseeker 发表于 2013-7-16 22:25 static/image/common/back.gif
多谢大大指点,但是我仔细看了看的描述:
This library consists of a complex header file that transl ...
原来还有这回事,我没注意到。谢谢你提醒 smching 发表于 2013-7-17 18:49 static/image/common/back.gif
原来还有这回事,我没注意到。谢谢你提醒
如您所教,直接写入寄存器会快很多,但是我不知道怎么写代码,能提示我一下吗?多谢 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]