#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp;
uint i;
void delay(uint);
void WR_5951();
void OUT_5951();
sbit SH_CP=P0^0;
sbit ST_CP=P0^2;
sbit DS=P0^1;
uchar code TB[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
/*将数据输入移位寄存器*/
void WR_5951()
{ SH_CP=0;
for(i=0;i<8;i++)
{temp=temp<<1;
DS=CY;
SH_CP=1;
SH_CP=0;
}
}
/*将数据输入寄存器并输出*/
void OUT_5951()
{ ST_CP=0;
ST_CP=1;
delay(1);
ST_CP=0;
delay(1);
}
/*延时子程序delay(100)约延时1S*/
void delay(uint z)
{
uint x,y;
for(x=1760;x>0;x--)
for(y=z;y>0;y--);
}
/*主程序*/
void main()
{
for(i=0;i<8;i++)
{
temp=TB[i];
WR_5951();
OUT_5951();
delay(1000);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
CY是PSW程序状态字的D7位,移位类指令temp=temp<<1被移除来的 最高位 会存放在CY里面 所以DS=CY就是将TEMP被移除的哪一位送给DS然后串行输入给74HC595
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit SH_CP=P0^0;
sbit ST_CP=P0^2;
sbit DS=P0^1;
uchar code TB[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void Delay100us() //@12.000MHz
{
unsigned char i;
_nop_();
i = 47;
while (--i);
}
/*延时子程序约延时1S*/
void Delay1000ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 154;
k = 122;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/*将数据输入移位寄存器*/
void WR_5951(uchar temp)
{
unsigned char i;
for(i=0;i<8;i++)
{
SH_CP=0;
Delay100us();
DS=temp&0x01;
temp>>=1;
SH_CP=1;
Delay100us();
}
SH_CP=0;
}
/*将数据输入寄存器并输出*/
void OUT_5951()
{
ST_CP=0;
Delay100us();
ST_CP=1;
}
/*主程序*/
void main()
{
uchar i;
while(1)
{
for(i=0;i<8;i++)
{
WR_5951(TB[i]);
OUT_5951();
Delay1000ms();
}
}
}
//试下看行不!
可以流水只是顺序不对 ,为什么是右移temp>>=1 为了让第一个灯亮 我们不是要将0XFE(1111 1110)左移8位吗? 这样Q7Q6Q5Q4Q3Q2Q1Q0才是(1111 1110)啊
一周热门 更多>