一.写在前面
翻出几个74IC,正好最近没事,就来熟悉熟悉这些74IC的功能吧。
本次测试的是74HC595(引脚定义如下)
VCC:电源
Q0 – Q7:并行输出
DS:串行输入
OE:输出使能(低电平有效)
STCP:数据输入时钟线
SHCP:输出储存锁存时钟线
MR:主复位(低电平有效)
Q7‘ :串行数据输出
GND:接地
二.具体使用方法
首先电源和地线是必须连接的,然后就是Q0-Q7接输出(八个发光二极管),DS接输入(树莓派GPIO),OE这里可以直接接地,STCP,SHCP接信号(树莓派GPIO)MR这里直接接VCC即可,Q7’悬空。
这样的话只要三个GPIO口就可以控制八个LED灯了。
三.编码实现
原本是用C++写的,结果调试的时候wiringPi库不能正常工作,后来又用Python重写,哎!
先写一个简单的测试一下能不能使?
import RPi.GPIO as GPIO
import time
DS = 33
STCP = 35
SHCP = 37
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(DS, GPIO.OUT)
GPIO.setup(STCP, GPIO.OUT)
GPIO.setup(SHCP, GPIO.OUT)
GPIO.output(DS,GPIO.HIGH)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.LOW)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.HIGH)
GPIO.output(DS,GPIO.LOW)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.LOW)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.HIGH)
GPIO.output(DS,GPIO.HIGH)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.LOW)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.HIGH)
GPIO.output(DS,GPIO.LOW)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.LOW)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.HIGH)
GPIO.output(DS,GPIO.HIGH)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.LOW)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.HIGH)
GPIO.output(DS,GPIO.LOW)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.LOW)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.HIGH)
GPIO.output(DS,GPIO.HIGH)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.LOW)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.HIGH)
GPIO.output(DS,GPIO.LOW)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.LOW)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.HIGH)
GPIO.output(STCP,GPIO.LOW)
time.sleep(0.01)
GPIO.output(STCP,GPIO.HIGH)
import RPi.GPIO as GPIO
import time
DS = 33
STCP = 35
SHCP = 37
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(DS, GPIO.OUT)
GPIO.setup(STCP, GPIO.OUT)
GPIO.setup(SHCP, GPIO.OUT)
def writeByteTo74HC595(data):
ofs = 0
while(data != 0):
ofs += 1
if(data % 2 == 1):
GPIO.output(DS,GPIO.HIGH)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.LOW)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.HIGH)
else:
GPIO.output(DS,GPIO.LOW)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.LOW)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.HIGH)
data //= 2
#如果不足八位补0
while(ofs!=8):
ofs += 1
GPIO.output(DS,GPIO.LOW)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.LOW)
time.sleep(0.01)
GPIO.output(SHCP,GPIO.HIGH)
#写完八位数据后将移位寄存器输出到储存锁存
GPIO.output(STCP,GPIO.LOW)
time.sleep(0.01)
GPIO.output(STCP,GPIO.HIGH)
if __name__ == "__main__":
#循环写0x00~0xFE到74HC595
for i in range(0xFF):
writeByteTo74HC595(i)
time.sleep(0.5)
感觉这货最大用处就是配合数码管使用,一个数码管配一个74HC595这样即使需要十个数码管进行显示,我们也只需三根信号线DS,STCP,SHCP即可还不需要动态刷新,NICE。可以做一个玩一玩?