74HC595D驱动程序

1.介绍

74HC595D是以款串行输入并行输出的芯片,支持级连功能

2.引脚功能

Q0~Q7是并行输出

Q7'是串行输出,如果使用级连功能,只需将这个引脚接到下一块芯片的DS脚即可

MR是复位引脚 ,低电平有效

OE是使能引脚 , 低电平有效

DS是数据输入端

SHCP是控制数据移位的

STCP是将数据锁存在Q0-Q7上

3. 74hc595d初始化程序

我这里使用的是东软HR8P506单片机,其他单片机类似,IO口都配置成数字量推挽输出即可

void _74hc595d_Init(void)
{
	GPIO_InitSettingType x;
	
	x.Signal = GPIO_Pin_Signal_Digital;
    x.Dir = GPIO_Direction_Output;
    x.Func = GPIO_Reuse_Func0;
    x.ODE = GPIO_ODE_Output_Disable;
    x.DS = GPIO_DS_Output_Strong;
    x.PUE = GPIO_PUE_Input_Disable;
    x.PDE = GPIO_PDE_Input_Disable;
    GPIO_Init(GPIO_Pin_A17, &x);        //MR  PA17
    GPIO_Init(GPIO_Pin_A18, &x);        //STCP  PA18
    GPIO_Init(GPIO_Pin_A19, &x);        //SHCP  PA19
    GPIO_Init(GPIO_Pin_A20, &x);        //DS1  PA20
    GPIO_Init(GPIO_Pin_A21, &x);        //OE  PA21
	
}

4.驱动程序编写

先定义一下引脚的宏定义

#define MR(x)    x>=1?GPIO_SetBit(GPIO_Pin_A17):GPIO_ResetBit(GPIO_Pin_A17)
#define STCP(x)  x>=1?GPIO_SetBit(GPIO_Pin_A18):GPIO_ResetBit(GPIO_Pin_A18)
#define SHCP(x)  x>=1?GPIO_SetBit(GPIO_Pin_A19):GPIO_ResetBit(GPIO_Pin_A19)
#define   DS(x)  x>=1?GPIO_SetBit(GPIO_Pin_A20):GPIO_ResetBit(GPIO_Pin_A20)
#define   OE(x)  x>=1?GPIO_SetBit(GPIO_Pin_A21):GPIO_ResetBit(GPIO_Pin_A21)

编写驱动

void output(uint8_t data)
{
	int i = 0;
	MR(0); /* 清除之前的数据 */
	MR(1); /* 不使能复位 */
	OE(1); /* 不使能输出 */
	
	for(i = 0; i < 8; i++)
	{
		DS(((data >> i) & 0x01)); /* 将bit先放在DS引脚,等待脉冲移位出去 */
		SHCP(0); delay_ms(1);     /* 将SHCP引脚拉低,延时1ms */
		SHCP(1); delay_ms(1);     /* 将SHCP引脚拉高,延时1ms,这样就产生了时钟脉冲 */
		STCP(0); delay_ms(1);     /* 下面原理相同,没来一个数据就锁存一次 */
		STCP(1); delay_ms(1);
	}
	
	OE(0); /* 等待数据全部发送完,再使能输出 */
}

这里是从数据的地位开始移的,最后实现的效果就是写入一个数据比如0x01,那么第一个灯就会点亮

5.其他

这里简单说一下级连功能,使用级连时将第一块芯片的Q7'引脚接到下一块芯片的DS引脚,而其他的引脚SHCP,STCP,MR,OE则连接在一起共用一个IO口,比如:

这里是三块级连,使用的时候需要一次发8*3=24位数据。

所有相关的程序都在文章中了,程序测试是可以的,有问题评论区见

发布了18 篇原创文章 · 获赞 8 · 访问量 3147

猜你喜欢

转载自blog.csdn.net/qq_39295354/article/details/104031062