from machine import Pin
# 74HC595
# 16: VCC
# 15, 1~7: Q0~Q7
# 14: DS --- Pico GPIO 18
# 13: OE --- Pico GPIO 19
# 12: STCP --- Pico GPIO 20
# 11: SHCP --- Pico GPIO 21
# 9: Q7S
# 8: GND
class Chip74HC595(object):
def __init__(self, ds: int=18, stcp: int=20, shcp: int=21, oe: int=19):
self._ds = Pin(ds, Pin.OUT, value=0)
self._shcp = Pin(shcp, Pin.OUT, value=0)
self._stcp = Pin(stcp, Pin.OUT, value=0)
self._oe = Pin(oe, Pin.OUT, value=0)
self.enable()
# 入力データをパラレル出力する
# direction: データの方向(1: 上位ビット(MLB)がQ7に格納, 0: 下位ビット(LSB)がQ7に格納)
# data: 出力データ(8bit)
def shiftOut(self,direction,data):
self._shcp.on()
self._stcp.on()
if direction:
for i in range(8):
# データを左にシフトして最上位ビットのみ残す
bit = data << i
bit = bit & 0x80
# シリアルデータをセット
if bit == 0x80:
self._ds.on()
else:
self._ds.off()
# シフトレジスタをシフト
self._shift_bit()
# パラレルデータ出力
self._send_data()
if not direction:
for i in range(8):
# データを右にシフトして最下位ビットのみ残す
bit = data >> i
bit = bit & 0x01
# シリアルデータをセット
if bit == 0x01:
self._ds.on()
else:
self._ds.off()
# シフトレジスタをシフト
self._shift_bit()
# パラレルデータ出力
self._send_data()
# データをクリアする
def clear(self):
for i in range(8):
self._ds.off()
self._shift_bit()
self._send_data()
self.enable()
# シフトレジスタをシフトする(DS=>Q1, Q1=>Q2, ..., Q6=>Q7, Q7=>Q7')
def _shift_bit(self):
self._shcp.off()
self._shcp.on()
# シフトレジスタの状態を出力する。パラレル出力する。
def _send_data(self):
self._stcp.off()
self._stcp.on()
def disable(self):
self._oe.on()
def enable(self):
self._oe.off()