diff --git a/adafruit_74hc595.py b/adafruit_74hc595.py index 0d5311e..081d998 100644 --- a/adafruit_74hc595.py +++ b/adafruit_74hc595.py @@ -44,6 +44,8 @@ def __init__(self, pin_number, shift_register_74hc595): ShiftRegister74HC595 instance. """ self._pin = pin_number + self._byte_pos = self._pin // 8 + self._byte_pin = self._pin % 8 self._shift_register = shift_register_74hc595 # kwargs in switch functions below are _necessary_ for compatibility @@ -65,16 +67,23 @@ def switch_to_input(self, **kwargs): # pylint: disable=no-self-use @property def value(self): """The value of the pin, either True for high or False for low.""" - return self._shift_register.gpio & (1 << self._pin) == (1 << self._pin) + return self._shift_register.gpio[self._byte_pos] & (1 << self._byte_pin) == ( + 1 << self._byte_pin + ) @value.setter def value(self, val): - gpio = self._shift_register.gpio - if val: - gpio |= 1 << self._pin - else: - gpio &= ~(1 << self._pin) - self._shift_register.gpio = gpio + + if ( + self._pin >= 0 + and self._pin < self._shift_register.number_of_shift_registers * 8 + ): + gpio = self._shift_register.gpio + if val: + gpio[self._byte_pos] |= 1 << self._byte_pin + else: + gpio[self._byte_pos] &= ~(1 << self._byte_pin) + self._shift_register.gpio = gpio @property def direction(self): @@ -100,23 +109,31 @@ def pull(self, val): # pylint: disable=no-self-use class ShiftRegister74HC595: - """Initialise the 74HC595 on specified SPI bus.""" + """Initialise the 74HC595 on specified SPI bus + and indicate the number of shift registers being used + """ - def __init__(self, spi, latch): + def __init__(self, spi, latch, number_of_shift_registers=1): self._device = spi_device.SPIDevice(spi, latch, baudrate=1000000) - self._gpio = bytearray(1) - self._gpio[0] = 0x00 + self._number_of_shift_registers = number_of_shift_registers + self._gpio = bytearray(self._number_of_shift_registers) + + @property + def number_of_shift_registers(self): + """The number of shift register chips """ + return self._number_of_shift_registers @property def gpio(self): """The raw GPIO output register. Each bit represents the output value of the associated pin (0 = low, 1 = high). """ - return self._gpio[0] + return self._gpio @gpio.setter def gpio(self, val): - self._gpio[0] = val & 0xFF + self._gpio = val + with self._device as spi: # pylint: disable=no-member spi.write(self._gpio) @@ -125,5 +142,5 @@ def get_pin(self, pin): """Convenience function to create an instance of the DigitalInOut class pointing at the specified pin of this 74HC595 device . """ - assert 0 <= pin <= 7 + assert 0 <= pin <= (self._number_of_shift_registers * 8) - 1 return DigitalInOut(pin, self)