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}
Q0−Q7:并行输出引脚
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到存储寄存器