标题: 74hc595程序不能运行,有电路和程序,请高手指教一下 [打印本页]

作者: 董亚伟    时间: 2014-11-6 06:44
标题: 74hc595程序不能运行,有电路和程序,请高手指教一下
  1. #include<reg51.h>
  2. #include<intrins.h>

  3. sbit RCK=P3^6;  //(11脚)上升沿时移位寄存器的数据进入数据存储寄存器.
  4. sbit SCK=P3^5;         //(12脚)上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。
  5. sbit SI=P3^4; //(14脚)串行数据输入


  6. void HC595SendData(unsigned char SendVal)//发送数据
  7. {  
  8.   unsigned char i;
  9.   for(i=0;i<8;i++)
  10.    {
  11. if((SendVal<<i)&0x80)
  12. {
  13. SI=1;
  14. }
  15. else
  16. {
  17. SI=0;
  18. }

  19. SCK=0;//从SCK产生一上升沿(移入数据)
  20. _nop_();
  21. SCK=1;
  22.    }
  23. }
  24. void HC595ShowData()//RCK产生一上升沿(输出数据)
  25. {
  26. RCK=0;
  27. _nop_();
  28. RCK=1;
  29. }
  30. void main()

  31. {
  32. HC595SendData(0xf0);
  33. HC595ShowData();
  34. }
复制代码


QQ截图20141106063330.png (36.01 KB, 下载次数: 487)

QQ截图20141106063330.png

作者: skyhanfeng    时间: 2014-11-6 08:28
这里应该判断下。改为
for(i=0;i<8;i++)
{
        if(((SendVal<<i)&0x80) != 0)
        {
                SI=1;
        }
        else
        {
                SI=0;
        }
作者: dgahz    时间: 2014-11-6 15:36
给你正确的:
#include<reg51.h>
#include<intrins.h>
sbit RCK=P3^5;  //(11脚)上升沿时移位寄存器的数据进入数据存储寄存器.
sbit SCK=P3^6;         //(12脚)上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。
sbit SI=P3^4; //(14脚)串行数据输入
void HC595SendData(unsigned char SendVal)//发送数据
{  
  unsigned char i;
  SCK=0;
  RCK=0;
  for(i=0;i<8;i++)
   {
                if((SendVal<<i)&0x80)
                {
                SI=1;
                }
                else
                {
                SI=0;
                }
                SCK=1;//从SCK产生一上升沿(移入数据)
            _nop_();
                SCK=0;
   }
}
void HC595ShowData()//RCK产生一上升沿(输出数据)
{
                RCK=0;
                _nop_();
                RCK=1;
}
void main()
{
          while(1)
          {
                HC595SendData(0xf0);
                HC595ShowData();
          }
}
作者: dgahz    时间: 2014-11-6 16:14
这样也行:
#include<reg51.h>
#include<intrins.h>

sbit RCK=P3^5;  //(11脚)上升沿时移位寄存器的数据进入数据存储寄存器.
sbit SCK=P3^6;         //(12脚)上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。
sbit SI=P3^4; //(14脚)串行数据输入


void HC595SendData(unsigned char SendVal)//发送数据
{  
  unsigned char i;
         RCK=0;
  for(i=0;i<8;i++)
   {
                if((SendVal<<i)&0x80)
                {
                SI=1;
                }
                else
                {
                SI=0;
                }

                SCK=0;//从SCK产生一上升沿(移入数据)
                _nop_();
                SCK=1;
   }
}
void HC595ShowData()//RCK产生一上升沿(输出数据)
{
                RCK=0;
                _nop_();
                RCK=1;
}
void main()

{
          while(1)
          {
                HC595SendData(0xf0);
                HC595ShowData();
          }
}
作者: beill88    时间: 2014-11-7 20:17
时钟信号和锁存信号搞反了
作者: 董亚伟    时间: 2014-11-9 23:09
dgahz 发表于 2014-11-6 15:36
给你正确的:
#include
#include

谢谢  你的程序能用    还想问下我输入了0xff或0x00,为什么灯都在亮,没有变化,怎么让它全灭
作者: 董亚伟    时间: 2014-11-9 23:09
dgahz 发表于 2014-11-6 16:14
这样也行:
#include
#include

还想问下我输入了0xff或0x00,为什么灯都在亮,没有变化,怎么让它全灭
作者: dgahz    时间: 2014-11-10 09:59
另改给你
#include<reg51.h>
#include<intrins.h>
sbit RCK=P3^5;  //(11脚)上升沿时移位寄存器的数据进入数据存储寄存器.
sbit SCK=P3^6;         //(12脚)上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。
sbit SI=P3^4; //(14脚)串行数据输入
void HC595SendData(unsigned char SendVal)//发送数据
{
  unsigned char i;
   SI=0;
  SCK=0;
  RCK=0;
  for(i=0;i<8;i++)
   {
                if((SendVal<<i)&0x80)
                {
                SI=1;
                }
                else
                {
                SI=0;
                }
                SCK=1;//从SCK产生一上升沿(移入数据)
            _nop_();
                SCK=0;
   }
}
void HC595ShowData()//RCK产生一上升沿(输出数据)
{
                RCK=0;
                _nop_();
                RCK=1;
}
void main()
{                       
          while(1)
          {
                                HC595SendData(0xFF);
                           HC595ShowData();
          }
}
作者: dgahz    时间: 2014-11-10 10:04
这个也可
#include<reg51.h>
#include<intrins.h>

sbit RCK=P3^5;  //(11脚)上升沿时移位寄存器的数据进入数据存储寄存器.
sbit SCK=P3^6;         //(12脚)上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。
sbit SI=P3^4; //(14脚)串行数据输入


void HC595SendData(unsigned char SendVal)//发送数据
{  
  unsigned char i;
         RCK=0;
                 SI=0;
  for(i=0;i<8;i++)
   {
                if((SendVal<<i)&0x80)
                {
                SI=1;
                }
                else
                {
                SI=0;
                }

                SCK=0;//从SCK产生一上升沿(移入数据)
                _nop_();
                SCK=1;
   }
}
void HC595ShowData()//RCK产生一上升沿(输出数据)
{
                RCK=0;
                _nop_();
                RCK=1;
}
void main()

{
          while(1)
          {
                HC595SendData(0x00);
                HC595ShowData();
          }
}




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1