74LS165芯片单颗与级联的万能代码|2021-10-6


前言

74LS165芯片单颗与级联的万能代码


一、代码

1.引脚配置:

32单片机引脚配置:
74LS165 串行数据输出(9脚|Q7) 配置为输入
74LS165 时钟(2脚|CP) 配置为输出
74LS165 移位控制/置入控制(1脚|PL) 配置为输出
51单片机引脚定义
根据实际接线定义到对应的IO口即可

32单片机引脚配置如下:

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();


  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, LS165_CLK_Pin | LS165_YW_Pin, GPIO_PIN_SET);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = LS165_DATA_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(LS165_DATA_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pins : PAPin PAPin */
  GPIO_InitStruct.Pin = LS165_CLK_Pin | LS165_YW_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

51单片机引脚配置如下:

sbit ls165_PL = P1^0;	//移位控制/置入控制
sbit ls165_CP = P1^1;	//时钟
sbit ls165_DATA = P1^2;	//数据输出
//IO口根据个人实际接线更改

2.替换

32单片机引脚操作替换

#define LS165_PL_0 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET)
#define LS165_PL_1 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET)

#define LS165_CP_0 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)
#define LS165_CP_1 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)

#define LS165_data HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) //读取

#define data_bit 1 //165级联数

51单片机引脚操作无需写替换只需替换下列代码即可

#define uint8_t unsigned char
#define uint16_t unsigned int
#define data_bit 1 //165级联数 

3.延时函数

void delay(uint8_t i)
{
  while (i--)
    ;
}

4.数据读取

uint8_t LS165_Read(uint8_t bit)
{
  uint8_t State[data_bit]; //数据
  delay(10);               //稍做延时
  LS165_PL_0;              //置位,读入8位并行数据
  delay(10);
  LS165_PL_1;                           //移位,封锁并行输入,串行转换开始
  for (size_t i = 0; i < data_bit; i++) //根据级联数进行重复操作
  {
    LS165_CP_1;                    //初始化时钟
    State[i] = 0;                  //数据初始化
    for (size_t j = 0; j < 8; j++) //循环8次
    {
      State[i] = State[i] << 1;       //数据左移一位,保存数据
      if (LS165_data == GPIO_PIN_SET) //判断数据引脚状态|GPIO_PIN_SET = 1
      {
        State[i]++;
      }
      LS165_CP_0; //拉低时钟线
      delay(10);
      LS165_CP_1; // 上升沿, 数据移位, 读取下一位
      delay(10);
    }
  }
  return (State[bit - 1]); //返回所选级联芯片的数据
}

注:上方for语句中的 size_t类型 它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小。size_t 类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版。
如果这个有报错就添加 cstddef头文件(应该可以解决QAQ)
size_t类型 一键直达

5.函数使用

uint8_t DATA = 0;
DATA = LS165_Read(?);//?为选择读取芯片的8位数据  1就是选择第一个芯片的数据,以此类推
//函数前面加 "~" 就是取反8位数据 即源数据 为 0X00 ~ 取反后为 0XFF
//数据也可直接赋值给整组的端口

总结

我怕自己忘记,先发个帖,如有需要请随意使用.
附件:74LS165英文数据手册

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值