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到存储寄存器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值