________________________________________
双74HC595驱动8*8点阵,为何只有第一行延时,其他行一闪而过
------------------------------------------------------------------
#include "reg51.h"
#include "intrins.h"
//定义变量
unsigned char temp = 0xfe;
unsigned char KEY_NUM = 0;
sbit LEDARRAY_DI=P1^0;
sbit LEDARRAY_CLK=P1^1;
sbit LEDARRAY_LAT=P1^2;
unsigned char code play[4][8] = {0x83,0x80,0x00,0x00,0x00,0x00,0x01,0xC1,
0x0C,0x00,0x80,0x80,0x01,0x01,0x00,0x30,
0x30,0x00,0x01,0x01,0x80,0x80,0x00,0x0C,
0xC1,0x01,0x00,0x00,0x00,0x00,0x80,0x83};
//****************************************************
//发送一个字节数据
//****************************************************
void Send_Byte( unsigned char dat)
{
unsigned char i;
LEDARRAY_CLK = 0;
_nop_();
LEDARRAY_LAT = 0;
_nop_();
for( i = 0 ; i < 8 ; i++ )
{
LEDARRAY_DI =dat&0x01?1:0;
LEDARRAY_CLK = 1; //上升沿发送数据
// _nop_();
LEDARRAY_CLK = 0;
// _nop_();
dat >>= 1;
}
}
void Latch()
{
LEDARRAY_LAT = 1; //锁存数据
_nop_();
LEDARRAY_LAT = 0;
_nop_();
}
//****************************************************
//MS延时函数(12M晶振下测试)
//****************************************************
void Delay_ms(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
void Hc595_led()
{
unsigned char j,k;
static unsigned char i=0;
for(j = 0; j < 4 ;j++) //循环右移
{
temp = 0x7f;
for(k = 0 ; k < 8 ; k++)
{
Send_Byte(temp); //列选择
Send_Byte(play[j][k]); //行数据
Latch(); //锁存数据
temp = (temp>>1)|0x80;
}
Delay_ms(200);
}
}
//****************************************************
//主函数
//****************************************************
void main()
{
while(1)
{
Hc595_led();
}
}
___________________________________________________
双74HC595驱动8*8点阵,为何只有第一行延时,其他行一闪而过
--------------------------------------------------------------------------------------
=================================================
只亮temp = 0x7f; 这一行;而temp = (temp>>1)|0x80的行一闪而过
只亮temp = 0x7f; 这一行;而temp = (temp>>1)|0x80的行一闪而过
只亮temp = 0x7f; 这一行;而temp = (temp>>1)|0x80的行一闪而过
只亮temp = 0x7f; 这一行;而temp = (temp>>1)|0x80的行一闪而过
只亮temp = 0x7f; 这一行;而temp = (temp>>1)|0x80的行一闪而过
只亮temp = 0x7f; 这一行;而temp = (temp>>1)|0x80的行一闪而过
=================================================
我是在做8*8点阵仿霓虹灯的四角旋转
————————————
四角达到霓虹灯闪烁的要求
但是只是第一列的灯很亮,
其他列的灯很暗,
而且都是一闪而过
————————————
郁闷
temp = 0x7f;
for(k = 0;k >1)|0x80;
}
Delay_ms(200);
————
不对啊
————
我验证过了,看上去你的这个程序似乎可以通过,等晚点测试,
不知道为什么用 Delay_ms(200)延时1S 秒不能通过,
4次循环,是为了让周围的四组灯连成一个圈的效果,共送4组数据。
8次循环,是为了让每一组8列数据分别送到屏的8列上。(你之前程序,就会使得最后一列送出的数据整整延时200mS,而其他的列没有延时就会一闪而过。)
因此主要问题,就是8次循环的工作要不停的送,连续送足延时时间。然后再切换另外一组数据。
1)每次一组数据保证20mS之内送完,使得频率在50Hz以上,画面不闪。
2)每组数据,保证足够的总点亮时间,使得画面停留时间足够看清。调节时间可改变旋转速度。
假如是个数字8,你每一次延时,是不是一横一竖都要延时呢!!!!!!!!!!
追答看你的电路!
你自己想想数码管吧!这个和数码管的原理的一样的
我要四角的灯一起转,不是一个一个角的转,懂!!!!!!!!!!!!!