#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
}
该段代码经过验证,是正确可用的。供参考。