当前位置: 首页 > news >正文

用74HC595和74HC165搞定Arduino引脚扩展:手把手教你串并转换与按键扫描

用74HC595和74HC165搞定Arduino引脚扩展:手把手教你串并转换与按键扫描

在嵌入式开发中,微控制器的IO引脚资源常常捉襟见肘。当你的项目需要控制多个LED、读取矩阵键盘或驱动数码管时,Arduino有限的引脚数量很快就会成为瓶颈。本文将带你深入理解两种经典的数字逻辑芯片——74HC595(串行转并行)和74HC165(并行转串行),通过实际案例演示如何用它们扩展Arduino的IO能力。

1. 认识我们的工具:74HC595与74HC165

1.1 74HC595:串行转并行的魔术师

74HC595是一款8位串行输入、并行输出的移位寄存器,它能将Arduino的3个数字引脚扩展为8个输出引脚。其核心特性包括:

  • 8位移位寄存器:可存储8位二进制数据
  • 串行输入(DS):一次一位地接收数据
  • 时钟输入(SHCP):控制数据移位的节奏
  • 存储寄存器时钟(STCP):将移位寄存器中的数据锁存到输出
  • 并行输出(Q0-Q7):同时输出8位数据
  • 级联能力:多个芯片可串联使用,扩展更多输出
// 典型引脚连接示例 const int dataPin = 8; // DS (14) const int latchPin = 9; // STCP (12) const int clockPin = 10; // SHCP (11)

1.2 74HC165:并行转串行的采集专家

与74HC595相反,74HC165是一款8位并行输入、串行输出的移位寄存器,它能将8个输入信号通过串行方式送回Arduino。主要特点:

  • 8位并行输入(A-H):同时采集8路信号
  • 串行输出(Q7):将数据一位一位输出
  • 时钟输入(CLK):控制数据移位
  • 并行加载(PL):低电平时加载并行数据
  • 级联能力:多个芯片可串联扩展输入
// 典型引脚连接示例 const int loadPin = 5; // PL (1) const int clockPin = 6; // CLK (2) const int dataPin = 7; // Q7 (9)

提示:两种芯片都采用5V供电,与Arduino电压兼容,但要注意输出电流限制(74HC595每个引脚最大35mA)

2. 硬件连接与电路设计

2.1 74HC595驱动LED阵列

让我们构建一个8位LED控制电路:

  1. 将74HC595的VCC接5V,GND接地
  2. 连接Arduino引脚:
    • 数字8 → DS (14)
    • 数字9 → STCP (12)
    • 数字10 → SHCP (11)
  3. 每个输出引脚(Q0-Q7)通过220Ω电阻连接LED正极
  4. LED负极接地

电平转换注意事项

信号类型74HC595输入Arduino输出
高电平≥3.15V4.5-5V
低电平≤1.35V0-0.5V

2.2 74HC165读取按键矩阵

构建4x4矩阵键盘读取电路:

  1. 将74HC165的VCC接5V,GND接地
  2. 连接Arduino引脚:
    • 数字5 → PL (1)
    • 数字6 → CLK (2)
    • 数字7 → Q7 (9)
  3. 将16个按键按4行4列排列
  4. 使用两个74HC165级联,分别连接行和列

注意:按键需加上拉电阻(10kΩ)确保稳定状态

3. 软件实现与Arduino代码

3.1 74HC595控制LED流水灯

void setup() { pinMode(dataPin, OUTPUT); pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); } void loop() { for(int i = 0; i < 8; i++) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, 1 << i); digitalWrite(latchPin, HIGH); delay(200); } }

代码解析

  1. latchPin拉低准备数据传输
  2. shiftOut()函数发送数据(LSBFIRST表示最低位先发送)
  3. latchPin拉高更新输出
  4. 循环实现LED流水效果

3.2 74HC165读取按键状态

byte readShiftRegister() { byte data = 0; digitalWrite(loadPin, LOW); delayMicroseconds(5); digitalWrite(loadPin, HIGH); for(int i = 0; i < 8; i++) { data |= digitalRead(dataPin) << (7 - i); digitalWrite(clockPin, HIGH); delayMicroseconds(1); digitalWrite(clockPin, LOW); } return data; }

关键时序参数

参数最小值典型值
PL脉冲宽度20ns50ns
CLK上升/下降时间6ns15ns
数据建立时间10ns20ns

4. 高级应用与故障排除

4.1 多芯片级联技术

当需要更多IO时,可以级联多个芯片:

74HC595级联连接

  1. 第一片的DS接Arduino
  2. 第一片的Q7'接第二片的DS
  3. 所有芯片共享SHCP和STCP

74HC165级联连接

  1. 第一片的Q7接第二片的SER
  2. 所有芯片共享CLK和PL
  3. 只读取最后一片的Q7

4.2 常见问题与解决方案

问题1:输出信号不稳定

  • 检查电源滤波:在VCC和GND间加0.1μF电容
  • 确保时钟信号干净:缩短连线,避免交叉干扰

问题2:按键读取错误

  • 增加去抖动处理:
if(currentState != lastState) { lastDebounceTime = millis(); } if((millis() - lastDebounceTime) > debounceDelay) { if(currentState != buttonState) { buttonState = currentState; } }

问题3:级联时序错乱

  • 降低时钟频率:尝试将delayMicroseconds(1)增加到5或10
  • 检查芯片使能端(CE)是否正确连接

4.3 性能优化技巧

  1. 使用SPI硬件加速
SPI.begin(); SPI.transfer(value); // 替代shiftOut
  1. 并行更新技术
// 准备所有数据后再锁存 digitalWrite(latchPin, LOW); for(int i=0; i<chipCount; i++) { shiftOut(dataPin, clockPin, MSBFIRST, data[i]); } digitalWrite(latchPin, HIGH);
  1. 中断驱动读取
attachInterrupt(digitalPinToInterrupt(buttonPin), readKeys, FALLING);

5. 实战项目:可编程LED显示板

结合两种芯片,我们构建一个能显示图案和响应按键的完整系统:

  1. 硬件配置

    • 主控:Arduino Uno
    • 显示:8x8 LED矩阵(使用2片74HC595)
    • 输入:16键键盘(使用2片74HC165)
  2. 系统架构

Arduino → 74HC595×2 → LED矩阵 Arduino ← 74HC165×2 ← 键盘矩阵
  1. 核心代码结构
void displayPattern(byte pattern[8]) { for(int row=0; row<8; row++) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, ~pattern[row]); // 行数据 shiftOut(dataPin, clockPin, MSBFIRST, 1 << row); // 列选择 digitalWrite(latchPin, HIGH); delayMicroseconds(300); // 控制亮度 } } byte readKeypad() { byte rows = readShiftRegister(); byte cols = readShiftRegister(); return rows | (cols << 4); }

在调试这类项目时,逻辑分析仪是极有价值的工具,它能直观显示移位寄存器的时钟和数据信号,帮助验证时序是否正确。

http://www.jsqmd.com/news/827613/

相关文章:

  • 如何在3分钟内实现Rhino到Blender的无缝3D模型导入
  • 你正在找Windows系统修复服务?这4个品牌值得对比 - 资讯速览
  • Windows驱动管理终极指南:Driver Store Explorer完全使用手册
  • 《世毫九本原论》核心章节(CSDN全球首发版权定戳)
  • 构建高可靠Python数据处理流水线的工程实践
  • 番茄小说下载器:3种方法实现离线阅读自由,告别网络限制
  • 忘记压缩包密码怎么办?三步快速找回加密文件的实用指南
  • 开源对话机器人框架Ruuh:模块化设计与工程实践指南
  • 番茄小说下载器:3种方法轻松保存小说,告别网络限制
  • ExtJS ComboBox 实战:从配置优化到动态数据加载的进阶指南
  • 基于MCP协议构建智能科研数据助手:连接ELabFTW与AI大模型
  • Arduino 结合 ADXL335 实现姿态感知与OLED动态显示
  • 5分钟让魔兽争霸3在现代电脑上焕然一新的终极方案
  • 别再死记硬背了!用STM8单片机实战项目(数码管+矩阵键盘)帮你理解期末考点
  • 终极免费激活方案:KMS智能激活工具完全指南
  • 英飞凌 Aurix2G TC3XX GTM 模块实战:从 MCAL 配置到复杂外设联动
  • GPX Studio完整方案:在浏览器中高效编辑GPS轨迹的实战指南
  • 别只用roots了!MATLAB解方程全家桶:roots、fzero、fsolve到底怎么选?
  • MPLAB XC编译器许可证全解析:从免费版到专业版的选型与实战
  • TranslucentTB:三步打造Windows任务栏透明效果的终极指南
  • 【CV大模型SAM实战】从Mask保存到区域提取:一站式图像分割后处理指南
  • Python测试体系看似庞大、细节繁多
  • 从仿真结果反推工艺:如何用Sentaurus和Silvaco的Gummel曲线诊断你的NPN三极管设计问题
  • uniapp项目图标引入翻车实录:从彩色图标失效到导航栏不显示,这些坑我帮你踩过了
  • ARM TLB机制与虚拟化加速:TLBIP指令与TLBID域深度解析
  • ESD防护全解析:从失效机理到全流程防护设计实践
  • Chrome浏览器本地Markdown文件高效阅读终极指南
  • 基于MCP协议的AI工具调用服务器:omega-point-convergence-mcp实战指南
  • Latest-adb-fastboot-installer-for-windows:基于自动化驱动管理架构的Android开发环境配置工具深度解析
  • STM32F4 ADC多通道采样,DMA传输数据老是不对?可能是这个CubeMx配置细节没注意