595点亮8*8点阵,出现重影。找很久了都没找到原因,求教
具体如下,显示的数字2,在相应扫描行的上一行(有时是下一行)有微弱的光。不知是什么原因。我已经简化到只用一个595和一个8*8点阵来测试了,还是不行。尝试了各种延时....望各路大侠来指点迷津,臣不胜受恩感激。/* C51 code */
#include<reg52.h>
sbit Row_SCK= P3^6; //数据输入时钟线
sbit Row_SI = P3^4; //数据线
sbit Row_RCK = P3^5; //输出锁存器存储时钟线
unsigned char LEDRowDis[] = //选择哪一行,低电平输出
{
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f
};
unsigned char LedDatDis[] =
{
0x00,0x38,0x44,0x08,0x10,0x24,0x7C,0x00, //2
// 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, //一
};
void delay(void)
{
unsigned int i,j;
for(i=0;i<1;i++)
for(j=0;j<5;j++);
}
void HC595Process(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++) //循环8次,依次存入最高位数据,并向左移一位
{
if(dat & 0x80) //数据最高位
{
Row_SI = 1;
}
else
{
Row_SI = 0;
}
Row_SCK = 0 ;
// delay();
Row_SCK = 1 ; //上升沿锁存数据
// delay();
dat <<= 1;
}
}
void HC595_0ut()
{
unsigned char i;
for(i=0;i<8;i++)
{
P2 = LEDRowDis; //循环8次,从第0行到第7行
HC595Process(LedDatDis);
Row_RCK = 0; //上升沿输出移位寄存器锁存值
// delay();
Row_RCK = 1;
// delay();
}
}
void main()
{
while(1)
{
HC595_0ut();
// delay();
}
}
本帖最后由 lusson 于 2012-7-26 10:35 编辑
在切换到下一行显示前先把显示关闭。
void HC595_0ut()
{
unsigned char i;
for(i=0;i<8;i++)
{
P2 = 0xff;
HC595Process(LedDatDis[ i ]);
P2 = LEDRowDis[ i ]; //循环8次,从第0行到第7行
Row_RCK = 0; //上升沿输出移位寄存器锁存值
Row_RCK = 1;
}
}
感谢lusson,参考楼上的作法,修改下。
P2 = LEDRowDis;
HC595Process(LEDColDis2);
P2 = 0xff
为什么只有先打开行选——输送数据——再关掉行选。 才是正确的??
如果 先关掉行选——送数据——再打开行选 还会重影 而且整体亮度变得更暗。
如果 先送数据——开行选——关行选 正常显示,但是亮度非常暗
如果 先送数据——关行选——开行选 还是重影,影子略暗些
如果 先关行选——开行选——送数据 最严重,重影亮度和他一样亮
如果 先开行选——关行选——送数据 最严重,无重影,几乎不亮!
有人能解释吗?? 如果 先送数据——开行选——关行选 正常显示,但是亮度非常暗
开行选—“略”加延时—关行选 def_2 发表于 2012-7-26 11:05 static/image/common/back.gif
感谢lusson,参考楼上的作法,修改下。
P2 = LEDRowDis;
你为何不按人家给你方法做,偏要自己画蛇添足
void HC595_0ut()
{
unsigned char i;
for(i=0;i<8;i++)
{
* P2 = 0xff; //时序坚决不能搞错
HC595Process(LedDatDis);
* P2 = LEDRowDis; //循环8次,从第0行到第7行时序坚决不能搞错
Row_RCK = 0; //上升沿输出移位寄存器锁存值
// delay();
Row_RCK = 1;
// delay();
}
}
这就是所谓的消隐吧{:lol:}{:lol:} aheadlead 发表于 2012-7-26 11:09 static/image/common/back.gif
如果 先送数据——开行选——关行选 正常显示,但是亮度非常暗
开行选—“略”加延时—关行 ...
赞!!可以哈 def_2 发表于 2012-7-26 12:25 static/image/common/back.gif
赞!!可以哈
多好!~! 应该是没有消隐吧。 def_2 发表于 2012-7-26 11:05 static/image/common/back.gif
感谢lusson,参考楼上的作法,修改下。
P2 = LEDRowDis;
你把时序画出来就明白了。SEG和COM。。。
或者说你把怎么在点阵上显示出这个数字搞清楚应该会知道为什么。 拿来参考一下,,,
页:
[1]