用595驱动16*16点阵遇到很奇怪的问题,实在没检查出问题,在线等

ydq850524   2010-4-20 22:49 楼主
这是程序

  1. #include

  2. sbit ser = P3^7;
  3. sbit OE = P3^6;
  4. sbit RCK = P3^5;
  5. sbit SCK = P3^4;
  6. sbit G1 = P2^0;
  7. sbit G2 = P2^1;

  8. char code tab[]=
  9. {
  10.         0x02,0x00,0x04,0x00,0x1F,0xFF,0xE0,0x00,
  11.         0x00,0x00,0x1F,0xFF,0x40,0x00,0x20,0x00,
  12.     0x10,0x00,0x20,0x00,0x20,0x00,0x20,0x02,
  13.     0x20,0x01,0x7F,0xFE,0x20,0x00,0x00,0x00  //们
  14. };

  15. void Delay(int a)
  16. {
  17.         while(--a);
  18. }

  19. void main()
  20. {       
  21.         char i,j;
  22.         char shang,xia;         
  23.         while(1)
  24.         {
  25.                 for(j=0;j<16;j++)
  26.                 {       
  27.                         OE = 1;
  28.                         G1 = 1;
  29.                         shang = tab[j*2];//上半屏数据
  30.                         xia = tab[j*2+1];//下半屏数据
  31.                         for(i=0;i<8;i++)
  32.                         {
  33.                                 ser = xia&0x01;
  34.                                 SCK = 0;
  35.                                 SCK = 1;
  36.                                 xia >>= 1;
  37.                         }
  38.                         for(i=0;i<8;i++)
  39.                         {
  40.                                 ser = shang&0x01;
  41.                                 SCK = 0;
  42.                                 SCK = 1;
  43.                                 shang >>= 1;
  44.                         }       
  45.                         RCK = 0;
  46.                         RCK = 1;
  47.                         P1 = j;
  48.                         G1 = 0;        //G1是154的使能
  49.                         OE = 0;
  50.                         Delay(5);
  51.                 }
  52.         }                       
  53. }

列驱动用的是154,P1是154的输入
硬件连接应该不会有问题,因为我用573驱动时是正常的,换成595后就不正常了.
以为是595的连接出问题了,可是单独往595送数据,比如上面的直接令shang = 0xaa;xia = 0x55;这个显示还是正常的。可是换成数组时就不正确了。
出现的问题是这样的
1,汉字显示闪烁太厉害,不是延时的问题,怎么设置延时都不行。
2,只要有汉字的点落在点阵的第一列上,那么在第一列的有点的这一行就全部是亮的。
更奇怪的是,偶尔会出现P1 = j;改为P1 = j+1;或j+2时显示正常,只是字往右边移了一位。但是改为P1 = j就又不正常了,此时再改为P1 = j+1或j+2;却显示的不是字,在点阵上只显示出一行了。

回复评论 (4)

[img]
(原文件名:2010-04-20_225157.jpg)
[/img]
点赞  2010-4-20 22:58
点赞  2010-4-20 23:00
573是并入并出,595是串入并出,数据传输变慢
需要提高扫描频率,减少延时时间即可
点赞  2010-4-20 23:57
楼主,你的问题应该就是在两个for循环之间没锁存数据。
            for(i=0;i<8;i++)
            {
                ser = xia&0x01;
                SCK = 0;
                SCK = 1;
                xia >>= 1;
            }
            for(i=0;i<8;i++)
            {
                ser = shang&0x01;
                SCK = 0;
                SCK = 1;
                shang >>= 1;
            }   

595是8bit的移位锁存器,你在第一个for循环结束的时候,已经将一个char数据串转并移到了595的寄存器上,此时,你应该要锁存该数据,而且要先处理,将其扫描在屏幕上,然后再下一个for循环,原理同上。

也可以这样说,上下屏分开处理,原因是595是8bit的移位寄存器,当它的寄存器得到一个有用的8bit数据后,就应该先锁存,处理。。。。。。。
点赞  2010-4-21 09:47
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复