• 利用芯片74hc165为单片机增加输入扩展端口proteus仿真arduino


    我们前面的博文《输入端口少如何扩展?74hc148或74ls148级联在arduino中实现16转4的应用》介绍了148,148输入后可以立即输出到数码管,可以说它是自带编BCD编码器的。而今天这里我们主要介绍的74hc165是没有编码器,这里我们以proteus为仿真环境,arduino作为编译代码环境。


    文章原出处: https://blog.csdn.net/haigear/article/details/132911752

    一、芯片介绍

    1、图片介绍

    常规我们拿到的165的芯片是这样的,芯片手册中的管脚顺序及命名方式和proteus中的有所差别(左边的图为芯片手册中的图,右边的为proteus中的图)
    在这里插入图片描述
    很明显,我们看到proteus中9号管脚为SO,而芯片手册中的9号管脚为Qh,名称不但作用都是输出脚。

    2、管脚功能描述

    由于我们重点在proteus中仿真,所以我们这里只对proteus中的管脚进行功能的介绍:

    管脚名:功能描述:
    D0…D7并行输入脚
    INH并联负载(低电平有效)
    SH/LD即我们说的CP串行时钟
    CLK时钟使能(低电平有效)
    SO串行输出,即我们常说的DS
    QH反相串行输出(通常不使用)
    SI串行输入*

    二、原理图

    这里我们只是为了测试其功能,简单的使用了一个排阻和8个按钮接在了并行输入端口D0~D7上。
    在这里插入图片描述

    三、测试代码

    几个管脚的定义这里我们说明一下,好让大家能够与上表列出的管脚对应,这里的datapin就是so管脚,clockpin就是CLK管脚,latchPin就是SH/LD管脚。

    1、代码

    下面的代码只是一个简单的演示代码,所以就不过多的做解释了。

    /* Main.ino file generated by New Project wizard
     *
     * Created:   周四 9月 14 2023
     * Processor: ATmega328P
     * Compiler:  Arduino AVR (Proteus)
     */
    
    const int dataPin = 2; // 数据引脚
    const int clockPin = 3; // 时钟引脚
    const int latchPin = 4; // 锁存引脚
    const int numRegisters = 1; // 74HC165芯片个数
    
    byte registerData[numRegisters]; // 存储74HC165芯片数据的数组
    
    void setup() {
      pinMode(dataPin, INPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(latchPin, OUTPUT);
      
      // 初始化串行通信
      Serial.begin(9600);
    }
    
    void loop() {
      // 读取74HC165芯片数据
      readData();
      
      // 打印每个输入引脚状态
      for (int i = 0; i < numRegisters * 8; i++) {
        Serial.print("Input ");
        Serial.print(i);
        Serial.print(": ");
        Serial.println(bitRead(registerData[i / 8], i % 8));
      }
      
      delay(1000);
    }
    
    void readData() {
      digitalWrite(latchPin, LOW);
      delayMicroseconds(10);
      digitalWrite(latchPin, HIGH);
      
      for (int i = numRegisters - 1; i >= 0; i--) {
        registerData[i] = shiftIn(dataPin, clockPin, MSBFIRST);
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    对于初学者,我们看到shiftIn或者shiftOut这样的函数,都是arduino自带的为移位操作特别定制的函数,可以在arduino的IDE中reference里面查找。

    2、驱动流程

    驱动这个芯片我们分为以下几步:
    第一,设置好各个输入键的电平状态
    第二,操作SH/LD管脚也就是代码中的Latchpin,使之从低电平保持5个周期以上后置为高电平,让芯片检测到一个上升沿跳变
    第三,给CLK脚,也就是程序中的clockpin一个下降沿的跳变,而且每检测到一次下降沿的跳变,so端口,也就是datapin就会输出一位(这也就是传说中的移位)

    四、测试效果

    在这里插入图片描述
    有了上面的基本电路后,我们就可以实现对arduino或者其他的stm32或者8051单片机的输入端口的扩展,比如我们加一个键盘矩阵或者多个按钮,那就再也不用担心输入端口不够啦。如果键盘数量大于8个,那我们可以通过SO和下一个165芯片的SI进行级联实现8xn的端口扩展,比如做一个电子琴,那就要多级联几个才足够我们实现多个音阶。

    文章随时可能更新,请注明原出处:https://blog.csdn.net/haigear/article/details/132911752

    级联有一片博文可以供大家参考,我这里就不赘述:https://www.cnblogs.com/F-91/p/14713514.html

  • 相关阅读:
    Java里使用AspectJ实现AOP
    域前期信息收集
    新手必看!!超详细!STM32-基本定时器
    关于Greenplum Platform Extension Framework(PXF)
    整理 js 日期对象的详细功能,使用 js 日期对象获取具体日期、昨天、今天、明天、每月天数、时间戳等,以及常用的日期时间处理方法
    Vatee万腾外汇市场新力量:vatee科技决策力
    【Mac】增加 safari 体验的插件笔记
    SQL基础语句
    WPF 制作 Windows 屏保
    用VS Code搞Qt6:编译源代码与基本配置
  • 原文地址:https://blog.csdn.net/haigear/article/details/132911752