@@ -44,6 +44,8 @@ def __init__(self, pin_number, shift_register_74hc595):
44
44
ShiftRegister74HC595 instance.
45
45
"""
46
46
self ._pin = pin_number
47
+ self ._byte_pos = self ._pin // 8
48
+ self ._byte_pin = self ._pin % 8
47
49
self ._shift_register = shift_register_74hc595
48
50
49
51
# kwargs in switch functions below are _necessary_ for compatibility
@@ -65,16 +67,23 @@ def switch_to_input(self, **kwargs): # pylint: disable=no-self-use
65
67
@property
66
68
def value (self ):
67
69
"""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
+ )
69
73
70
74
@value .setter
71
75
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
78
87
79
88
@property
80
89
def direction (self ):
@@ -100,23 +109,31 @@ def pull(self, val): # pylint: disable=no-self-use
100
109
101
110
102
111
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
+ """
104
115
105
- def __init__ (self , spi , latch ):
116
+ def __init__ (self , spi , latch , number_of_shift_registers = 1 ):
106
117
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
109
125
110
126
@property
111
127
def gpio (self ):
112
128
"""The raw GPIO output register. Each bit represents the
113
129
output value of the associated pin (0 = low, 1 = high).
114
130
"""
115
- return self ._gpio [ 0 ]
131
+ return self ._gpio
116
132
117
133
@gpio .setter
118
134
def gpio (self , val ):
119
- self ._gpio [0 ] = val & 0xFF
135
+ self ._gpio = val
136
+
120
137
with self ._device as spi :
121
138
# pylint: disable=no-member
122
139
spi .write (self ._gpio )
@@ -125,5 +142,5 @@ def get_pin(self, pin):
125
142
"""Convenience function to create an instance of the DigitalInOut class
126
143
pointing at the specified pin of this 74HC595 device .
127
144
"""
128
- assert 0 <= pin <= 7
145
+ assert 0 <= pin <= ( self . _number_of_shift_registers * 8 ) - 1
129
146
return DigitalInOut (pin , self )
0 commit comments