关于点阵的问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5621|回复: 7

[已解决] 关于点阵的问题

[复制链接]
发表于 2013-1-4 12:17 | 显示全部楼层 |阅读模式
本帖最后由 珜羽 于 2013-1-6 10:40 编辑

// 正极
int y5=6;
int y4=5;
int y3=4;
int y2=3;
int y1=2;

//负极
int x1=8;
int x2=9;
int x3=10;
int x4=11;
int x5=12;

/*int iloveu[]={B11111,B11111,B11111,B11111,B11111,
             B10101,B00000,B00000,B10001,B11011,
             B10001,B11011,B11011,B11011,B10001,
             B01110,B01110,B01110,B01110,B00000,
             B11111,B11111,B11111,B11111,B11111,};*/
int heart[]={B10101,B00000,B00000,B10001,B11011};

//int letterI[]={B10001,B11011,B11011,B11011,B10001};

//int letterU[]={B01110,B01110,B01110,B01110,B00000};

void setup()
{
  pinMode(x1,OUTPUT);
  pinMode(x2,OUTPUT);
  pinMode(x3,OUTPUT);
  pinMode(x4,OUTPUT);
  pinMode(x5,OUTPUT);
  pinMode(y1,OUTPUT);
  pinMode(y2,OUTPUT);
  pinMode(y3,OUTPUT);
  pinMode(y4,OUTPUT);
  pinMode(y5,OUTPUT);
  Serial.begin(9600);
}
/*
void keepchar(int dat)
{
  int m;
  for(m = 0; m < 8; m++)
  {
    digitalWrite(shcp,LOW);
    digitalWrite(ds,dat & 0x80);
    int val = digitalRead(ds);
    digitalWrite(shcp,HIGH);
    dat = dat<<1;
//    Serial.print(val);
  }
//  Serial.print('\n');
}

void sendchar()
{
  digitalWrite(stcp,LOW);
  digitalWrite(stcp,HIGH);
}
*/

int j=0;
void refresh_matrix()
{
  switch(j)
  {
    case 0:digitalWrite(y5,1);digitalWrite(y4,0);digitalWrite(y3,0);digitalWrite(y2,0);digitalWrite(y1,0);break;
    case 1:digitalWrite(y4,1);digitalWrite(y5,0);digitalWrite(y3,0);digitalWrite(y2,0);digitalWrite(y1,0);break;
    case 2:digitalWrite(y3,1);digitalWrite(y5,0);digitalWrite(y4,0);digitalWrite(y2,0);digitalWrite(y1,0);break;
    case 3:digitalWrite(y2,1);digitalWrite(y4,0);digitalWrite(y3,0);digitalWrite(y5,0);digitalWrite(y1,0);break;
    case 4:digitalWrite(y1,1);digitalWrite(y4,0);digitalWrite(y3,0);digitalWrite(y2,0);digitalWrite(y5,0);break;
    default:break;
  }
  
  int f1=heart[j]&B1;
  int f2=(heart[j]&B10) >> 1;
  int f3=(heart[j]&B100) >> 2;
  int f4=(heart[j]&B1000) >> 3;
  int f5=(heart[j]&B10000) >> 4;
  digitalWrite(x1,f1);
  digitalWrite(x2,f2);
  digitalWrite(x3,f3);
  digitalWrite(x4,f4);
  digitalWrite(x5,f5);

//Serial mornitoring
  Serial.print(f1);
  Serial.print(f2);
  Serial.print(f3);
  Serial.print(f4);
  Serial.println(f5);
/*  
  keepchar(heart[j]);
  sendchar();
  keepchar(0xff);*/
  
  if(4==j++) j=0;
}


void loop()
{
  refresh_matrix();
//  delay(100);
}

一下是效果图::::
事先说明一下,如果打开串口监视,无论直接控制还是利用595,每一行显示的内容都是对的,只是实际中不对。
一:采用了595来控制点阵负极C:\Documents and Settings\Administrator\桌面\通过595控制点阵负极
二:直接通过IO口控制点阵正负极且关闭串口监视C:\Documents and Settings\Administrator\桌面\直接控制点阵正负极
三:直接控制点阵正负极并打开串口监视C:\Documents and Settings\Administrator\桌面\直接控制点阵正负极并打开串口监视
参考点阵坐标规定:C:\Documents and Settings\Administrator\桌面\点阵坐标规定


问题一:为什么前两种方法得不到想要的结果,但串口显示我输出的值都是对的。
问题二:为什么显示点阵的时候总有些不愿意他亮的点会有微弱的亮光,就如第三副图一样。
我已经试过在CASE里边加上delay,但没有用,微弱的亮点一直存在,而且显示出现了错误,具体说的就是本该在Y4显示的结果到了最后Y1,其他的也都往下错了一行。

点阵坐标规定

点阵坐标规定

通过595控制点阵负极

通过595控制点阵负极

直接控制点阵并打开串口监视

直接控制点阵并打开串口监视

直接控制点阵正负极且不打开串口监视

直接控制点阵正负极且不打开串口监视
发表于 2013-1-4 14:16 | 显示全部楼层
问题二:你没有做消隐处理,在刷新新的数据前请关闭行/列驱动就不会有微亮了。

其他问题请检查你的程序是不是全局变量冲突没修改了。
 楼主| 发表于 2013-1-4 20:16 | 显示全部楼层
珜羽 发表于 2013-1-4 14:16
问题二:你没有做消隐处理,在刷新新的数据前请关闭行/列驱动就不会有微亮了。

其他问题请检查你的程序是 ...

你好,非常感谢你回答我的问题,关于点阵已经困扰我很久了就是做不出想要的效果。消隐处理我听说过,但是你能具体的解释一下吗。
    case 0:digitalWrite(y5,1);digitalWrite(y4,0);digitalWrite(y3,0);digitalWrite(y2,0);digitalWrite(y1,0); digitalWrite(x5,1);digitalWrite(x4,1);digitalWrite(x3,1);digitalWrite(x2,1);digitalWrite(x1,1);break;
    我刚才这样改了一下,Y的是吧响应的行至高。X的是吧列也都先给一个高。但是还是不行。还是有微亮。
希望能今早看到你的解答,先表示一下感谢。
 楼主| 发表于 2013-1-4 20:25 | 显示全部楼层
珜羽 发表于 2013-1-4 14:16
问题二:你没有做消隐处理,在刷新新的数据前请关闭行/列驱动就不会有微亮了。

其他问题请检查你的程序是 ...

你好,我又试了在给X列发送数据以后都再给写个一。现在可以啦,非常正常,感谢感谢!!!好人交好运,一生平安
发表于 2013-1-6 10:40 | 显示全部楼层
最爱清宝宝 发表于 2013-1-4 20:25
你好,我又试了在给X列发送数据以后都再给写个一。现在可以啦,非常正常,感谢感谢!!!好人交好运,一 ...

建议您把正确的程序和接线图发上来,造福其他网友~
 楼主| 发表于 2013-1-7 18:36 | 显示全部楼层
珜羽 发表于 2013-1-6 10:40
建议您把正确的程序和接线图发上来,造福其他网友~

好的。我现在就发
 楼主| 发表于 2013-1-7 18:42 | 显示全部楼层
// 正极
int y5=6;
int y4=5;
int y3=4;
int y2=3;
int y1=2;

//负极
int ds=8;
int stcp=0;
int shcp=1;

int i = 0;
int counter = 0;
int hello[] ={B11111,B11111,B11111,B11111,B11111,
              B01110,B01110,B00000,B01110,B01110,//H
              B11111,B11111,
              B10001,B10111,B10001,B10111,B10001,//E
              B11111,B11111,
              B10111,B10111,B10111,B10111,B10001,//L
              B11111,B11111,
              B10111,B10111,B10111,B10111,B10001,//L
              B11111,B11111,
              B10001,B01110,B01110,B01110,B10001,//O
              B11111,B11111,B11111,B11111,B11111,};

/*int iloveu[]={B11111,B11111,B11111,B11111,B11111,
             B10001,B11011,B11011,B11011,B10001,
             B11111,
             B10101,B00000,B00000,B10001,B11011,
             B01110,B01110,B01110,B01110,B10001,
             B11111,B11111,B11111,B11111,B11111};*/
//int heart[]={B10101,B00000,B00000,B10001,B11011};

//int letterI[]={B10001,B11011,B11011,B11011,B10001};

//int letterU[]={B01110,B01110,B01110,B01110,B00000};

void setup()
{
  pinMode(stcp,OUTPUT);
  pinMode(shcp,OUTPUT);
  pinMode(ds,OUTPUT);
  pinMode(y1,OUTPUT);
  pinMode(y2,OUTPUT);
  pinMode(y3,OUTPUT);
  pinMode(y4,OUTPUT);
  pinMode(y5,OUTPUT);
//  Serial.begin(9600);
}

void keepchar(int dat)
{
  int m;
  for(m = 0; m < 8; m++)
  {
    digitalWrite(shcp,LOW);
    digitalWrite(ds,dat & 0x80);
    int val = digitalRead(ds);
    digitalWrite(shcp,HIGH);
    dat = dat<<1;
//    Serial.print(val);
  }
//  Serial.print('\n');
}

void sendchar()
{
  digitalWrite(stcp,LOW);
  digitalWrite(stcp,HIGH);
}



void refresh_matrix()
{
  static int j=0;//Serial.println("refresh");
  switch(j)
  {
    case 0:digitalWrite(y5,1);digitalWrite(y4,0);digitalWrite(y3,0);digitalWrite(y2,0);digitalWrite(y1,0); break;
    case 1:digitalWrite(y4,1);digitalWrite(y5,0);digitalWrite(y3,0);digitalWrite(y2,0);digitalWrite(y1,0); break;
    case 2:digitalWrite(y3,1);digitalWrite(y5,0);digitalWrite(y4,0);digitalWrite(y2,0);digitalWrite(y1,0); break;
    case 3:digitalWrite(y2,1);digitalWrite(y4,0);digitalWrite(y3,0);digitalWrite(y5,0);digitalWrite(y1,0); break;
    case 4:digitalWrite(y1,1);digitalWrite(y4,0);digitalWrite(y3,0);digitalWrite(y2,0);digitalWrite(y5,0); break;
    default:break;
  }

//Serial mornitoring
/*  Serial.print(f1);
  Serial.print(f2);
  Serial.print(f3);
  Serial.print(f4);
  Serial.println(f5); */
  
  keepchar(hello[j+i]);
  sendchar();
  delay(2);
  keepchar(0xff);
  sendchar();
  
  if(4==j++) j=0;
}

/*void loop()
{
  counter++;
  if(counter == 100)
  {
    counter = 0;
    i++;
    if(i == 39) i = 0;
  }
  refresh_matrix();
}*/

void displaymatrix()
{
  counter++;
  if(counter == 100)
  {
    counter = 0;
    i++;//Serial.println("display");
    if(i == 39) i = 0;
  }
  refresh_matrix();
}

void loop()
{
  displaymatrix();
}

**********以上是利用595的。如果直接利用IO口的话。只需在第一个switch以后这样写:

   int f1=heart[j]&B1;
   int f2=(heart[j]&B10) >> 1;
   int f3=(heart[j]&B100) >> 2;
   int f4=(heart[j]&B1000) >> 3;
   int f5=(heart[j]&B10000) >> 4;
   digitalWrite(x1,f1);
   digitalWrite(x2,f2);
   digitalWrite(x3,f3);
   digitalWrite(x4,f4);
   digitalWrite(x5,f5);
   delay(2);
   switch(j)
  {
    case 0:digitalWrite(x5,1);digitalWrite(x4,1);digitalWrite(x3,1);digitalWrite(x2,1);digitalWrite(x1,1);break;
    case 1:digitalWrite(x5,1);digitalWrite(x4,1);digitalWrite(x3,1);digitalWrite(x2,1);digitalWrite(x1,1);break;
    case 2:digitalWrite(x5,1);digitalWrite(x4,1);digitalWrite(x3,1);digitalWrite(x2,1);digitalWrite(x1,1);break;
    case 3:digitalWrite(x5,1);digitalWrite(x4,1);digitalWrite(x3,1);digitalWrite(x2,1);digitalWrite(x1,1);break;
    case 4:digitalWrite(x5,1);digitalWrite(x4,1);digitalWrite(x3,1);digitalWrite(x2,1);digitalWrite(x1,1);break;
  }

连线都是一样的。再次还要感谢“珜羽”的热心解答。
发表于 2013-2-8 00:43 | 显示全部楼层
同样被消隐问题困扰着,小白真是得从头学起……
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2025-1-1 22:12 , Processed in 0.080094 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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