这个也可 #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(); } } |
另改给你 #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-6 16:14 还想问下我输入了0xff或0x00,为什么灯都在亮,没有变化,怎么让它全灭 |
dgahz 发表于 2014-11-6 15:36 谢谢 你的程序能用 还想问下我输入了0xff或0x00,为什么灯都在亮,没有变化,怎么让它全灭 |
时钟信号和锁存信号搞反了 |
这样也行: #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(); } } |
给你正确的: #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(); } } |