nanoFramework.Iot.Device.ShiftRegister 1.1.1

Prefix Reserved
There is a newer version of this package available.
See the version list below for details.
dotnet add package nanoFramework.Iot.Device.ShiftRegister --version 1.1.1
                    
NuGet\Install-Package nanoFramework.Iot.Device.ShiftRegister -Version 1.1.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="nanoFramework.Iot.Device.ShiftRegister" Version="1.1.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="nanoFramework.Iot.Device.ShiftRegister" Version="1.1.1" />
                    
Directory.Packages.props
<PackageReference Include="nanoFramework.Iot.Device.ShiftRegister" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add nanoFramework.Iot.Device.ShiftRegister --version 1.1.1
                    
#r "nuget: nanoFramework.Iot.Device.ShiftRegister, 1.1.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#addin nuget:?package=nanoFramework.Iot.Device.ShiftRegister&version=1.1.1
                    
Install as a Cake Addin
#tool nuget:?package=nanoFramework.Iot.Device.ShiftRegister&version=1.1.1
                    
Install as a Cake Tool

Generic shift register

A shift register enables controlling multiple devices, like LEDs, using a small number of pins (minimum of 3 -- data, data clock and register latch). Shift registers can be daisy-chained without requiring using additional pins, enabling addressing a large number of devices, limited only by current and the algorithms you use.

The ShiftRegister binding abstracts the interaction with the storage register, the storage clock, the register clock and other shift register capabilities. This binding enables interaction via GPIO or SPI.

ShiftRegister is used as the base class for Sn74hc595 and Mbi5027 bindings. It can be used directly, or you can rely on it as an implementation detail of those more specific bindings. It has been tested with with SN74HC595, MBI5027, and MBI5168 shift registers.

The following image is of the popular SN74HC595 8-bit shift register:

shift-register

The following image is of the larger MBI5027 16-bit shift register:

MBI5027

The sample demonstrates how to use the shift register in some basic ways.

Using GPIO

The binding can use GpioController pins to control the shift register. It uses ShiftRegisterPinMapping to describe the pins that will be used.

The following example code demonstrates how to use a shift register with GPIO.

ShiftRegister sr = new(ShiftRegisterPinMapping.Minimal, 8);

// Light up three of first four LEDs
sr.ShiftBit(1);
sr.ShiftBit(1);
sr.ShiftBit(0);
sr.ShiftBit(1);
sr.Latch();

// Display for 1s
Thread.Sleep(1000);

// Write to all 8 registers with a byte value
// ShiftByte latches data by default
sr.ShiftByte(0b_1000_1101);

The following diagram demonstrates the required wiring for using the SN74HC595 with minimal mapping. Other shift registers will be similar.

sn74hc595-led-bar-graph-spi_bb

Using SPI

Important: make sure you properly setup the SPI pins especially for ESP32 before creating the SpiDevice, make sure you install the nanoFramework.Hardware.ESP32 nuget:

//////////////////////////////////////////////////////////////////////
// when connecting to an ESP32 device, need to configure the SPI GPIOs
// used for the bus
Configuration.SetPinFunction(21, DeviceFunction.SPI1_MOSI);
Configuration.SetPinFunction(22, DeviceFunction.SPI1_MISO);
Configuration.SetPinFunction(23, DeviceFunction.SPI1_CLOCK);
// Make sure as well you are using the right chip select

For other devices like STM32, please make sure you're using the preset pins for the SPI bus you want to use. The chip select can as well be pre setup.

The bindings can use a SpiDevice to control the shift register. The shift register timing maps to the SPI protocol, enabling SPI to be used. The wiring from is straightforward, from SPI pins to the shift register: SDI (MOSI) → SDI; SCLK → CLK; CEO → LE.

Note: The SPI protocol has terms with casual references to slavery. We're doing our part to avoid them.

The following example code demonstrates how to use a shift register with SPI.

// assuming an 8-bit shift register
ShiftRegister sr = new(SpiDevice.Create(new(1, 42)), 8);

// Light up three of first four LEDs
// The ShiftBit() method is disallowed when using SPI
sr.ShiftByte(0b_1011);

// Clear register
sr.ShiftClear();

// Write to all 8 registers with a byte value
sr.ShiftByte(0b_1010_1010);

The following diagram demonstrates the required wiring for using the SN74HC595 with SPI. Other shift registers will be similar.

sn74hc595-led-bar-graph-spi_bb

Daisy-chaining

The binding supports daisy chaining, using either GPIO or SPI. The GPIO-based example below demonstrates how to instantiate the binding for controlling/addressing two -- daisy-chained -- 8-bit shift registers. This is specified by the integer value in the constructor.

ShiftRegister sr = new(ShiftRegisterPinMapping.Minimal, 16);

The shift registers need to be correctly wired to enable daisy-chaining. On the SN74HC595, QH' in the first register would connect to SER in the second register. The pattern with the MBI5027 and MBI5168 is similar, SDO in the first register would connect to SDI in the second.

You can write values across multiple daisy chained devices in one of several ways, as demonstrated in the following code. You wouldn't typically use of all these approaches, but pick one.

// Write a value to each register bit and latch
// Only works with GPIO
for (int i = 0; i < sr.BitLength; i++)
{
    sr.ShiftBit(1);
}
sr.Latch();

// Prints the following pattern to each register: 10101010
// This pattern only works for register lengths divisible by 8 (which is common)
for (int i = 0; i < sr.BitLength / 8; i++)
{
    sr.ShiftByte(0b_1010_1010);
}

// Downshift a 32-bit number to the desired number of daisy-chained devices
// Same thing could be done with a 64-bit integer if you have more than four 8-bit shift registers (or more than two 16-bit ones)
// Prints the following pattern across two registers: 0001001110001000
int value = 0b_0001_0011_1000_1000; // 5000
for (int i = (sr.BitLength / 8) - 1; i > 0; i--)
{
    int shift = i * 8;
    int downShiftedValue = value >> shift;
    sr.ShiftByte((byte)downShiftedValue, false);
}

sr.ShiftByte((byte)value);

// Print array of bytes
// Result will be same as previous example
var bytes = new byte[] { 0b10001000, 0b00010011};
foreach (var b in bytes)
{
    sr.ShiftByte(b);
}

The following diagram demonstrates the required wiring for using the SN74HC595 with daisy-chaining. Other shift registers will be similar. This diagram uses the Minimal mapping. The Complete mapping will differ.

sn74hc595-minimal-led-bar-graph-double-up_bb

Resources

Product Compatible and additional computed target framework versions.
.NET Framework net is compatible. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (3)

Showing the top 3 NuGet packages that depend on nanoFramework.Iot.Device.ShiftRegister:

Package Downloads
nanoFramework.Iot.Device.CharacterLcd

This package includes the .NET IoT Core binding Character LCD for .NET nanoFramework C# projects.

nanoFramework.Iot.Device.Sn74hc595

This package includes the .NET IoT Core binding Iot.Device.Sn74hc595 for .NET nanoFramework C# projects.

nanoFramework.Iot.Device.Mbi5027

This package includes the .NET IoT Core binding Iot.Device.Mbi5027 for .NET nanoFramework C# projects.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.2.867 816 4/2/2025
1.2.861 282 4/2/2025
1.2.850 440 3/10/2025
1.2.830 487 2/27/2025
1.2.817 583 2/26/2025
1.2.810 193 2/25/2025
1.2.780 497 2/4/2025
1.2.768 376 2/4/2025
1.2.765 318 2/3/2025
1.2.757 301 1/31/2025
1.2.752 298 1/31/2025
1.2.716 665 12/30/2024
1.2.702 309 12/18/2024
1.2.671 830 10/23/2024
1.2.633 806 8/30/2024
1.2.587 989 7/12/2024
1.2.558 809 5/29/2024
1.2.546 376 5/15/2024
1.2.424 2,537 11/9/2023
1.2.421 151 11/9/2023
1.2.419 163 11/9/2023
1.2.326 3,367 5/24/2023
1.2.301 1,463 5/10/2023
1.2.296 951 5/3/2023
1.2.287 349 4/5/2023
1.2.271 1,255 3/15/2023
1.2.202 3,511 12/28/2022
1.2.196 327 12/28/2022
1.2.195 331 12/27/2022
1.2.158 2,401 11/13/2022
1.2.149 2,513 11/3/2022
1.2.141 445 10/25/2022
1.2.121 3,981 10/12/2022
1.2.103 4,936 9/24/2022
1.2.94 2,619 9/22/2022
1.2.86 2,065 9/15/2022
1.2.72 1,743 9/8/2022
1.2.4 1,970 7/13/2022
1.1.140.3705 1,534 7/6/2022
1.1.115.33436 1,508 6/24/2022
1.1.113.2032 472 6/23/2022
1.1.26 3,440 4/26/2022
1.1.19 1,479 4/21/2022
1.1.2 1,548 4/15/2022
1.1.1 504 4/14/2022
1.0.300 1,766 3/30/2022
1.0.277-preview.126 213 3/25/2022
1.0.277-preview.125 190 3/25/2022
1.0.277-preview.112 230 3/19/2022
1.0.277-preview.102 319 3/11/2022
1.0.277-preview.99 210 3/10/2022
1.0.277-preview.85 205 2/25/2022
1.0.277-preview.60 198 2/4/2022
1.0.277-preview.32 193 1/27/2022
1.0.277-preview.17 189 1/24/2022
1.0.277-preview.1 196 1/11/2022
1.0.259 390 12/9/2021
1.0.221 230 10/19/2021
1.0.219 236 10/19/2021
1.0.218 269 10/18/2021
1.0.207 253 10/11/2021
1.0.155 237 8/31/2021
1.0.119 303 6/28/2021
1.0.112 276 6/16/2021
1.0.78 243 5/26/2021
1.0.49 263 5/24/2021