这里使用4级(即4个595串联)
#include "reg52.h"
#include "intrins.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
//定义74HC595控制管脚
sbit SRCLK=P3^4; //移位寄存器时钟输入
sbit rCLK=P3^5; //存储寄存器时钟输入
sbit SER=P3^3; //串行数据输入
/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1时,大约延时10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
/*******************************************************************************
* 函 数 名 : delay_ms
* 函数功能 : ms延时函数,ms=1时,大约延时1ms
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void hc595_write_data(u8 dat1,u8 dat2,u8 dat3,u8 dat4) //dat1 写是第一个595芯片输出;dat2是写第2个595芯片输出、如(0x01,0x02,0,0)
{
u8 i=0;
for(i=0;i<8;i++)//循环8次即可将一个字节写入寄存器中
{
SER=dat4>>7;//优先传输一个字节中的高位
dat4<<=1;//将低位移动到高位
SRCLK=0;
// delay_10us(1);
_nop_();
SRCLK=1;
_nop_();
// delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中
}
for(i=0;i<8;i++)
{
SER=dat3>>7;
dat3<<=1;
SRCLK=0;
// delay_10us(1);
_nop_();
SRCLK=1;
_nop_();
// delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中
}
for(i=0;i<8;i++)
{
SER=dat2>>7;
dat2<<=1;
SRCLK=0;
// delay_10us(1);
_nop_();
SRCLK=1;
_nop_();
// delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中
}
for(i=0;i<8;i++)
{
SER=dat1>>7;
dat1<<=1;
SRCLK=0;
// delay_10us(1);
_nop_();
SRCLK=1;
_nop_();
// delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中
}
rCLK = 0;
delay_10us(1);
rCLK = 1;
}
/*
使用芯片595,第一个和第二个
main()
{
hc595_write_data(0x01,0x02,0,0);
.............
}
*/