dz20062008 发表于 2014-10-23 18:32:18

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

如题,做了个595两级级联,结果就悲剧了。不管是行扫描还是列扫描都会出现5958位的分界。搞不清楚是硬件问题还是软件问题。特来求救~~

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

图片如下:





/*-----------------------------------------------*/
#include<reg52.h>   
#include<intrins.h>
#define uchar unsigned char
#define uintunsigned 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={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={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,scan_tab);                //扫描信号
                       delay_nms(1);
                      SendSeg_2Byte(data_tab,data_tab);        //数据输出
                       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:请无视我的金牌会员,我其实是金牌菜鸟,谢谢!

muniao 发表于 2014-10-23 18:56:12

先试一下全亮,然后隔行亮吧

dz20062008 发表于 2014-10-23 19:16:49

muniao 发表于 2014-10-23 18:56
先试一下全亮,然后隔行亮吧

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

xiaobendan 发表于 2014-10-23 19:49:28

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

xiaobendan 发表于 2014-10-23 19:51:42

看起来显示数据也是0灭1亮的,不明白了,高手给指教一下吧

饭桶 发表于 2014-10-23 19:58:47

时序不对。      

fulitun 发表于 2014-10-23 20:32:34


加个_nop_();

dz20062008 发表于 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,scan_tab);
                      SendSeg_2Byte(data_tab,data_tab);        //数据输出

                       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);

dz20062008 发表于 2014-10-24 03:50:06

fulitun 发表于 2014-10-23 20:32

加个_nop_();

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

dz20062008 发表于 2014-10-24 03:55:46

饭桶 发表于 2014-10-23 19:58
时序不对。

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

xiaobendan 发表于 2014-10-24 09:09:28

看不出啥问题,可能你取的字模有问题,与你的硬件连接有出入吧

lawuweijin 发表于 2014-10-24 12:20:21

金牌,呵呵。

dz20062008 发表于 2014-10-24 22:02:10

本帖最后由 dz20062008 于 2014-10-24 22:08 编辑

lawuweijin 发表于 2014-10-24 12:20
金牌,呵呵。

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

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


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

yklstudent 发表于 2014-10-25 07:23:59

595网上找人家现成的代码比较下看看,估计就能发现问题所在了

xiaobendan 发表于 2014-10-25 08:08:35

我用别的取模软件,无论怎么设定,都得不到和你一样的数据,还是看看你的数据是不是对吧

dz20062008 发表于 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,scan_tab);                //扫描信号
                      SendSeg_2Byte(data_tab,data_tab);        //数据输出
             delay_nms(5);
                       SendSeg_2Byte(0x00,0x00);           //关显示//
                       Send_2Byte(0x00,0x00);             //关显示//
                       }

applex 发表于 2014-10-27 16:53:41

仔细看手册,然后按照把595输出端当成并口来看待。1),确保595输出正确,2),确保按照点阵规则输出,从图片看,应该有LED被重复点亮了。亮度所以较高。

dz20062008 发表于 2014-10-27 17:46:02

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

的确是被重复点亮了,是我指针弄错了,已经弄好了。
页: [1]
查看完整版本: 595级联出现数据数据分界线(错位)求解