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
先试一下全亮,然后隔行亮吧
我试过了每一帧全量一帧,还是老样子,而且背景微量了。隔行亮不理解啥意思,是慢扫描?还是要抽字模成隔行的? 从你的scan_tab来看,你的显示的那行是高电平,意思是这个点阵是共阳极,显示数据应该是低亮高灭的了?
那么你在关显示的时候,怎么输出的是两个0x00呢?
还有关显示怎么放在最后呢?
试试看这样,先关显示,就是传送两个0XFF,然后传送scan_tab,然后再传送显示数据,然后再延时,再循环,看看是什么效果 看起来显示数据也是0灭1亮的,不明白了,高手给指教一下吧 时序不对。 多
加个_nop_(); 本帖最后由 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);
fulitun 发表于 2014-10-23 20:32
多
加个_nop_();
试过了,不是速度的问题。 饭桶 发表于 2014-10-23 19:58
时序不对。
我直接向子程序给数据就没有出现这现象,输出了很整齐可以左右上下跳动的直线。这说明我的硬件连接没问题,子程序没问题。估计是调用数组的方式不对,或者其它问题,就是找不到啊 看不出啥问题,可能你取的字模有问题,与你的硬件连接有出入吧 金牌,呵呵。 本帖最后由 dz20062008 于 2014-10-24 22:08 编辑
lawuweijin 发表于 2014-10-24 12:20
金牌,呵呵。
那你说说咋回事啊?你以为金牌就啥都懂啊?我又不是灌水灌出来的,注册时间长登录的多了自己不知不觉就金牌了。
找你的说法,站长都成神了。都不用使用?这符号了
看看自己的回复吧,别以为灌水就能没痕迹,劝你灌多了你就自然而然的消失了。
请自己看看自己一个主题也没有,都是灌水的回复,真怀疑你是不是搞电的。。
595网上找人家现成的代码比较下看看,估计就能发现问题所在了 我用别的取模软件,无论怎么设定,都得不到和你一样的数据,还是看看你的数据是不是对吧 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); //关显示//
}
仔细看手册,然后按照把595输出端当成并口来看待。1),确保595输出正确,2),确保按照点阵规则输出,从图片看,应该有LED被重复点亮了。亮度所以较高。 applex 发表于 2014-10-27 16:53
仔细看手册,然后按照把595输出端当成并口来看待。1),确保595输出正确,2),确保按照点阵规则输出,从图 ...
的确是被重复点亮了,是我指针弄错了,已经弄好了。
页:
[1]