如题,做了个595两级级联,结果就悲剧了。不管是行扫描还是列扫描都会出现5958位的分界。搞不清楚是硬件问题还是软件问题。特来求救~~
连接方式就是你懂的方式,16×16单 {MOD}点阵,两片一组级联,分别做行列信号。选了行扫描595输出2003驱动,扫描信号为高。
图片如下:
3.jpg (564.2 KB, 下载次数: 0)
下载附件
2014-10-23 18:29 上传
/*-----------------------------------------------*/
#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:请无视我的金牌会员,我其实是金牌菜鸟,谢谢!
我试过了,还是出现错行。不管我换行扫还是列扫都会出现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);
一周热门 更多>