用的某
开发板,其原理图如下:
通过4个74HC595控制点阵的行与列
通过一次性向74HC595发送4个字节的方式,分别控制LED点阵的行与列
现碰到问题如下,为简单描述,用开发板自带的程序向老师们请教(这是显示一个点的程序):
============================================================
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
sbit SCK=P3^6;
sbit LCK=P3^5;
sbit SDI=P3^4;
void HC595_Send(uchar dat1,uchar dat0,uchar dat2,uchar dat3);
void main()
{
while(1)
{
HC595_Send(0xff,0xfe,0x80,0x00);
}
}
void HC595_Send(uchar dat1,uchar dat0,uchar dat2,uchar dat3)
{
uchar i;
SCK=1;
LCK=1;
for(i=0;i<8;i++)
{
SDI=dat0&0x01; //从高位到低位
dat0>>=1;
SCK=0;
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
}
for(i=0;i<8;i++)
{
SDI=dat1&0x01; //从高位到低位
dat1>>=1;
SCK=0;
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
}
for(i=0;i<8;i++)
{
SDI=dat2&0x01; //从高位到低位
dat2>>=1;
SCK=0;
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
}
for(i=0;i<8;i++)
{
SDI=dat3&0x01; //从高位到低位
dat3>>=1;
SCK=0;
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
}
LCK=0; //下面是输出时钟
_nop_();
_nop_();
LCK=1;
_nop_();
_nop_();
}
=====================================================
这个自带的程序dat0和dat1搞混了,在这里不是重点
我的疑问点在于,通过实验:
如果
while(1)
{
HC595_Send(0xff,0xfe,0x80,0x00);
}
我增加一行,同时去掉while(1)
HC595_Send(0xff,0xfe,0x80,0x00);
HC595_Send(只能显示一个点的数据);
那么一共显示两个点,但应该是第一个点瞬间显示一下,之后595数据更新,显示第二个点,不更新不变化
可实际上这两个点一直常亮,经过多次试验都是如此
如果有多个HC595_Send,按照道理每次595更新一次数据后点阵对应的点亮,上次更新前的不应该亮了
可实际做多次试验却是每次HC595_Send对应的点阵都亮
请老师指点!
一周热门 更多>