595点亮8*8点阵,出现重影。找很久了都没找到原因,求教

2020-01-23 14:47发布

具体如下,显示的数字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[i];                        //循环8次,从第0行到第7行                         
                HC595Process(LedDatDis[i]);

                Row_RCK = 0;                 //上升沿  输出移位寄存器锁存值
//                delay();
                Row_RCK        = 1;
//                delay();                                       
        }
}


void main()
{
        while(1)
        {
                HC595_0ut();
//                delay();

        }
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
lusson
1楼-- · 2020-01-23 20:45
本帖最后由 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;                                    
        }
}

def_2
2楼-- · 2020-01-23 21:14
感谢lusson,参考楼上的作法,修改下。

P2 = LEDRowDis[n];
HC595Process(LEDColDis2[n]);
P2 = 0xff

为什么只有  先打开行选——输送数据——再关掉行选。 才是正确的??

如果 先关掉行选——送数据——再打开行选      还会重影 而且整体亮度变得更暗。
如果 先送数据——开行选——关行选               正常显示,但是亮度非常暗
如果 先送数据——关行选——开行选               还是重影,影子略暗些
如果 先关行选——开行选——送数据               最严重,重影亮度和他一样亮
如果 先开行选——关行选——送数据               最严重,无重影,几乎不亮!

有人能解释吗??
aheadlead
3楼-- · 2020-01-23 21:22
如果 先送数据——开行选——关行选               正常显示,但是亮度非常暗

开行选—“略”加延时—关行选
Soul.art
4楼-- · 2020-01-23 22:59
 精彩回答 2  元偷偷看……
jinshaopu
5楼-- · 2020-01-24 03:13
这就是所谓的消隐吧
def_2
6楼-- · 2020-01-24 06:17
aheadlead 发表于 2012-7-26 11:09
如果 先送数据——开行选——关行选               正常显示,但是亮度非常暗

开行选—“略”加延时—关行 ...

赞!!可以哈

一周热门 更多>