移位寄存器74HC165D主要功能:并行输入转串行输出
芯片封装:
引脚定义:
Q7
‾
\overline{\text{Q7}}
Q7:上一阶段的互补输出
Q
7
{\rm Q7}
Q7:最后阶段的串行输出
D
S
{\rm DS}
DS:串行数据输出 (级联时作为输入端)
CE
‾
\overline{\text{CE}}
CE:时钟使能输入 (可直接接地)
PL
‾
\overline{\text{PL}}
PL:异步并联负载输入 LOAD
功能描述:
CE
‾
\overline{\text{CE}}
CE拉低时时钟信号才有效,在
CE
‾
\overline{\text{CE}}
CE拉高时,
PL
‾
\overline{\text{PL}}
PL在下降沿时异步并联装载D0-D7的信号,然后将
CE
‾
\overline{\text{CE}}
CE拉低,此时
C
P
{\rm CP}
CP时钟被使能,在
C
P
{\rm CP}
CP的上升沿时,D0-D7的数据依次从
Q
7
{\rm Q7}
Q7输出,
Q7
‾
\overline{\text{Q7}}
Q7为互补输出,级联时上一片的
Q
7
{\rm Q7}
Q7接下一片的
D
S
{\rm DS}
DS
程序示例(以两片74HC165D级联为例):
/*
* app_Hc165_Ctrl.h
*
* Created on: Nov 7, 2023
* Author: Administrator
*/
#ifndef INC_APP_HC165_CTRL_H_
#define INC_APP_HC165_CTRL_H_
#include "main.h"
#include "gpio.h"
//定义用于操作74HC595的IO端口
#define _HC_CLK_H do {HAL_GPIO_WritePin(HC165_CLK_GPIO_Port, HC165_CLK_Pin, GPIO_PIN_SET);} while(0)
#define _HC_CLK_L do {HAL_GPIO_WritePin(HC165_CLK_GPIO_Port, HC165_CLK_Pin, GPIO_PIN_RESET);} while(0)
#define _HC_LOAD_H do {HAL_GPIO_WritePin(HC165_LOAD_GPIO_Port, HC165_LOAD_Pin, GPIO_PIN_SET);} while(0)
#define _HC_LOAD_L do {HAL_GPIO_WritePin(HC165_LOAD_GPIO_Port, HC165_LOAD_Pin, GPIO_PIN_RESET);} while(0)
void _74hc165_init(void);
void _74hc165_read_2byte(unsigned char date[2]);
#endif /* INC_APP_HC165_CTRL_H_ */
/*
* app_Hc165_Ctrl.c
*
* Created on: Nov 7, 2023
* Author: Administrator
*/
#include "delay.h"
#include "app_Hc165_Ctrl.h"
//初始化74hc165
void _74hc165_init(void)
{
_HC_LOAD_H; //PL拉高为下降沿做准备
_HC_CLK_H;
}
//读取2个74HC165级联
void _74hc165_read_2byte(unsigned char data[2])
{
unsigned char i;
uint16_t temp = 0;
_HC_LOAD_L; //产生一个下降沿用于装载D0-D7的状态
_HC_LOAD_H; //拉高为下次的下降沿做准备
if (HAL_GPIO_ReadPin(HC165_OUT_GPIO_Port, HC165_OUT_Pin))
{
temp |= 0x01; //最高位直接读出,在下面的for循环中会被移动到最高位,所以是temp |= 0x01
}
for (i=0; i<15; i++) //最高不用移位即可读数,故循环(16-1)次,依次把次高位移到最高位,第一级74hc165优先读取
{
temp = temp<<1;
_HC_CLK_L; //准备上升沿,次高位D(n-1)移动到D(n)
delay_us(2);
_HC_CLK_H;
if (HAL_GPIO_ReadPin(HC165_OUT_GPIO_Port, HC165_OUT_Pin))
{
temp |= 0x01;
}
}
//将16位数据分离成两个8位数据
data[0] = (unsigned char)(temp & 0x00ff); //第二级74hc165的数据
data[1] = (unsigned char)((temp>>8) & 0x00ff); //第一级74hc165的数据
}
使用示例:
unsigned char key2state[2] = {0, 0};
_74hc165_read_2byte(key2state);