51单片机在led点阵中,我编的是心形灯,为什么灯全亮了

#include "reg52.h"
#include "intrins.h"

typedef unsigned char u8;
typedef unsigned int u16;

sbit SRCLK=P3^6;
sbit RCL=P3^5;
sbit SER=P3^4;

u16 code duan[]={0xff,0x48,0x44,0x22,0x44,0x48,0x30,0x00};
u16 code wei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

void delay(u8 i)
{
while(i--);
}

void Hc(u8 led)
{
u8 a;
SRCLK=0;
RCL=0;
for(a=0;a {
SER=led>>7;
led<<=1;
SRCLK=1;
nop();
nop();
SRCLK=0;
}
RCL=1;
nop();
nop();
RCL=0;
}

void main()
{
u16 j;
while(1)
{
for(j=0;j<8;j++)
{
P0=wei[j];
Hc(duan[j]);
delay(100);
Hc(0x00);
}
}
}

没看见你的硬件原理图。不好说问题在哪。

猜测你应该用了74LS595电路。移位写入的部分看着好像有问题,或者是没发全。

附上一段74LS595的写入程序:
/*********************************************/
//函数名称:IO_74ls595_send(unsigned int dat)
//函数功能:数据发送函数(32位)
//返 回 值:无
/*********************************************/
void IO_74ls595_send(unsigned long dat)
{
uchar data i;

IO_74ls595_RCLK = 0;    //: 锁存RCLK输出0
IO_74ls595_SRCLK = 0;       //:移位寄存器时钟=0

for(i=0;i<32;i++)       //:0xffffffff,高位在前,低位在后
{
    if(dat&0x80000000)      //利用&运算 取数
    {
        IO_74ls595_SER=1;
    }
    else
    {
        IO_74ls595_SER=0;
    }
    IO_74ls595_SRCLK = 1;
    dat = dat<<1;
    IO_74ls595_SRCLK = 0;
}

IO_74ls595_RCLK = 1;    //: CS44-RCLK输出1
    _nop_();    _nop_();
IO_74ls595_RCLK = 0;    //: CS44-RCLK输出0

}

该段代码经过验证,是正确可用的。供参考。