发作品签到
专业版

74HC595

工程标签

1.1k
0
0
0

简介

74HC595 IO拓展模块

简介:74HC595 IO拓展模块
模块征集令
复刻成本:2

开源协议

LGPL 3.0

(未经作者授权,禁止转载)
创建时间:2025-04-01 13:43:38更新时间:2025-04-11 02:38:27

描述

项目简介

本模块是基于74HC595的IO拓展模块,可使用3个IO拓展32个输出pin;

项目功能

每一个拓展输出引脚都由排针引出,为了方便调试,同时在每个输出引脚并接了一个LED

项目参数

  • 可使用SPI对该模块进行控制,实测最高支持24M的SPI速率;
  • 也可以直接IO模拟控制时序,速度没有SPI快;

原理解析(硬件说明)

单级的74HC595原理图
image.png

74HC595 时序图
image.png

SHCP: 为时钟;
DS:数据输入;
STCP:数据同步,上升沿同步数据

为了方便程序控制,直接将MR#拉高,将OE#拉低

软件代码

为了防止写入数据的过程,输出引脚电平产生波动,写数据前先将STCP引脚拉高,数据写完后再拉低1us,再拉高;
image.png

基于Arduino的完整代码

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

typedef enum {
  EXPAND_IO_0 = 0,
  EXPAND_IO_1,
  EXPAND_IO_2,
  EXPAND_IO_3,
  EXPAND_IO_4,
  EXPAND_IO_5,
  EXPAND_IO_6,
  EXPAND_IO_7,
  EXPAND_IO_8,
  EXPAND_IO_9,
  EXPAND_IO_10,
  EXPAND_IO_11,
  EXPAND_IO_12,
  EXPAND_IO_13,
  EXPAND_IO_14,
  EXPAND_IO_15,
  EXPAND_IO_16,
  EXPAND_IO_17,
  EXPAND_IO_18,
  EXPAND_IO_19,
  EXPAND_IO_20,
  EXPAND_IO_21,
  EXPAND_IO_22,
  EXPAND_IO_23,
  EXPAND_IO_24,
  EXPAND_IO_25,
  EXPAND_IO_26,
  EXPAND_IO_27,
  EXPAND_IO_28,
  EXPAND_IO_29,
  EXPAND_IO_30,
  EXPAND_IO_31,
  EXPAND_IO_INVALID
} expan_io_pin_t;

typedef union {
  struct {
    uint32_t io_0 : 1;
    uint32_t io_1 : 1;
    uint32_t io_2 : 1;
    uint32_t io_3 : 1;
    uint32_t io_4 : 1;
    uint32_t io_5 : 1;
    uint32_t io_6 : 1;
    uint32_t io_7 : 1;
    uint32_t io_8 : 1;
    uint32_t io_9 : 1;
    uint32_t io_10 : 1;
    uint32_t io_11 : 1;
    uint32_t io_12 : 1;
    uint32_t io_13 : 1;
    uint32_t io_14 : 1;
    uint32_t io_15 : 1;
    uint32_t io_16 : 1;
    uint32_t io_17 : 1;
    uint32_t io_18 : 1;
    uint32_t io_19 : 1;
    uint32_t io_20 : 1;
    uint32_t io_21 : 1;
    uint32_t io_22 : 1;
    uint32_t io_23 : 1;
    uint32_t io_24 : 1;
    uint32_t io_25 : 1;
    uint32_t io_26 : 1;
    uint32_t io_27 : 1;
    uint32_t io_28 : 1;
    uint32_t io_29 : 1;
    uint32_t io_30 : 1;
    uint32_t io_31 : 1;
  } pin;
  uint32_t all_pin_info;
} expand_io_t;

expand_io_t g_expand_io = { 0 };

void expand_io_init(void) {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void expand_io_set_bit(uint32_t pin, uint32_t value) {
  if (pin >= EXPAND_IO_INVALID) {
    return;
  }
  if (value == 0) {
    g_expand_io.all_pin_info &= ~(0x01 << pin);
  } else {
    g_expand_io.all_pin_info |= (0x01 << pin);
  }
}

void expand_io_update(void) {
  digitalWrite(latchPin, HIGH);
  shiftOut(dataPin, clockPin, LSBFIRST, (g_expand_io.all_pin_info >> 0) & 0xff);
  shiftOut(dataPin, clockPin, LSBFIRST, (g_expand_io.all_pin_info >> 8) & 0xff);
  shiftOut(dataPin, clockPin, LSBFIRST, (g_expand_io.all_pin_info >> 16) & 0xff);
  shiftOut(dataPin, clockPin, LSBFIRST, (g_expand_io.all_pin_info >> 24) & 0xff);
  digitalWrite(latchPin, LOW);
  delayMicroseconds(1);
  digitalWrite(latchPin, HIGH);
}

void setup() {
  // put your setup code here, to run once:
  expand_io_init();
}

void loop() {
  // put your main code here, to run repeatedly:
  for (uint32_t i = 0; i < EXPAND_IO_INVALID; i++) {
    expand_io_set_bit(i, 1);
    expand_io_update();
    delay(100);
  }
  for (uint32_t i = 0; i < EXPAND_IO_INVALID; i++) {
    expand_io_set_bit(i, 0);
    expand_io_update();
    delay(100);
  }
}

实物图

727f015a421fb90e17538fae17751d7.jpg

dd0248dadcfe2796bf9579a793ccf09.jpg

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

附件

序号文件名称下载次数
1
WeChat_20250410230213.mp4
2
克隆工程
添加到专辑
0
0
分享
侵权投诉

工程成员

评论

全部评论(1)
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航