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); /* 等待数据全部发送完,再使能输出 */
}
/* 简化版
* 不使能复位,并一直保持输出(MR通过15K电阻接VCC,OE引脚直接接地)
* 只需要DS,STCP和SHCP便可完成控制
*/
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位数据。
所有相关的程序都在文章中了,程序测试是可以的,有问题评论区见