74HC595D移位寄存器使用方法及例程

74HC595D移位寄存器的使用

芯片封装:
在这里插入图片描述

引脚定义:
D S {\rm DS} DS:串行数据输入引脚
OE ‾ \overline{\text{OE}} OE:输出使能控制引脚
S T C P {\rm STCP} STCP:存储寄存器时钟输入引脚(上升沿时,数据从移位寄存器转存到存储寄存器)
S H C P {\rm SHCP} SHCP:移位寄存器时钟引脚
Q 7 S {\rm Q7S} Q7S:串行数据输出引脚(一般用于级联)
Q 0 − Q 7 {\rm Q0-Q7} Q0Q7:并行输出引脚
M R {\rm MR} MR:低电平时清空寄存器

功能描述:
为了迎合习惯叫法,程序中引脚重命名如下:
DAT DS引脚 串行数据输入
CLK SHCP引脚 移位寄存器时钟
LOAD STCP引脚 存储寄存器时钟

CLK引脚,在CLK每来一次上升沿时,移位寄存器从DAT引脚读入一位数据,在最早读入的数据成为最高位,读取完后在LOAD的上升沿,移位寄存器的8位数据被装载到存储寄存器中

以下是单片(未级联)74HC595D的程序:

/*
 * app_Hc595_Ctrl.h
 *
 *  Created on: Nov 4, 2023
 *      Author: Administrator
 */

#ifndef INC_APP_HC595_CTRL_H_
#define INC_APP_HC595_CTRL_H_


#include "main.h"
#include "gpio.h"


//定义用于操作74HC595的IO端口
#define	_HC_CLK_H	do {HAL_GPIO_WritePin(HC595_CLK_GPIO_Port, HC595_CLK_Pin, GPIO_PIN_SET);} while(0)
#define _HC_CLK_L	do {HAL_GPIO_WritePin(HC595_CLK_GPIO_Port, HC595_CLK_Pin, GPIO_PIN_RESET);} while(0)
#define	_HC_LOAD_H	do {HAL_GPIO_WritePin(HC595_LOAD_GPIO_Port, HC595_LOAD_Pin, GPIO_PIN_SET);} while(0)
#define _HC_LOAD_L	do {HAL_GPIO_WritePin(HC595_LOAD_GPIO_Port, HC595_LOAD_Pin, GPIO_PIN_RESET);} while(0)
#define	_HC_DAT_H	do {HAL_GPIO_WritePin(HC595_DAT_GPIO_Port, HC595_DAT_Pin, GPIO_PIN_SET);} while(0)
#define _HC_DAT_L	do {HAL_GPIO_WritePin(HC595_DAT_GPIO_Port, HC595_DAT_Pin, GPIO_PIN_RESET);} while(0)


void SendByte(uint8_t data);
void SendCommand(uint8_t cmd);
void SendData(uint8_t data);
void DisplayLedState(const uint8_t LedState[8]);


#endif /* INC_APP_HC595_CTRL_H_ */

/*
 * app_Hc595_Ctrl.c
 *
 *  Created on: Nov 4, 2023
 *      Author: Administrator
 */

#include "delay.h"
#include "app_Hc595_Ctrl.h"

// 发送一个字节到74HC595芯片
void SendByte(uint8_t data) {
    uint8_t i;
    for (i = 0; i < 8; i++) {
    	_HC_CLK_L;	// 时钟信号置低
        if ((data & 0x80) == 0x80)
        	_HC_DAT_H;	// 输出数据为1
        else
        	_HC_DAT_L;	// 输出数据为0
        data <<= 1;
        _HC_CLK_H;	// 时钟信号置高,数据移位
        delay_us(2);
        _HC_CLK_L;
    }
	_HC_LOAD_H;
	delay_ms(1);
	_HC_LOAD_L;
}

// 发送命令到74HC595芯片(锁存数据)
void SendCommand(uint8_t cmd) {
	_HC_LOAD_L;	// 时钟信号置低
    SendByte(cmd);  // 发送数据
    _HC_LOAD_H;	// 时钟信号置高,锁存数据
}

// 发送数据到74HC595芯片(显示数据)
void SendData(uint8_t data) {
	_HC_LOAD_H;	// 时钟信号置高
    SendByte(data);  // 发送数据
    _HC_LOAD_L;	// 时钟信号置低
}

// 显示配置的所有led状态
void DisplayLedState(const uint8_t LedState[8]) {
    uint8_t row;
    for (row = 0; row < 8; row++) {
        SendData(LedState[row]);
    }
}





在主程序或者任务中调用:

SendCommand(0xff);	//向595芯片发送命令,装载11111111到存储寄存器
### 74HC595D 芯片概述 74HC595D 是一种具有8位串入并出移位寄存器和存储寄存器的器件,带有输出锁存器和3态输出能力。该芯片广泛应用于扩展微控制器I/O端口数量的应用场景中[^1]。 ### 管脚定义与功能说明 - **DS(Data Serial input)**: 数据串行输入引脚,在上升沿时接收数据。 - **SH_CP(Shift register clock pin)**: 移位寄存器时钟脉冲输入引脚,用于触发数据从一位移动到下一位。 - **ST_CP(Storage register clock pin)**: 存储寄存器时钟脉冲输入引脚,当其变为高电平时会把当前移位寄存器中的内容复制到输出锁存器里。 - **OE(Output enable, active low)**: 输出使能引脚(低有效),控制所有Q0-Q7输出的状态;通常接至电源负极以保持常开状态。 - **MR(Master reset, active low)**: 主复位引脚(低有效),可以清除内部的数据而不需要改变其他任何设置。 - **Q0~Q7S**: 并行数据输出端子,对应于移位后的每一位数据。 - **QS** 和 **DS/Q7'**: 这两个引脚允许多个74HC595之间级联起来形成更宽的数据总线或者创建流水灯效果等复杂模式[^2]. ### 应用实例分析 对于一些需要大量GPIO资源来驱动LED矩阵、LCD屏幕或者其他外围设备的情况来说,通过使用74HC595这样的IC可以帮助减少主控单元上的压力以及简化布板设计。例如,在某些项目中可能会见到三片74HC595串联在一起使用的案例,它们共同负责处理来自单片机的一组连续比特流,并将其转换成适合外部组件读取的形式。具体而言就是先经由第一个元件完成初步加载过程后再传递给下一个直到最后一个为止,期间每一个都会按照预定顺序依次保存一部分信息以便后续调用[^4]. 另外值得注意的是,在涉及到FPGA开发过程中也经常能看到这种类型的接口被采用作为优化手段之一——即借助外置硬件辅助实现原本可能较为繁琐的功能模块构建任务,从而达到节约成本的目的同时还能提高系统的整体性能表现[^5]. ```cpp // 示例代码:Arduino平台下的简单测试程序 byte dataPin = 11; byte latchPin = 12; byte clockPin = 13; void setup() { pinMode(dataPin, OUTPUT); pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); } void loop() { digitalWrite(latchPin, LOW); // 开始传输前拉低latch引脚 shiftOut(dataPin, clockPin, MSBFIRST, B10101010); // 发送一组交替高低电平信号 digitalWrite(latchPin, HIGH); // 结束后再次抬升latch引脚确认更新显示 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值