74HC595控制8个LED流水灯 实现不了功能

2019-07-15 18:37发布

#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);
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
2474344106
1楼-- · 2019-07-17 11:54
juncheng214 发表于 2014-9-4 08:32
ds=cy   cy是什么?

CY是PSW程序状态字的D7位,移位类指令temp=temp<<1被移除来的 最高位 会存放在CY里面 所以DS=CY就是将TEMP被移除的哪一位送给DS然后串行输入给74HC595
157442843
2楼-- · 2019-07-17 16:20
 精彩回答 2  元偷偷看……
157442843
3楼-- · 2019-07-17 18:40
#include<reg52.h>
#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();
        }
}
}
//试下看行不!

qq.JPG
2474344106
4楼-- · 2019-07-17 22:08
157442843 发表于 2014-9-5 00:29
#include
#include
#define uint unsigned int

可以流水只是顺序不对  ,为什么是右移temp>>=1  为了让第一个灯亮  我们不是要将0XFE(1111 1110)左移8位吗? 这样Q7Q6Q5Q4Q3Q2Q1Q0才是(1111 1110)啊
66888888
5楼-- · 2019-07-17 23:49
好哇,继续努力
157442843
6楼-- · 2019-07-18 01:03
 精彩回答 2  元偷偷看……

一周热门 更多>