本人初学C51单片机,在实现流水灯效果时,首先使用如下程序进行控制:
#include <reg52.h>
unsigned int a;
void main()
{
while(1)
{
int i=1;
while (i<=256)
{
P1=~i;
a=50000;
while (a--);
i*=2;
}
}
}
发现当最下方第8个LED灯亮后,经短暂延迟后最上方第1个LED才点亮。而若使用以下程序:
#include <reg52.h>
unsigned int a;
void main()
{
while(1)
{
int i=1,n=1;
while (n<=8)
{
P1=~i;
a=50000;
while (a--);
i*=2;
n++;
}
}
}
则无此现象,能正常实现LED循环点亮。按本人粗浅的认识,两个程序运行的效果应该不足以造成肉眼能分辨的差异,其中原因请大家多多指教。
1\2\4\8\16\32\64\128这样是8次去分析就知道,当128延时后应该怎么处理和造成的现象就知道了.
不知道你这个问题是否已经解决, 如果还没有解决的话:利用软件延时自动生成相应的延时函数,注意要选好符合当前单片机的指令集。
#include <REGX52.H>
#include <INTRINS.H> // 包含nop函数
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k)
;
} while (--j);
} while (--i);
}
void test2()
{
while (1)
{
P2 = 0xFE;
Delay500ms();
P2 = 0xFF;
Delay500ms();
}
}
void main()
{
test2();
}
🐱🐱🐱
根据参考资料提供的LED点阵屏介绍和代码,可以看出问题出在 _74HC595_WriteByte 函数中。具体来说,该函数在写入字节时,是从高位(第7位)到低位(第0位)依次写入的。因此当最下方第8个LED灯亮起后,需要等待8个时钟才能写入第1位,即最上方的LED才能点亮,因此出现了延迟现象。
为了优化这一问题,可以考虑改变 _74HC595_WriteByte 函数的写入顺序,从低位到高位依次写入。修改后的代码如下:
void _74HC595_WriteByte(unsigned char Byte)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
SER = Byte & (0x01 << i);
SCK = 1;
SCK = 0;
}
RCK = 1;
RCK = 0;
}
这样修改后,可以保证在写入第1位时,不需要等待前面的位都被写入完毕,从而解决延迟问题。