Skip to content

Commit 143262c

Browse files
authored
Merge pull request #17 from davidleedom/patch-1
Adafruit_CircuitPython_74HC595: Added support for multiple shift registers
2 parents 210d166 + da650d2 commit 143262c

File tree

1 file changed

+31
-14
lines changed

1 file changed

+31
-14
lines changed

adafruit_74hc595.py

+31-14
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ def __init__(self, pin_number, shift_register_74hc595):
4444
ShiftRegister74HC595 instance.
4545
"""
4646
self._pin = pin_number
47+
self._byte_pos = self._pin // 8
48+
self._byte_pin = self._pin % 8
4749
self._shift_register = shift_register_74hc595
4850

4951
# kwargs in switch functions below are _necessary_ for compatibility
@@ -65,16 +67,23 @@ def switch_to_input(self, **kwargs): # pylint: disable=no-self-use
6567
@property
6668
def value(self):
6769
"""The value of the pin, either True for high or False for low."""
68-
return self._shift_register.gpio & (1 << self._pin) == (1 << self._pin)
70+
return self._shift_register.gpio[self._byte_pos] & (1 << self._byte_pin) == (
71+
1 << self._byte_pin
72+
)
6973

7074
@value.setter
7175
def value(self, val):
72-
gpio = self._shift_register.gpio
73-
if val:
74-
gpio |= 1 << self._pin
75-
else:
76-
gpio &= ~(1 << self._pin)
77-
self._shift_register.gpio = gpio
76+
77+
if (
78+
self._pin >= 0
79+
and self._pin < self._shift_register.number_of_shift_registers * 8
80+
):
81+
gpio = self._shift_register.gpio
82+
if val:
83+
gpio[self._byte_pos] |= 1 << self._byte_pin
84+
else:
85+
gpio[self._byte_pos] &= ~(1 << self._byte_pin)
86+
self._shift_register.gpio = gpio
7887

7988
@property
8089
def direction(self):
@@ -100,23 +109,31 @@ def pull(self, val): # pylint: disable=no-self-use
100109

101110

102111
class ShiftRegister74HC595:
103-
"""Initialise the 74HC595 on specified SPI bus."""
112+
"""Initialise the 74HC595 on specified SPI bus
113+
and indicate the number of shift registers being used
114+
"""
104115

105-
def __init__(self, spi, latch):
116+
def __init__(self, spi, latch, number_of_shift_registers=1):
106117
self._device = spi_device.SPIDevice(spi, latch, baudrate=1000000)
107-
self._gpio = bytearray(1)
108-
self._gpio[0] = 0x00
118+
self._number_of_shift_registers = number_of_shift_registers
119+
self._gpio = bytearray(self._number_of_shift_registers)
120+
121+
@property
122+
def number_of_shift_registers(self):
123+
"""The number of shift register chips """
124+
return self._number_of_shift_registers
109125

110126
@property
111127
def gpio(self):
112128
"""The raw GPIO output register. Each bit represents the
113129
output value of the associated pin (0 = low, 1 = high).
114130
"""
115-
return self._gpio[0]
131+
return self._gpio
116132

117133
@gpio.setter
118134
def gpio(self, val):
119-
self._gpio[0] = val & 0xFF
135+
self._gpio = val
136+
120137
with self._device as spi:
121138
# pylint: disable=no-member
122139
spi.write(self._gpio)
@@ -125,5 +142,5 @@ def get_pin(self, pin):
125142
"""Convenience function to create an instance of the DigitalInOut class
126143
pointing at the specified pin of this 74HC595 device .
127144
"""
128-
assert 0 <= pin <= 7
145+
assert 0 <= pin <= (self._number_of_shift_registers * 8) - 1
129146
return DigitalInOut(pin, self)

0 commit comments

Comments
 (0)