搜索
bottom↓
回复: 46

淘宝购得16*64点阵屏,点亮成功,但显示时不亮的点会随机地闪烁,请高手指点下

[复制链接]

出0入0汤圆

发表于 2010-2-25 01:53:13 | 显示全部楼层 |阅读模式
前一阵子,去淘宝上花了45买了个16*94的双色屏,用ORCAD画出了其线路图,如下:


可是点起来后发现屏幕本不亮的点会随机地一闪一闪,同时也发现,串行数据传送越后级的74HC595,其对就就的该区域闪烁烁明显,
如附件视频,小弟实在百思不得其解,还请各位看观中的高手指点一下


(原文件名:IMAGE_071.jpg)


(原文件名:IMAGE_072.jpg)


(原文件名:IMAGE_073.jpg)




(原文件名:IMAGE_069.jpg)


(原文件名:IMAGE_070.jpg)

点击此处下载线路图 ourdev_535230.pdf(文件大小:57K) (原文件名:SCHEMATIC1 _ 16_64.pdf)

点击此处下载录像 ourdev_535229.rar(文件大小:174K) (原文件名:录像.rar)

同时,小弟也希望能交几个志同道合的朋友一起学习一起交流,天天自己一个人在宿舍玩,实在没意思

程序如下:
#include <reg52.h>
#include <intrins.h>
void SendByte(unsigned int);
sbit RCK = P1^0;           //输出存储器锁存时钟线
sbit SCK = P1^1;           //数据输入时钟线
sbit SI_Rdata =P1^2;        //红灯数据线                  
sbit SI_Ydata =P1^3;        //绿灯数据线
sbit EN =P1^4;                        //74HC138使能
//A、B、C、D->p2.0~p2.3
unsigned char code font[][32]={

/*---------------成----------------*/
0xFF,0x27,0xFF,0x27,0xC0,0x03,0xC0,0x03,0xCF,0x3F,0xCF,0x3F,0xC1,0x27,0xC1,0x27,
0xC9,0x27,0xC9,0x8F,0xC9,0x9F,0x91,0x19,0x9E,0x49,0x3C,0xE1,0xBD,0xF3,0xFF,0xFF,

/*---------------功----------------*/
0xFF,0x3F,0xFF,0x3F,0x03,0x3F,0x03,0x3F,0xCC,0x03,0xCC,0x03,0xCF,0x33,0xCF,0x33,
0xCF,0x33,0xCF,0x33,0xC2,0x73,0x02,0x73,0x1C,0xF3,0xF1,0xC3,0xFB,0xC7,0xFF,0xFF,

/*---------------点----------------*/
0xFC,0xFF,0xFC,0xFF,0xFC,0x03,0xFC,0x03,0xFC,0xFF,0xC0,0x07,0xC0,0x07,0xCF,0xE7,
0xCF,0xE7,0xC0,0x07,0xC0,0x07,0xFF,0xFF,0xD9,0x33,0x99,0x99,0x39,0x99,0xFF,0xFF,
/*---------------亮----------------*/
0xFC,0xFF,0x80,0x03,0x80,0x03,0xFF,0xFF,0xE0,0x0F,0xE7,0xCF,0xE0,0x0F,0xFF,0xFF,
0x00,0x03,0x3F,0xF3,0xF0,0x3F,0xF3,0x3F,0xF3,0x3B,0xE7,0x03,0x8F,0x83,0xFF,0xFF,

};

main(void)
{
        unsigned char i,j;
        while(1)
        {  
//         P2=0xff;
             for(i=0;i<16;i++)
        {
//                        EN=0;
                          for(j=0;j<4;j++)
                          {            
                    SendByte(font[j][i*2]);
                SendByte(font[j][i*2+1]);                                                                                                                                                
                                  }
         EN=1;   
        RCK=0;       
        RCK=1;
         P2=i;
        EN=0;
        }
         }
}
void SendByte(unsigned int dat)                  //传1BYTE函数
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
                SI_Ydata = (bit)(dat&0x80);                //先传最高位
                SCK=0;
//                _nop_();
//                _nop_();
                SCK=1;
                dat <<= 1;
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2010-2-25 12:44:24 | 显示全部楼层
等结论学习下!!!

出0入0汤圆

发表于 2010-2-25 16:28:13 | 显示全部楼层
可能是时序处理的问题或595处理上没注意到哪条线的信号除了问题,多检查一下一定可以的,祝LZ成功

出0入0汤圆

发表于 2010-2-25 17:24:57 | 显示全部楼层
我碰到过类似的,是电源驱动电流不足,导致电源电压下降引起的。

出0入0汤圆

发表于 2010-2-25 18:18:18 | 显示全部楼层
看一下地线是否接触良好

出0入0汤圆

发表于 2010-2-25 18:50:40 | 显示全部楼层
注意下消隐,你EN都没用起来.

┌--->关显示-->送数据-->开显示-->延时---┐
└--------------------------------------┘

出0入4汤圆

发表于 2010-2-25 19:21:23 | 显示全部楼层
把电容焊上试试

出0入0汤圆

 楼主| 发表于 2010-2-25 21:13:35 | 显示全部楼层
回复【5楼】aozima
-----------------------------------------------------------------------

开始没用EN,是会上下行本不该亮的点会亮,但很暗
但这这些亮得很暗的点并不会闪烁
EN已加,见程序,已改善上下行显示干扰问题
但我把提问的现象仍在

出0入0汤圆

发表于 2010-2-25 21:15:49 | 显示全部楼层
同意5观点,操作移位寄存器时要关显示,否则屏上原来显示的亮点会跟移位寄存器同步移位,
移动快了看起来就像是随机闪点。
楼主原来代码中注释掉的部分加上去应该就好了

出0入0汤圆

 楼主| 发表于 2010-2-25 21:23:28 | 显示全部楼层
回复【8楼】shanlingxia
-----------------------------------------------------------------------

EN问题,只是会影响到上下行同列的点,且不会有闪烁感,
且我已修改代码

出0入0汤圆

 楼主| 发表于 2010-2-25 21:26:55 | 显示全部楼层
回复【3楼】soulcoffee 崔超
我碰到过类似的,是电源驱动电流不足,导致电源电压下降引起的。
-----------------------------------------------------------------------

我的电源是显示器中的power板拆下来用的
刚测试了下,无负载时5.1v,接上点阵屏4.73v,降不多呀

出0入0汤圆

发表于 2010-2-25 21:32:26 | 显示全部楼层
回复【9楼】sophy.lin  
回复【8楼】shanlingxia
-----------------------------------------------------------------------
EN问题,只是会影响到上下行同列的点,且不会有闪烁感,
且我已修改代码
-----------------------------------------------------------------------
你延时也没有.
且原来EN开关顺序是反的.

刚看到改了

建议把延时设置得长些,一秒显示一行,慢慢观察.然后加快,用于测试到快什么速度就开始出问题.

出0入0汤圆

发表于 2010-2-25 21:48:00 | 显示全部楼层
看错了,原来楼主的 EN 接的是74138的使能
移位的时候74595的13脚 写高,然后再低OE输出使能

出0入0汤圆

发表于 2010-2-25 23:07:58 | 显示全部楼层
我也在淘宝上35元买了一块16*64的,显示效果不错!

出0入0汤圆

发表于 2010-2-25 23:16:11 | 显示全部楼层
我的QQ是412399442,很高兴能跟你交流!

出0入0汤圆

发表于 2010-2-26 19:53:34 | 显示全部楼层
SI_Ydata��=��(bit)(dat&0x80); //先传最高位
SCK=0;
_nop_();  /这两条加上试试?
_nop_();
SCK=1;

请教下:
SI_Ydata��=��(bit)(dat&0x80);
右边部分是什么?
谢谢!

出0入0汤圆

发表于 2010-2-26 21:08:21 | 显示全部楼层
把595摁紧。。。多数是接触不良。。。

等会给你看我的啊

出0入0汤圆

发表于 2010-2-26 21:09:28 | 显示全部楼层
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3697006&bbs_page_no=1&search_mode=3&search_text=ju748&bbs_id=9999

出0入0汤圆

 楼主| 发表于 2010-2-28 16:13:57 | 显示全部楼层
回复【12楼】shanlingxia
看错了,原来楼主的 EN 接的是74138的使能
移位的时候74595的13脚 写高,然后再低OE输出使能

-----------------------------------------------------------------------

确定是这个吗,可是我买来时他的线路就是这样的,595的输出使能是直接接到GND

出0入0汤圆

 楼主| 发表于 2010-2-28 16:17:03 | 显示全部楼层
回复【11楼】aozima
-----------------------------------------------------------------------

回复【11楼】aozima
回复【9楼】sophy.lin   
回复【8楼】shanlingxia  
-----------------------------------------------------------------------
EN问题,只是会影响到上下行同列的点,且不会有闪烁感,
且我已修改代码
-----------------------------------------------------------------------
你延时也没有.
且原来EN开关顺序是反的.
刚看到改了
建议把延时设置得长些,一秒显示一行,慢慢观察.然后加快,用于测试到快什么速度就开始出问题.
-----------------------------------------------------------------------

这个提议不错,谢谢,在扫描一行后加了一个很长的延时,可以看到是一行一行由上往下地显示,但结果不亮的地方不会闪,但一去掉这个延时,快速扫描就会有

出0入0汤圆

发表于 2010-2-28 16:35:03 | 显示全部楼层
回复【19楼】sophy.lin  
在扫描一行后加了一个很长的延时,可以看到是一行一行由上往下地显示,但结果不亮的地方不会闪,但一去掉这个延时,快速扫描就会有
-----------------------------------------------------------------------
按刷新频率50Hz-80Hz算.

1000ms/50hz = 20ms.
20ms / 16行 = 1.25ms.
你的延时应该调整到1.25ms左右(偏左,因为送数据还要时间).

延时时间可以通过仿真得出,成功.后你就可以用定时和中断去刷屏了.

出0入0汤圆

 楼主| 发表于 2010-2-28 18:45:14 | 显示全部楼层
回复【20楼】aozima
-----------------------------------------------------------------------

只要整屏的刷新频率不低于50HZ,人眼就感觉不到屏烁了是不是,
学习了,这个以后要记住,感谢
每扫描完一行,加一段延时,并要短于1.25MS?
我试下

出0入0汤圆

发表于 2010-3-1 08:59:44 | 显示全部楼层
我碰到过类似问题,我的做法是在电源和地之间旁路一个几十u的电容,就好了

出0入0汤圆

发表于 2010-3-1 09:07:06 | 显示全部楼层
串多了是要加驱动的74HC244  245 等等

出0入0汤圆

 楼主| 发表于 2010-3-3 14:37:08 | 显示全部楼层
回复【23楼】dxjk1
串多了是要加驱动的74HC244  245 等等
-----------------------------------------------------------------------

我的板子上有245

回复【22楼】beiquan
我碰到过类似问题,我的做法是在电源和地之间旁路一个几十u的电容,就好了
-----------------------------------------------------------------------

已经有一个220UF和8个0.1UF的

出0入0汤圆

 楼主| 发表于 2010-3-4 09:16:51 | 显示全部楼层
回复【17楼】ju748 持诚求真
-----------------------------------------------------------------------

已经看了你的32*64,你们只用一个138,是怎么进行32行的扫描啊

出0入0汤圆

 楼主| 发表于 2010-3-4 09:44:36 | 显示全部楼层
回复【15楼】arbol
SI_Ydata??=??(bit)(dat&amp;0x80); //先传最高位
SCK=0;
_nop_();  /这两条加上试试?
_nop_();
SCK=1;
  
请教下:
SI_Ydata??=??(bit)(dat&amp;0x80);  
右边部分是什么?
谢谢!

-----------------------------------------------------------------------
SI_Ydata=(bit)(dat&0x80); 就是取出显示数据dat的最高位送到SI_Ydata
其实常见的还有两种方法
1,if(dat&0x80==0x80)SI_Ydata;
      else SI_Ydata=0;
      dat<<=1;//左移一位
2,利用PSW的CY标志位
dat<<=1;//将dat最高位移至CY;
SI_Ydata=CY;//再将CY位送到SI_Ydata

以上三种中,本人特地去比较过,最后一种方法,利用PSW的CY标志位,效率最高,这对于用51来做行扫描来说是非常有好处的,
还有一种方法,其实就是利用51自带的串行口直接发送数据
有兴趣的可以试一下

出0入0汤圆

发表于 2010-3-4 19:03:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-4 19:12:56 | 显示全部楼层
应该是干扰,以前做了个64*32(宽*高)单色的也会有这种问题,现在在做一个128*32双色的就没有出过问题,不过发现当用定时中断来扫描的话扫描频率高了也会出这问题~~~

出0入0汤圆

 楼主| 发表于 2010-3-7 23:19:07 | 显示全部楼层
多谢各位了,问题已经解决了了,弄了好久,
在此贴出来下
就是138 EN使能位、595锁存的几个先后时序问题
MAIN改成如下:
main(void)
{
        unsigned char i,j;
        while(1)
        {         
             for(i=0;i<16;i++)
        {
             RCK=0;       
              for(j=0;j<4;j++)
              {            
            SendByteR(font[j][i*2]);
SendByteR(font[j][i*2+1]);                                                                                                                                                
         }
                EN=1;                                //
                RCK=1;
                P3=i;
                EN=0;
                }  
         }
}

出0入0汤圆

发表于 2010-3-14 11:43:05 | 显示全部楼层
(bit)(dat&0x80)这种语法书上都没有啊!又学到一招!
谢谢LZ回复!

出0入0汤圆

发表于 2010-3-17 08:40:36 | 显示全部楼层
mark!

出0入0汤圆

 楼主| 发表于 2010-3-17 09:38:44 | 显示全部楼层
回复【30楼】arbol
-----------------------------------------------------------------------
大家都是互相交流,此坛的人都非常的热心

不过建议使用这种,此效率较高
dat<<=1;//将dat最高位移至CY;
SI_Ydata=CY;//再将CY位送到SI_Ydata

出0入0汤圆

发表于 2010-3-17 09:47:44 | 显示全部楼层
谢谢分享经验。

出0入0汤圆

发表于 2010-3-17 10:31:32 | 显示全部楼层
谢谢LZ!
弄清楚怎么回事了:(bit)(data) 这样是一个强制类型转换运算符,将后面的(data)强制转换为bit类型。C语言教材中有的,以前看书时给忽略过去了。

出0入0汤圆

发表于 2010-3-17 20:04:24 | 显示全部楼层
LZ的QQ多少?
我现在遇到一个点阵屏问题(32*80),望指教!

出0入0汤圆

 楼主| 发表于 2010-3-18 15:27:01 | 显示全部楼层
回复【35楼】wolfdong7
-----------------------------------------------------------------------

Q:373671025
欢迎交流

出0入0汤圆

发表于 2010-3-18 18:50:52 | 显示全部楼层
楼主购买的链接给一下啊

出0入0汤圆

发表于 2010-3-18 19:06:52 | 显示全部楼层

(原文件名:DSC01668.JPG)

根据LZ的代码,我的也驱动成功了!

店铺:http://shop36303950.taobao.com/

出0入0汤圆

发表于 2011-4-5 20:56:30 | 显示全部楼层
回复【38楼】wolfdong7
-----------------------------------------------------------------------

楼主:你好!我也买了和你一模一样的屏,也是45元,我估计我们可能是从同一个地方买的(山西 太原搜刮)。但是我按照你的方法怎么点不亮,只有两条亮线。晕,希望得到你的指点。QQ:79772796 邮箱:fly02827@163.com

出145入215汤圆

发表于 2011-4-7 11:55:56 | 显示全部楼层
我买一块全新的16,16单色点阵就30大洋!咋价格差别折磨大啊

出0入0汤圆

发表于 2011-5-14 10:43:03 | 显示全部楼层
我的也只亮两条线,郁闷!
我的是32*64的屏,接口:
GND  LA
GND  LB
GND  LC
EN   LD
R1   G1
R2   G2
GND  LT
GND  SK

出0入0汤圆

发表于 2012-2-18 21:21:47 | 显示全部楼层
我也两条线。38*80    郁闷

出90入372汤圆

发表于 2012-8-24 22:59:49 | 显示全部楼层
16  x 64 双色点阵

出0入0汤圆

发表于 2012-8-29 18:02:03 | 显示全部楼层
kwg k哈哈,1664的学习一下了。

出0入0汤圆

发表于 2012-9-9 15:59:19 | 显示全部楼层
#include <reg52.h>
#include <intrins.h>
void SendByte(unsigned int);
sbit EN       = P3^2;           //74HC138使能
sbit RCK      = P1^7;           //输出存储器锁存时钟线
sbit SI_Ydata = P3^3;           //绿灯数据线
sbit SCK      = P3^1;           //数据输入时钟线
sbit HC595_DR = P1^4;    //定义595数据发送口
//A、B、C、D->p2.0~p2.3
unsigned char code font[][32]={

/*---------------成----------------*/
0xFF,0x27,0xFF,0x27,0xC0,0x03,0xC0,0x03,0xCF,0x3F,0xCF,0x3F,0xC1,0x27,0xC1,0x27,
0xC9,0x27,0xC9,0x8F,0xC9,0x9F,0x91,0x19,0x9E,0x49,0x3C,0xE1,0xBD,0xF3,0xFF,0xFF,

/*---------------功----------------*/
0xFF,0x3F,0xFF,0x3F,0x03,0x3F,0x03,0x3F,0xCC,0x03,0xCC,0x03,0xCF,0x33,0xCF,0x33,
0xCF,0x33,0xCF,0x33,0xC2,0x73,0x02,0x73,0x1C,0xF3,0xF1,0xC3,0xFB,0xC7,0xFF,0xFF,

/*---------------点----------------*/
0xFC,0xFF,0xFC,0xFF,0xFC,0x03,0xFC,0x03,0xFC,0xFF,0xC0,0x07,0xC0,0x07,0xCF,0xE7,
0xCF,0xE7,0xC0,0x07,0xC0,0x07,0xFF,0xFF,0xD9,0x33,0x99,0x99,0x39,0x99,0xFF,0xFF,
/*---------------亮----------------*/
0xFC,0xFF,0x80,0x03,0x80,0x03,0xFF,0xFF,0xE0,0x0F,0xE7,0xCF,0xE0,0x0F,0xFF,0xFF,
0x00,0x03,0x3F,0xF3,0xF0,0x3F,0xF3,0x3F,0xF3,0x3B,0xE7,0x03,0x8F,0x83,0xFF,0xFF,

};

unsigned char code love[][32]={

{0xFF,0xFD,0xB2,0x96,0xA6,0xB6,0x90,0xA6,0x36,0x76,0x66,0x16,0x76,0xF6,0xF3,0xFF},
{0xFD,0xFB,0xFA,0xF6,0xCD,0x1D,0xAB,0xAB,0xB7,0xA7,0x9B,0xBB,0xFD,0xFC,0xFD,0xFF},/*"爱",0*/

{0xFB,0xFB,0xBB,0xBB,0x80,0x7B,0x7B,0xFB,0xFB,0x00,0xFB,0xBB,0xCA,0xFB,0xFB,0xFF},
{0xDF,0xDF,0xBD,0xBE,0x01,0x7F,0x7F,0xF7,0xF7,0xEF,0x1F,0xA7,0x7B,0xFD,0xF0,0xFF},/*"我",1*/
};
main(void)
{
        unsigned char i,j;
        EN=0;
        while(1)
        {  
                 P1=0xff;
             for(i=0;i<16;i++)
             {
                 for(j=0;j<4;j++)
                 {            
                    SendByte(font[j][i*2]);
                             SendByte(font[j][i*2+1]);                                                                                                                                                
//                  SendByte(love[j][i*2]);
//                             SendByte(love[j][i*2+1]);                                                                                                                                                
                 }
                        RCK=0;        
                        RCK=1;
                        P1=i;
//                                HC595_DR=1;
                }
         }
}
void SendByte(unsigned int dat)                  //传1BYTE函数
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
//                SI_Ydata = (bit)(dat&0x80);
                HC595_DR = (bit)(dat&0x80);
                SCK=0;
                SCK=1;
                dat <<= 1;
        }
}

出0入0汤圆

发表于 2013-5-23 17:04:42 | 显示全部楼层
一会看看.也在弄这个双基色
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 09:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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