移位寄存器(Shift Register)由多个 flip-flop或者latch级联构成,flip-flop或者latch可以说是移位寄存器中存储数据的基本单位,用来存放二进制数据位
0
0
0或
1
1
1。在flip-flop或者latch的级联结构中,除开第一个和最后一个flip-flop或者latch单元外,一个flip-flop或者latch单元的输出又是另一个flip-flop或者latch单元的输入。移位寄存器中的所有flip-flop或者latch单元共享同样的时钟,在每一次输入时钟的跳变时就进行一次移位。
移位寄存器可以有并行或串行输入或输出,根据此它们可以主要分为以下四类:
-
串行输入并行输出(Serial-in to Parallel-out, SIPO):寄存器输入串行数据且一次一个比特位,但是在输出端以并行的形式输出。
-
串行输入串行输出(Serial-in to Serial-out,SISO):在时钟的控制之下每次一个比特位移进或移出(左移或右移)寄存器。
-
并行输入串行输出(Parallel-in to Serial-out,PISO):移位寄存器的每一个比特位并行的同时输入寄存器,在时钟的控制之下每次一个比特位串行移出移位寄存器。
-
并行输入并行输出(Parallel-in to Parallel-out, PIPO):移位寄存器的每一个比特位并行的同时输入寄存器并且在同一个时钟脉冲下每一个比特位同时输出到它们各自的输出端。
我们这里要介绍的移位寄存器MC74HC165ADTR2G属于并行输入串行输出的8比特移位寄存器,详细的说明可以查看它的DATASHHET。它的大概的结构图如图1所示。引脚 A − > H A->H A−>H是8个并行输入端口,引脚 S A SA SA是串行输入端口, S A SA SA端口主要用来多个移位寄存器MC74HC165ADTR2G的级联。当引脚 S e r i a l S h i f t / P a r a l l e l L o a d SerialShift/ParallelLoad SerialShift/ParallelLoad为低电平时八个并行输入端口的高低电位状态进入移位寄存器并存储到其对应的flip-flop或者latch单元中。当引脚 S e r i a l S h i f t / P a r a l l e l L o a d SerialShift/ParallelLoad SerialShift/ParallelLoad为高电平时,在每一个时钟信号周期的上升沿移位寄存器中flip-flop或者latch单元的级联结构中进行一次移位操作,如果此时 S A SA SA端口有信号输入,则该信号会移位到移位寄存器中,flip-flop或者latch单元的级联结构的最后一个单元中的二进制数据位则会通过串行输出引脚 Q H QH QH移出移位寄存器。如图2所示。串行输出引脚 Q H QH QH和引脚 Q H ( i n v e r t ) QH(invert) QH(invert)的输出是互补的即引脚 Q H ( i n v e r t ) QH(invert) QH(invert)的输出是引脚 Q H QH QH的反向,引脚 Q H QH QH输出高电平时引脚 Q H ( i n v e r t ) QH(invert) QH(invert)输出低电平,引脚 Q H QH QH输出低电平时引脚 Q H ( i n v e r t ) QH(invert) QH(invert)输出高电平,这可能是为了某种情况下抗干扰使用的,这一点我不是很清楚。165这一类的移位寄存器用来扩充芯片的GPIO输入口,当芯片的GPIO输入口不够时一个GPIO口就可以读取多个按键开关的状态,特别是在级联的时候。
![](https://i-blog.csdnimg.cn/blog_migrate/985666984f12de5855b33026492fea42.png#pic_center)
![](https://i-blog.csdnimg.cn/blog_migrate/5d26f08aaf1d052aaae465b0a88f4f88.png#pic_center)
至于移位寄存器MC74HC165ADTR2G的级联,只需要将一个寄存器的串行输出口 Q H QH QH接入到另一个寄存器的串行输入口 S A SA SA即可。图3是两个移位寄存器的级联的简单例子,现在假设这两个移位寄存器的一共16个并行接口接了16个按键,现在通过SPI协议来读取这16个开关的状态,因为我们这里是读且芯片是MASTER,我们只需要接三根线:时钟线,片选线,以及MISO线。接线示意图如图3所示。这里的片选信号是高电平,因为当引脚 S e r i a l S h i f t / P a r a l l e l L o a d SerialShift/ParallelLoad SerialShift/ParallelLoad为高电平时,在每一个时钟信号周期的上升沿移位寄存器中flip-flop或者latch单元的级联结构中进行一次移位操作,在移位的过程中前一个移位寄存器中从串行输出口 Q H QH QH输出的比特位会移入下一个移位寄存器的串行输入口,经过16个时钟周期后,16个按键的状态就可以通过SPI协议读取到。
![](https://i-blog.csdnimg.cn/blog_migrate/17694a7479c0fa90ebfa764eb45ff282.png#pic_center)
MC74HC595ADTR2G属于串行输入并行输出的移位寄存器,详细的说明可以查看它的DATASHHET。它的大概的结构图如图4所示。引脚
Q
A
−
>
Q
H
QA->QH
QA−>QH是8个并行输出端口,引脚14是串行输入端口,引脚9是串行输出端口,它们主要用来多个移位寄存器MC74HC595ADTR2G的级联。可以看出来这里的MC74HC595ADTR2G芯片比之前的MC74HC165ADTR2G芯片的内部结构多了8个flip-flop或者latch单元,其中8个单元和以前的MC74HC165ADTR2G一样用来移位,而剩下的8个flip-flop或者latch单元用来并行输出。MC74HC595ADTR2G芯片有两个时钟信号引脚,11引脚为移位时钟,12为锁存时钟。在11引脚时钟的每一个上升沿MC74HC595ADTR2G芯片中的8个用于移位的flip-flop或者latch单元的级联结构中进行一次移位操作,如果此时引脚14端口有信号输入,则该信号会移位到移位寄存器中,flip-flop或者latch单元的级联结构的最后一个单元中的二进制数据位则会通过串行输出引脚9移出移位寄存器。如图5所示。
在12引脚时钟的每一个上升沿MC74HC595ADTR2G芯片中8个用于移位的flip-flop或者latch单元的级联结构中的每一个单元中的二进制数据位都存储到剩下的8个flip-flop或者latch单元。如图6所示。
当13引脚为低电平时,存储于剩下的8个flip-flop或者latch单元中的8个二进制数据位会并行的输出到芯片外部。当13引脚为高电平时,存储于剩下的8个flip-flop或者latch单元中的8个二进制数据位的输出会呈现为高阻态,相当于此时存储于剩下的8个flip-flop或者latch单元中的8个二进制数据位被锁存起来了。如图7所示。
595这一类的移位寄存器用来扩充芯片的GPIO输出口,当芯片的GPIO输出口不够时一个GPIO口就可以点亮多个LED,特别是在级联的时候。
![](https://i-blog.csdnimg.cn/blog_migrate/474f991af2cd11b125e16556b420a14e.png#pic_center)
![](https://i-blog.csdnimg.cn/blog_migrate/83d626cdbd387613b90a32670bdd9de6.png#pic_center)
![](https://i-blog.csdnimg.cn/blog_migrate/544be82cb99bf5f7fad87e07bfb22ab2.png#pic_center)
![](https://i-blog.csdnimg.cn/blog_migrate/4afde49108be48be22ae67295b8aa06d.png#pic_center)
至于移位寄存器MC74HC595ADTR2G的级联,只需要将一个寄存器的串行输出口(引脚9)接入到另一个寄存器的串行输入口(引脚14)即可。图8是两个移位寄存器的级联的简单例子,现在假设现在通过这两个移位寄存器的一共16个并行输出口来点亮16个LED,现在通过SPI协议来写这16个LED,因为我们这里是写且芯片是MASTER,我们只需要接三根线:时钟线,片选线,以及MOSI线。接线示意图如图8所示。这里的片选信号是低电平,这样在写多个字节的数据时进入移位寄存器8个用于移位的flip-flop或者latch单元级联结构中的二进制数据位不会马上进入到剩下的8个flip-flop或者latch单元中。当写完2个字节时,这时16个比特位都已进入两个寄存器中一共16个用于移位的flip-flop或者latch单元中。这时SPI协议会取消片选即片选信号变为高电平,相当于在12引脚有一个上升沿,这时两个芯片中一共16个用于移位的flip-flop或者latch单元的级联结构中的每一个单元中的二进制数据位都存储到剩下的16个flip-flop或者latch单元。因为这里我们两个移位寄存器的13引脚都是接地的因此它们都是使能状态。因此在两个芯片中一共16个存储在剩下的16个flip-flop或者latch单元中的二进制数据位会马上输出到两个芯片到达点亮16个LED的目的。
如果还有不懂的可以看看这位大哥写的关于595和165的文章,我也主要参考了他写的。
![](https://i-blog.csdnimg.cn/blog_migrate/bf29f44467325a91e729eead8ae3a0e8.png#pic_center)