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

移位寄存器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);
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值