搜索
bottom↓
回复: 17

595级联出现数据数据分界线(错位)求解

[复制链接]

出145入215汤圆

发表于 2014-10-23 18:32:18 | 显示全部楼层 |阅读模式
如题,做了个595两级级联,结果就悲剧了。不管是行扫描还是列扫描都会出现5958位的分界。搞不清楚是硬件问题还是软件问题。特来求救~~

连接方式就是你懂的方式,16×16单色点阵,两片一组级联,分别做行列信号。选了行扫描595输出2003驱动,扫描信号为高。

图片如下:





/*-----------------------------------------------*/
#include<reg52.h>   
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int

void delay5us(void);
void delay_nms(uchar);
void SendByte(uchar);
void Send_2Byte(uchar,uchar);
void SendSeg_Byte(uchar);
void SendSeg_2Byte(uchar,uchar);

sbit h_ser  =P0^0;
sbit h_sclk =P0^1;
sbit h_lclk =P0^2;

sbit l_ser  =P0^3;
sbit l_sclk =P0^4;
sbit l_lclk =P0^5;

      uchar data_tab[32]={0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0x06,0x18,0x00,0x18,0x18,0x18,0x38,0x18,
0xF8,0x1F,0x18,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,0x00,0x00,0x00,0x00};
          uchar scan_tab[32]={0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,
                                          0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80};


//------------------------------------------------
main()
{
    uchar i;

        while(1)
        {
                 for(i=0;i<16;i++)
                         {
                          Send_2Byte(scan_tab[i*2-1],scan_tab[i*2]);                //扫描信号
                         delay_nms(1);
                          SendSeg_2Byte(data_tab[i*2-1],data_tab[i*2]);        //数据输出
                         delay_nms(1);
                         SendSeg_2Byte(0x00,0x00);           //关显示
                         }
        }

}
////////////////////////////////////////////////////////////
void SendByte(uchar dat)
{   
   uchar i;
        
   for(i=0;i<8;i++)
        {
         h_sclk=0;
         h_ser=dat&0x80;
         dat<<=1;
         h_sclk=1;
         }
}
////////////////////////////////////////////////////////////
void Send_2Byte(uchar dat1,uchar dat2)
{
        SendByte(dat1);
        SendByte(dat2);

        h_lclk=0;
        _nop_();
        h_lclk=1;
}
////////////////////////////////////////////////////////////
void SendSeg_Byte(uchar dat)
{
   uchar i;
   for(i=0;i<8;i++)
                   {
                 l_sclk=0;
                 l_ser=dat&0x80;
                 dat<<=1;
                 l_sclk=1;
                }
}
////////////////////////////////////////////////////////////
void SendSeg_2Byte(uchar dat1,uchar dat2)
{
SendSeg_Byte(dat1);
SendSeg_Byte(dat2);
l_lclk=0;
_nop_();
l_lclk=1;
}
////////////////////////////////////////////////////////////
void delay5us(void)   
{
    _nop_();  //if Keil,require use intrins.h
    _nop_();  //if Keil,require use intrins.h
}
////////////////////////////////////////////////////////////
void delay_nms(uchar t)
{
    uchar a,b,c;
    for(c=t;c>0;c--)
     for(b=102;b>0;b--)
      for(a=3;a>0;a--);
}
////////////////////////////////////////////////////////////

PS:请无视我的金牌会员,我其实是金牌菜鸟,谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-10-23 18:56:12 来自手机 | 显示全部楼层
先试一下全亮,然后隔行亮吧

出145入215汤圆

 楼主| 发表于 2014-10-23 19:16:49 | 显示全部楼层
muniao 发表于 2014-10-23 18:56
先试一下全亮,然后隔行亮吧

我试过了每一帧全量一帧,还是老样子,而且背景微量了。隔行亮不理解啥意思,是慢扫描?还是要抽字模成隔行的?

出0入0汤圆

发表于 2014-10-23 19:49:28 | 显示全部楼层
从你的scan_tab来看,你的显示的那行是高电平,意思是这个点阵是共阳极,显示数据应该是低亮高灭的了?
那么你在关显示的时候,怎么输出的是两个0x00呢?
还有关显示怎么放在最后呢?
试试看这样,先关显示,就是传送两个0XFF,然后传送scan_tab,然后再传送显示数据,然后再延时,再循环,看看是什么效果

出0入0汤圆

发表于 2014-10-23 19:51:42 | 显示全部楼层
看起来显示数据也是0灭1亮的,不明白了,高手给指教一下吧

出10入113汤圆

发表于 2014-10-23 19:58:47 | 显示全部楼层
时序不对。      

出0入4汤圆

发表于 2014-10-23 20:32:34 | 显示全部楼层

加个_nop_();

出145入215汤圆

 楼主| 发表于 2014-10-24 03:49:29 | 显示全部楼层
本帖最后由 dz20062008 于 2014-10-24 04:01 编辑
xiaobendan 发表于 2014-10-23 19:49
从你的scan_tab来看,你的显示的那行是高电平,意思是这个点阵是共阳极,显示数据应该是低亮高灭的了?
那 ...



我试过了,还是出现错行。不管我换行扫还是列扫都会出现8与8之间错行。而且慢扫面观察到扫描也有分界的问题。我的扫描那部分加了2003反相的。所以扫描数据为高亮,实际输出为低扫描。帖子上面的图像不光只有上下错行,在中间还出现了丢失部分的问题。                       


                         Send_2Byte(0x00,0x00);                //关扫描
                          SendSeg_2Byte(0x00,0x00);        //数据输出为灭


                         Send_2Byte(scan_tab[i*2-1],scan_tab[i*2]);
                          SendSeg_2Byte(data_tab[i*2-1],data_tab[i*2]);        //数据输出

                         delay_nms(1);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
感觉是调用的数据有问题,就是找不出来那里问题。这是我验证我的想法的代码。输出左右跳动的竖线,再输出左右跳动的横线,变换的很整齐,没出现上面的问题。

代码如下:
                          Send_2Byte(0xff,0xff);                //扫描信号                                //没有调用数组的数据,输出左右跳动的竖线正常
                          SendSeg_2Byte(0x55,0x55);        //数据输出为灭
                         delay_nms(155);

                          Send_2Byte(0xff,0xff);                //扫描信号
                          SendSeg_2Byte(0xaa,0xaa);        //数据输出为灭
                         delay_nms(155);
////////////////////////////////////////////////////////////////////////////
                          Send_2Byte(0x55,0x55);                //扫描信号                                //没有调用数组的数据,输出上下跳动的横线正常
                          SendSeg_2Byte(0xff,0xff);        //数据输出为灭
                         delay_nms(155);

                          Send_2Byte(0xaa,0xaa);                //扫描信号
                          SendSeg_2Byte(0xff,0xff);        //数据输出为灭
                         delay_nms(155);

出145入215汤圆

 楼主| 发表于 2014-10-24 03:50:06 | 显示全部楼层

试过了,不是速度的问题。

出145入215汤圆

 楼主| 发表于 2014-10-24 03:55:46 | 显示全部楼层

我直接向子程序给数据就没有出现这现象,输出了很整齐可以左右上下跳动的直线。这说明我的硬件连接没问题,子程序没问题。估计是调用数组的方式不对,或者其它问题,就是找不到啊

出0入0汤圆

发表于 2014-10-24 09:09:28 | 显示全部楼层
看不出啥问题,可能你取的字模有问题,与你的硬件连接有出入吧

出0入0汤圆

发表于 2014-10-24 12:20:21 | 显示全部楼层
金牌,呵呵。

出145入215汤圆

 楼主| 发表于 2014-10-24 22:02:10 | 显示全部楼层
本帖最后由 dz20062008 于 2014-10-24 22:08 编辑


那你说说咋回事啊?你以为金牌就啥都懂啊?我又不是灌水灌出来的,注册时间长登录的多了自己不知不觉就金牌了。
找你的说法,站长都成神了。都不用使用?这符号了

看看自己的回复吧,别以为灌水就能没痕迹,劝你灌多了你就自然而然的消失了。


请自己看看自己一个主题也没有,都是灌水的回复,真怀疑你是不是搞电的。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-10-25 07:23:59 来自手机 | 显示全部楼层
595网上找人家现成的代码比较下看看,估计就能发现问题所在了

出0入0汤圆

发表于 2014-10-25 08:08:35 | 显示全部楼层
我用别的取模软件,无论怎么设定,都得不到和你一样的数据,还是看看你的数据是不是对吧

出145入215汤圆

 楼主| 发表于 2014-10-27 16:30:32 | 显示全部楼层
xiaobendan 发表于 2014-10-25 08:08
我用别的取模软件,无论怎么设定,都得不到和你一样的数据,还是看看你的数据是不是对吧 ...

谢谢你的回复!我已经弄好了,是数组指针i 的问题。是我对C语言不熟悉的原因,指针因该从0开始,我是从1开始的。我只学过Turbo C还是很久前的事,入门51单片机是用的汇编。现在我尝试使用C编程,用汇编要想写东西很麻烦,天天造车轮而且容易出现不稳定的情况。不过用来写接口时序很爽,时间可以精确取决于晶振的精度。

更正代码如下:
                 for(i=0;i<16;i++)
                         {
                          Send_2Byte(scan_tab[i*2],scan_tab[i*2+1]);                //扫描信号
                          SendSeg_2Byte(data_tab[i*2],data_tab[i*2+1]);        //数据输出
             delay_nms(5);
                         SendSeg_2Byte(0x00,0x00);           //关显示//
                         Send_2Byte(0x00,0x00);               //关显示//
                         }

出0入0汤圆

发表于 2014-10-27 16:53:41 | 显示全部楼层
仔细看手册,然后按照把595输出端当成并口来看待。1),确保595输出正确,2),确保按照点阵规则输出,从图片看,应该有LED被重复点亮了。亮度所以较高。

出145入215汤圆

 楼主| 发表于 2014-10-27 17:46:02 | 显示全部楼层
applex 发表于 2014-10-27 16:53
仔细看手册,然后按照把595输出端当成并口来看待。1),确保595输出正确,2),确保按照点阵规则输出,从图 ...

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

本版积分规则

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

GMT+8, 2024-7-23 12:37

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

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