树莓派GPIO入门08-使用74HC595芯片驱动数码管(一),
树莓派GPIO入门08-使用74HC595芯片驱动数码管(一),
本文转自 mangolovecarrot ,是学习74HC595芯片很棒的文章。之前我们学习了如何驱动数码管显示数字。
但是这种做法有两个缺点。
使用GPIO直接驱动数码管时,上面这两个问题是不可避免的。想解决这两个问题,我们需要借助外部芯片的帮助。
接下来我将用几个篇幅来介绍如何使用显示驱动芯片74HC595来驱动数码管的方法。同时我们也可以学习到串行数据传输的方法以及一些数字芯片通用的一些概念,比如时钟引脚,上升沿,锁存,移位寄存等。理解了这些通用的概念对学习使用其他芯片是很有帮助的。
本文最终效果
在一块74HC595芯片的配合下,只需要3个GPIO就能驱动一只8段数码管。(直接用GPIO驱动需要至少8个GPIO口)
视频演示
硬件
74HC595显示芯片一只(0.5元一只)共阳(或共阴)数码管一只 限流电阻一只,330欧就够了。
原理说明
先转一段百度百科上74HC595芯片的简介。
74HC595具有8位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存储器有相互独立的时钟。数据在SH_cp(移位寄存器时钟输入)的上升沿输入到移位寄存器中,在ST_cp(存储器时钟输入)的上升沿输入到存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
看不懂吧,没关系,我们先看一下芯片的引脚图:
74HC595引脚图
分别解释一下:
另外,我做了一个动画帮助你理解整个过程。
74HC595
硬件连接
模块1 | 引脚 | 模块2 | 引脚 |
---|---|---|---|
74HC595 | Q0 | 数码管 | DP |
74HC595 | Q1 | 数码管 | G |
74HC595 | Q2 | 数码管 | F |
74HC595 | Q3 | 数码管 | E |
74HC595 | Q4 | 数码管 | D |
74HC595 | Q5 | 数码管 | C |
74HC595 | Q6 | 数码管 | B |
74HC595 | Q7 | 数码管 | A |
74HC595 | DS | 树莓派 | GPIO13 |
74HC595 | SHCP | 树莓派 | GPIO19 |
74HC595 | SHTP | 树莓派 | GPIO26 |
74HC595 | VCC,MR | 树莓派 | VCC |
74HC595 | GND,OE | 树莓派 | GND |
数码管 | 1位共阳极 | 树莓派 | VCC |
注意,共阳数码管的共阳极连接5V电源时要串联一只限流电阻防止数码管电流过大损坏电阻。
如果你用的是共阴极数码管就没关系了,74HC595输出的电流是控制好的可以直接连到阳极上。
我手头上没有单独的1位数码管,就用4位数码管代替了,本文只接通数码管DIG1的共阳极做演示。
#!/usr/bin/env python # encoding: utf-8 import RPi.GPIO import time # 串行数据输入引脚连接的GPIO口 DS = 13 # 移位寄存器时钟控制引脚连接的GPIO口——上升沿有效 SHCP = 19 # 数据锁存器时钟控制引脚连接的GPIO口——上升沿有效 STCP = 26 RPi.GPIO.setmode(RPi.GPIO.BCM) RPi.GPIO.setup(DS, RPi.GPIO.OUT) RPi.GPIO.setup(STCP, RPi.GPIO.OUT) RPi.GPIO.setup(SHCP, RPi.GPIO.OUT) RPi.GPIO.output(STCP, False) RPi.GPIO.output(SHCP, False) # 通过串行数据引脚向74HC595的传送一位数据 def setBitData(data): # 准备好要传送的数据 RPi.GPIO.output(DS, data) # 制造一次移位寄存器时钟引脚的上升沿(先拉低电平再拉高电平) # 74HC595会在这个上升沿将DS引脚上的数据存入移位寄存器D0 # 同时D0原来的数据会顺移到D1,D1的数据位移到D2。。。D6的数据位移到D7 # 而D7的数据已经没有地方储存了,这一位数据会被输出到引脚Q7S上 RPi.GPIO.output(SHCP, False) RPi.GPIO.output(SHCP, True) # 指定数码管显示数字num(0-9),第2个参数是显示不显示小数点(true/false) # 由于我使用的数码管是共阳数码管,所以设置为低电平的段才会被点亮 # 如果你用的是共阴数码管,那么要将下面的True和False全部颠倒过来,或者统一在前面加上not def showDigit(num, showDotPoint): if (num == 0) : setBitData(not showDotPoint) # DP setBitData(True) # G setBitData(False) # F setBitData(False) # E setBitData(False) # D setBitData(False) # C setBitData(False) # B setBitData(False) # A elif (num == 1) : setBitData(not showDotPoint) setBitData(True) setBitData(True) setBitData(True) setBitData(True) setBitData(False) setBitData(False) setBitData(True) elif (num == 2) : setBitData(not showDotPoint) setBitData(False) setBitData(True) setBitData(False) setBitData(False) setBitData(True) setBitData(False) setBitData(False) elif (num == 3) : setBitData(not showDotPoint) setBitData(False) setBitData(True) setBitData(True) setBitData(False) setBitData(False) setBitData(False) setBitData(False) elif (num == 4) : setBitData(not showDotPoint) setBitData(False) setBitData(False) setBitData(True) setBitData(True) setBitData(False) setBitData(False) setBitData(True) elif (num == 5) : setBitData(not showDotPoint) setBitData(False) setBitData(False) setBitData(True) setBitData(False) setBitData(False) setBitData(True) setBitData(False) elif (num == 6) : setBitData(not showDotPoint) setBitData(False) setBitData(False) setBitData(False) setBitData(False) setBitData(False) setBitData(True) setBitData(False) elif (num == 7) : setBitData(not showDotPoint) setBitData(True) setBitData(True) setBitData(True) setBitData(True) setBitData(False) setBitData(False) setBitData(False) elif (num == 8) : setBitData(not showDotPoint) setBitData(False) setBitData(False) setBitData(False) setBitData(False) setBitData(False) setBitData(False) setBitData(False) elif (num == 9) : setBitData(not showDotPoint) setBitData(False) setBitData(False) setBitData(True) setBitData(False) setBitData(False) setBitData(False) setBitData(False) # 移位寄存器的8位数据全部传输完毕后,制造一次锁存器时钟引脚的上升沿(先拉低电平再拉高电平) # 74HC595会在这个上升沿将移位寄存器里的8位数据复制到8位的锁存器中(锁存器里原来的数据将被替换) # 到这里为止,这8位数据还只是被保存在锁存器里,并没有输出到数码管上。 # 决定锁存器里的数据是否输出是由“输出使能端口”OE决定的。当OE设置为低电平时,锁存器里数据才会被输出到Q0-Q7这8个输出引脚上。 # 在我的硬件连接里,OE直接连接在了GND上,总是保持低电平,所以移位寄存器的数据一旦通过时钟上升沿进入锁存器,也就相当于输出到LED上了。 RPi.GPIO.output(STCP, True) RPi.GPIO.output(STCP, False) try: # 测试代码 # 从0显示到9,不显示小数点 for x in range(0,10): showDigit(x, False) time.sleep(0.2) # 再从0显示到9,显示小数点 for y in range(0,10): showDigit(y, True) time.sleep(0.2) except KeyboardInterrupt: pass # 最后清理GPIO口 # 清理了IO是将所有使用中的IO口释放,并全部设置为输入模式 # 你会发现最后设置的数据在清理了IO口以后还会继续正常显示 # 这是因为数据一旦存入锁存器,除非断电或重置数据(MR口设置为低电平), # 否则最后设置的数据会一直保留在74HC595芯片中。也就是被“锁存”了。 RPi.GPIO.cleanup()文章标题:树莓派GPIO入门08-使用74HC595芯片驱动数码管(一) - 树莓派实验室 固定链接:https://shumeipai.nxez.com/2016/06/05/use-74hc595-chip-digital-control-drive.html
评论暂时关闭