关于74HC165的使用及一些经验

本文最后更新于 2025年3月20日 晚上

关于并串移位寄存器74HC165的使用及一些经验

前言

最近的一些项目用到了74HC165移位寄存器,此处介绍一些该器件的使用方法和使用经验

正文

74HC165 移位寄存器简介

74HC165是一种串并行输入/串行输出的8位移位寄存器,由NXP公司推出。它具有8个输入引脚和8个输出引脚,可以通过串行输入获得8位并行输出。
74HC165采用并行和串行两种输入方式,输入数据可以通过Q7引脚进行串行输出,并通过时钟信号控制数据的传输。

74HC165 引脚说明

引脚示意图如下:


引脚说明:

引脚 功能
PL# 并行输入控制(低电平有效)
CE# 时钟使能(低电平有效)
CP 时钟信号输入(上升沿触发)
Q7 串行输出
Q7# 互补串行输出
DS 串行输入
D0~D7 并行输入
VCC 3.3V电源输入
GND 接地

控制时序图:


采样(PL 低)
当PL为低电平时,移位寄存器处于采样状态:它读取引脚D0…D7 并存储它们。从D0到D7口输入的并行数据将被异步地读取进寄存器内,它还在Q7引脚中输出D7的值(因此Q7 == D7)。
换档(PL高电平)
当PL为高电平时,移位寄存器处于采样状态。它保留了从输入中读取的值,并允许您通过Q7引脚一次读取一位。您可以通过脉冲CP(串行时钟)上升沿来读取下一位,依次读取D7-D0的数据。
串行输入(级联)
以DS串行输入为信号源,PL为高电平,每一次时钟上升沿,输出寄存器Q0~Q7的数据向高位移动一位,DS的数据替代原本Q0的数据,Q7原本的数据溢出。因此可以利用此特性作级联,将另一74HC165的串行输出口Q7与此74HC165的串行输入口DS相连。两个移位寄存器同时进行并行装载,然后同时进行串行输出。因为PL为高电平,当Q7溢出后,新的Q0信号来自于上一个移位寄存器的Q7信号。

74HC165 使用经验

此器件电控编程简单,大致模板如下:

读取部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
uint8_t Chip74HC165_Read(void)
{
uint8_t data = 0; // 存储读取到的数据
HAL_GPIO_WritePin(PL_GPIO_Port, PL_Pin, GPIO_PIN_SET); // 拉高PL停止并行输入
HAL_GPIO_WritePin(CE_GPIO_Port, CE_Pin, GPIO_PIN_RESET); // 拉低CE使能时钟
for (uint8_t i = 0; i < 8; i++)
{
HAL_GPIO_WritePin(CP_GPIO_Port, CP_Pin, GPIO_PIN_RESET); // 拉高CP时钟触发上升沿输出
HAL_Delay(1); // 数据输出延迟约几十us,此处用1ms简要代替
data |= (HAL_GPIO_ReadPin(Q7_GPIO_Port, Q7_Pin) << i); // 读取
HAL_Delay(10); // 延时10ms模拟时钟
HAL_GPIO_WritePin(CP_GPIO_Port, CP_Pin, GPIO_PIN_RESET); // 拉低CP时钟线

}
HAL_GPIO_WritePin(PL_GPIO_Port, PL_Pin, GPIO_PIN_RESET); // 拉低PL使能并行输入
HAL_GPIO_WritePin(CE_GPIO_Port, CE_Pin, GPIO_PIN_SET); // 拉高CE关闭时钟
return data;
}
C

使用中遇到的问题:

  • Q7输出数据时延迟约20~50us,读取时可适当插入部分延时过程
  • CP检测到上升沿时是将存储数据后移一位而非输出当前位,换句话说,CP线的第一个上升沿会让Q7输出D6的数据而非D7的数据,Q7接口永远输出当前存储数据的最后一位,每次检测到时钟上升沿时将存储数据后移一位,最高位变成0
  • CE线可以悬空,不影响正常使用,担心干扰可以加入防干扰电路

结尾声明

本文属于东北大学盘古实验室,未经允许严禁转载,若有错误请指出,不胜感激。

作者 plumyT@PanGu_NEU


关于74HC165的使用及一些经验
http://coderliuchina.github.io/2025/03/20/2025-3-20/
作者
CoderLiu@NEU_China
发布于
2025年3月20日
许可协议