74HC165并转串芯片使用方法及代码示例

最近在开发一款新型的微机综合测控保护装置时,由于开入数量的增加,笔者所使用的STM32F103RCT6引脚数量无法满足开发要求,故选择了74HC165这款并转串芯片来处理开入功能,最后亦成功实现了架构师提出的功能要求。在开发过程中笔者亦遇到了些小问题,因此决定记录下来并对有需要的人有所帮助。
首先先来介绍一下74HC165这款芯片,74HC165是一款高速CMOS八位并入串出移位寄存器,电压为2.0~6.0V,驱动电流为+/-5.2 mA。74HC165引脚兼容TTL(LSTTL)系列(定义于JEDEC标准№.7A)。从官方的datasheet可知74HCT165是一个8位串行或并行输入/串行输出移位寄存器。该设备具有一个串行数据输入(DS),八个并行数据输入(D0到D7)和两个互补串行输出(Q7和Q7)。当并行加载输入(PL)为低电平时,从D0到D7的数据异步加载到移位寄存器;当PL为高电平时,数据在DS处串行地进入寄存器。当时钟使能输(CE)为低电平时,数据在C的低-高转换上移位≤ 输入时,CE上的高电平将禁用CP输入。输入端包括箝位二极管,这使得限流电阻的使用接口输入电压超过Vcc。
MC74HC165A是相同的引脚到LS165。设备输入与标准CMOS输出兼容;带上拉电阻,它们与LSTL输出兼容.这个设备是8−互补输出位移位寄存器从最后阶段开始。数据可以通过以下方式加载到寄存器中:并行的或串行的。当串行移位/并行负载输入低,并行异步加载数据。当序列号移位/并行负载输入高,数据串行加载到时钟或时钟抑制的上升沿(见功能表)。2号−输入NOR时钟可以通过组合两个独立的时钟源或通过指定一个时钟输入起到时钟抑制的作用.

74HC165并转串芯片使用方法及代码示例_第1张图片
74HC165并转串芯片使用方法及代码示例_第2张图片

以下为笔者代码,因方便理解及芯片的ram和rom都十分充裕,因此笔者并没有对代码进行优化,需要的朋友可以使用循环语句或其他方式对代码进行修改。
笔者想在这里强调的重点也是在开发过程中遇到的问题便是第一位的读取,是在读取完数据后就已经可以读到的了,不需要拉低再拉高时钟线,不然会造成错位,这也是笔者在一开始阅读datasheet时不仔细造成的后果。

#include “include.h”
#define SET_KR_SH HAL_GPIO_WritePin(KR_SH_GPIO_Port, KR_SH_Pin, GPIO_PIN_SET)
#define CLR_KR_SH HAL_GPIO_WritePin(KR_SH_GPIO_Port, KR_SH_Pin, GPIO_PIN_RESET)
#define SET_KR_SCL HAL_GPIO_WritePin(KR_SCL_GPIO_Port, KR_SCL_Pin, GPIO_PIN_SET)
#define CLR_KR_SCL HAL_GPIO_WritePin(KR_SCL_GPIO_Port, KR_SCL_Pin, GPIO_PIN_RESET)
#define SET_KR_SDA HAL_GPIO_WritePin(KR_SDA_GPIO_Port, KR_SDA_Pin, GPIO_PIN_SET)
#define CLR_KR_SDA HAL_GPIO_WritePin(KR_SDA_GPIO_Port, KR_SDA_Pin, GPIO_PIN_RESET)
#define READ_KR_SDA (HAL_GPIO_ReadPin(KR_SDA_GPIO_Port,KR_SDA_Pin))
/***************************************************************************************************
功能描述: 74HC165并转串芯片读取函数
输 入:
输 出:
全局变量:
调用模块:
其 他: 读取上来后通过位处理按开入顺序排列好
***************************************************************************************************/

  u16 Read_Kr(void)
  {
	u16 temp = 0;
	u16 temp1 =0;
	SET_KR_SCL; //初始化
	SET_KR_SH;  //初始化
	
  	CLR_KR_SH;  //读取数据
	delay_us(20);
	SET_KR_SH;  //停止读取数据
	delay_us(4);

		
	if(READ_KR_SDA == GPIO_PIN_SET)	    //3
		temp1 =1<<3;
	    temp |=temp1;



		CLR_KR_SCL;
		delay_us(4);																							
		SET_KR_SCL;  //上升沿
		delay_us(4);
		if(READ_KR_SDA == GPIO_PIN_SET)	    //3
			 temp1 =1<<2;
		   temp |=temp1;
		

		
		CLR_KR_SCL;
		delay_us(4);
		SET_KR_SCL;  //上升沿
		delay_us(4);
		if(READ_KR_SDA == GPIO_PIN_SET)	     //4
			 temp1 =1<<1;
			 temp |=temp1;
		
		
		
		CLR_KR_SCL;
		delay_us(4);
		SET_KR_SCL;  //上升沿
		delay_us(4);                         
		if(READ_KR_SDA == GPIO_PIN_SET)	        //5
		   temp1 =1;
		   temp |=temp1;
		
		
		
		CLR_KR_SCL;
		delay_us(4);
		SET_KR_SCL;  //上升沿
		delay_us(4);
		if(READ_KR_SDA == GPIO_PIN_SET)	          //6
		   temp1 =1<<7;
		   temp |=temp1;
		
		
		CLR_KR_SCL;
		delay_us(4);  
		SET_KR_SCL;  //上升沿
		delay_us(4);
		if(READ_KR_SDA == GPIO_PIN_SET)	           //7
		   temp1 =1<<6;
		   temp |=temp1;
		
		
		
		CLR_KR_SCL;
		delay_us(4);
		SET_KR_SCL;  //上升沿
		delay_us(4);
		if(READ_KR_SDA == GPIO_PIN_SET)             //8	
		   temp1 =1<<5;
		   temp |=temp1;
		
		
		
				
		CLR_KR_SCL;
		delay_us(4);
		SET_KR_SCL;  //上升沿
		delay_us(4);
		if(READ_KR_SDA == GPIO_PIN_SET)	             //9
			temp1 =1<<4;
			temp |=temp1;
			temp=~temp;     
		 	temp<<=1;
		
	
		return temp; 	
}	

你可能感兴趣的:(单片机,嵌入式,stm32,c语言)