1. Python
  2. Raspberry Pi

74HC595测试

一.写在前面

翻出几个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。可以做一个玩一玩?