You will chirp with delight when you see how easy it is to make your very own 8x16 LED matrix display for any Feather. This kit combines two of our adorable miniature LED matrices with a FeatherWing driver board. At 0.8" square, these little 8x8 matrices have got everything a big LED matrix has, but bite sized! Double them up for 128 total bright LEDs.

We have these combo packs in White, Blue, Green, Red, Yellow, and Yellow-Green.

Normally, wiring up 8x16 matrices would require a breath-taking 24 GPIO pins, which is way too many pins. That's where this lovely 16x8 LED matrix backpack PCB comes in. It contains a HT16K33 I2C LED matrix driver that does all the multiplexing work for you, and is controlled over the two I2C pins. It's easy to use, has a portable library that runs on any of our Feathers to turn on/off each LED.

The 16x8 backpack is also great for making scrolling displays or small video displays.  In our example, we set it up to display small bitmap emoticons but you can also display text that moves - kind of like a sign in front of a miniature car dealership.

 This kit comes with:

  • A fully tested and assembled 16x8 0.8" LED FeatherWing 
  • 2 x ultra-bright square 8x8 matrices
  • 2 x 16-pin header

A bit of soldering is required to attach the two matrices onto the FeatherWing but its very easy to do and only takes about 15 minutes.


The 8x16 backpack makes it really easy to add a 128-LED display

The LEDs themselves do not connect to the Feather. Instead, a matrix driver chip (HT16K33) does the multiplexing for you. The Feather simply sends i2c commands to the chip to tell it what LEDs to light up and it is handled for you. This takes a lot of the work and pin-requirements off the Feather. Since it uses only I2C for control, it works with any Feather and can share the I2C pins for other sensors or displays.

Power Pins

The LED matrix uses only the 3V and GND pins for power and logic. Current draw depends on how many LEDs are lit but you can approximate it as about 120mA for most uses.

Note that the 3.3V power supply is a tiny bit lower than the forward voltage for the pure green, blue and white LED matrices but we didn't find any significant degredation in brightness. Really, they're still very bright.

I2C pins

All LED control is done over I2C using the HT16K33 interface library. This means SDA and SCL must be connected, see above for those pins.

The default address is 0x70 but you can change the address to 0x71-0x77 by bridging solder onto the address pins.

Address Jumpers

Changing Addresses

You can change the address of a backpack very easily. Look on the back to find the two or three A0, A1 or A2 solder jumpers. Each one of these is used to hardcode in the address. If a jumper is shorted with solder, that sets the address. A0 sets the lowest bit with a value of 1, A1 sets the middle bit with a value of 2 and A2 sets the high bit with a value of 4. The final address is 0x70 + A2 + A1 + A0. So for example if A2 is shorted and A0 is shorted, the address is 0x70 + 4 + 1 = 0x75. If only A1 is shorted, the address is 0x70 + 2 = 0x72


When you buy a pack from Adafruit, it comes with the fully tested and assembled backpack as well as a two 8x8 dual displays in one of the colors we provide (say, red, yellow, blue or green). You'll need to solder the matrix onto the backpack but it's an easy task.

Prepare the header strips:

You'll need a 12-pin and 16-pin long strip of header to attach the Featherwing to your Feather. Cut the header strip to length if necessary. It will be easier to solder if you insert it into a breadboard - long pins down

Add the FeatherWing PCB:

Place the circuit board over the pins so that the short pins poke through the breakout pads

And Solder!

Be sure to solder all pins for reliable electrical contact.

(For tips on soldering, be sure to check out our Guide to Excellent Soldering).

Do both header strips, all pins!

Check your solder joints visually and continue onto the next step

Next we'll attach the LED matrices
Check the Matrices and line it up next to the FeatherWing

Look for the text on the matrices. This is the 'pin 1' side, and lines up with the same side as the side with the filled in white dot on the PCB silkscreen.

There's a little 'play' in the LED matrices to make it easy to solder them in place. It isn't noticable when they're lit but if you want to make sure there's no gap between the matrices, use some tape to bind them together while soldering

Solder the matrix in place. Note this will be a little tougher because there's not as much space. Go slow, do one pin at a time and you can clip it after each point if you need!

Check your solder joints visually and continue onto the next step

Once soldered, clip each matrix wire short

You're done! You can now install software and get blinking


To talk to the LED helper chip you'll need to use our Arduino Adafruit LED Backpack library from github.

To download you can visit the repository, or simply click on this button:

Rename the uncompressed folder Adafruit_LEDBackpack. Check that the Adafruit_LEDBackpack folder contains Adafruit_LEDBackpack.cpp and Adafruit_LEDBackpack.h Place the Adafruit_LEDBackpack library folder your arduinosketchfolder/libraries/ folder.

You may need to create the libraries subfolder if it's your first library. We also have a great tutorial on Arduino library installation at:

Rename the uncompressed folder Adafruit_GFX and check that the Adafruit_GFX folder contains Adafruit_GFX.cpp and Adafruit_GFX.h

Place the Adafruit_GFX library folder your arduinosketchfolder/libraries/ folder like you did with the LED Backpack library

It's not actually used for the 7-segment display, it's only for the matrix backpacks but it's still required by the library so please install it to avoid errors! Restart the IDE.

Run Test!

Once you've restarted you should be able to select the File->Examples->Adafruit_LEDBackpack->minimatrix16x8 example sketch. Upload it to your Feather as usual. You should see a basic test program that goes through a bunch of different routines.

Note that the normal "matrix16x8" demo wont work the way you want because the matrix alignment is different on the Feather!

Upload to your Arduino, and open up the Serial console at 9600 baud speed. You'll see a little light show demonstrating bitmaps, drawing lines, circles and squares, text scrolling and more!

Library Reference

For the 16x8 displays, our library essentially treats it like a grpahical display with 128 pixels


You can create the object with

Adafruit_8x16minimatrix matrix = Adafruit_8x16minimatrix();

There's no arguments or pins because the backpacks use the fixed I2C pins.
By default, the address is 0x70, but you can pass in the I2C address used when you initialize the display with begin

matrix.begin(0x70);  // pass in the address

Drawing with Adafruit GFX

Once you're happy that the matrix works, you can write your own sketches. The 16x8 matrix supports everything the Adafruit GFX library - drawing pixels, lines, rectangles, circles, triangles, roundrects, and small bitmaps. For more details check out the GFX page which will detail all of the GFX routines.

Writing Data

Don't forget to 'write' the data to the display with


That's what actually 'sets' the data onto the LEDs!

Other things!

  • setBrightness(brightness)- will let you change the overall brightness of the entire display. 0 is least bright, 15 is brightest and is what is initialized by the display when you start
  • blinkRate(rate) - You can blink the entire display. 0 is no blinking. 1, 2 or 3 is for display blinking.


Adafruit CircuitPython Module Install

To use the LED backpack with your Adafruit CircuitPython board you'll need to install the Adafruit_CircuitPython_HT16K33 module on your board. Remember this module is for Adafruit CircuitPython firmware and not MicroPython.org firmware!

First make sure you are running the latest version of Adafruit CircuitPython for your board.  Next you'll need to install the necessary libraries to use the hardware--read below and carefully follow the referenced steps to find and install these libraries from Adafruit's CircuitPython library bundle.

Bundle Install

For express boards that have extra flash storage, like the Feather/Metro M0 express and Circuit Playground express, you can easily install the necessary libraries with Adafruit's CircuitPython bundle.  This is an all-in-one package that includes the necessary libraries to use the LED backpack display with CircuitPython.  To install the bundle follow the steps in your board's guide, like these steps for the Feather M0 express board.

Remember for non-express boards like the Trinket M0, Gemma M0, and Feather/Metro M0 basic you'll need to manually install the necessary libraries from the bundle:

  • adafruit_ht16k33
  • adafruit_bus_device
  • adafruit_register

If your board supports USB mass storage, like the M0-based boards, then simply drag the files to the board's file system. Note on boards without external SPI flash, like a Feather M0 or Trinket/Gemma M0, you might run into issues on Mac OSX with hidden files taking up too much space when drag and drop copying, see this page for a workaround.

If your board doesn't support USB mass storage, like the ESP8266, then use a tool like ampy to copy the file to the board. You can use the latest version of ampy and its new directory copy command to easily move module directories to the board.

Before continuing make sure your board's lib folder or root filesystem has at least the adafruit_ht16k33adafruit_bus_device, and adafruit_register folders/modules copied over.


The following section will show how to control the LED backpack from the board's Python prompt / REPL.  You'll walk through how to control the LED display and learn how to use the CircuitPython module built for the display.  As a reference be sure to see the Adafruit HT16K33 module documentation too.

First connect to the board's serial REPL so you are at the CircuitPython >>> prompt.

I2C Initialization

First you'll need to initialize the I2C bus for your board.  First import the necessary modules:

import board
import busio as io

Note if you're using the ESP8266 or other boards which do not support hardware I2C you need to import from the bitbangio module instead of busio:

import board
import bitbangio as io

Now for either board run this command to create the I2C instance using the default SCL and SDA pins (which will be marked on the boards pins if using a Feather or similar Adafruit board):

i2c = io.I2C(board.SCL, board.SDA)

LED Matrix

To use a LED matrix you'll first need to import the adafruit_ht16k33.matrix module and create an instance of the appropriate Matrix class.  There are three classes currently available to use:

  • Matrix8x8 - This is for a simple 8x8 matrix (square or round pixels, they're both the same driver and code).
  • Matrix16x8 - This is for a 16x8 matrix (i.e. double the width of the 8x8 matrices).  For the LED Matrix FeatherWing you want to use this Matrix16x8 class.
  • Matrix8x8x2 - This is for a 8x8 bi-color matrix.

For example to use the Matrix16x8 class import the module and create an instance with:

import adafruit_ht16k33.matrix 
matrix = adafruit_ht16k33.matrix.Matrix16x8(i2c)

The above command will create the matrix class using the default I2C address of the display (0x70).  If you've changed the I2C address (like when using multiple backpacks or displays) you can override it in the initializer using an optional address keyword argument.

For example to create an instance of the Matrix8x8 class on address 0x74:

matrix2 = adafruit_ht16k33.matrix.Matrix8x8(i2c, address=0x74)

You might notice the matrix turns on to a 'jumbled' collection of random LEDs.  Don't worry!  The display isn't broken, right now the module that controls it doesn't clear the display state on startup so you might see noise from random memory values.

To clear the display and turn all the pixels off you can use the fill command with a color of 0 (off):


Notice you must call the show function after calling fill to make the changes visible.  All of the LED backpack library operations operate on a buffer in memory and must be pushed to the display by calling show.  Don't forget any time you want an update to be visible on the display call show!

To turn all the pixels on you can use fill with a color of 1 (on):


If you're using the bi-color matrix you can even use a fill color of 2 or 3 to change to different colors of red, green, and yellow (red + green).

Next you can set pixels on the display using the pixel function.  This function takes the following parameters:

  • X position - X position of the pixel on the matrix.
  • Y position - Y position of the pixel on the matrix.
  • Color - 0 for off, 1 for on (or one of the LEDs for bi-color display), 2 or 3 for other bi-color display colors.

For example to set the first pixel at position 0, 0 to on:

matrix.pixel(0, 0, 1)

Don't forget to call show to make the pixel visible!

Or to set the opposite corner pixel at position 7, 7 to on:

matrix.pixel(7, 7, 1)

That's all there is to controlling the pixels on a LED matrix!  Right now the matrix library is simple and only exposes basic pixel control.  In the future more advanced drawing commands might be avaialable.

Brightness and Blinking

You can change the brightness of the entire display with the brightness function.  This function takes a value from 0 to 15 where 0 is the lowest brightness and 15 is the highest brightness.  Note that you don't need to call show after calling brightness, the change is instant.

For example to set the brightness to the minimum:


Or to set it back to maximum:


You can also make the entire display blink at 3 different rates using the blink_rate function.  Pass in a value 0 to 3:

  • 0 = no blinking
  • 1 = fast blinking (~once a 1/2 second)
  • 2 = moderate blinking (~once a second)
  • 3 = slow blinking (~once every 2 seconds)

Again you don't need to call show after setting the blink rate, the change will immediately take effect.

For example to blink quickly:


And to stop blinking:


LED 7-segment Display

To use a 7-segment display you'll first need to import the adafruit_ht16k33.segments module and create an instance of the Seg7x4 class.

import adafruit_ht16k33.segments
display = adafruit_ht16k33.segments.Seg7x4(i2c)

The above command will create the 7-segment class using the default I2C address of the display (0x70).  If you've changed the I2C address (like when using multiple backpacks or displays) you can override it in the initializer using an optional address keyword argument.

For example to create an instance of the Seg7x4 class on address 0x74:

display = adafruit_ht16k33.Seg7x4(i2c, address=0x74)

You might notice the display turns on to a 'jumbled' collection of random LEDs.  Don't worry!  The display isn't broken, right now the module that controls it doesn't clear the display state on startup so you might see noise from random memory values.

To clear the display and turn all the LEDs off you can use the fill command with a color of 0 (off):


Put Characters

You can put a numeric value in any of the display's 4 positions with the put function.  For example to set position 0 to the number 1 and position 1 to the number 2 call:

display.put('1', 0)
display.put('2', 1)

The put function takes these parameters:

  • The character to display - This needs to be a string and not an integer or number.
  • The position to place the character - This can be a value of 0, 1, 2, or 3.

Remember to call show to make the change visible!

You can also pass some special characters to display to the put function:

  • Colon - Use ':' to turn the colon on, you don't need to specify the position parameter.  To turn the colon off you must currently clear the entire display with fill as shown above.
  • Period / decimal point - Use '.' to turn a decimal point on at the specified position.  To turn the decimal point off set the character at the same position again (the decimal point will not be preserved).
  • Hex character - Use a character 'a' through 'f' to display a high hex character value at a specified position.

Display Numbers and Hex Values

There are also functions to display a number or hex value for convenience.  Remember the display only has 4 digits so a best effort will be made to display the number--you might need to round the number or adjust it to fit!

To display a number call the number function with an integer or floating point value:


Or to display a hex value call the hex function with the value (remember only 4 digits are available so values from 0x0000 to 0xFFFF):


You can also adjust the brightness and blinking of the 7-segment display just like with the matrix display above.  See the matrix brightness and blinking section for details on the functions to call.

LED 14-segment Quad Alphanumeric Display

To use a 14-segment quad alphanumeric display it's almost exactly the same as the 7-segment display, but with a slightly different class name.  Import the adafruit_ht16k33.segments module again but this time create an instance of the Seg14x4 class.

import adafruit_ht16k33.segments
display = adafruit_ht16k33.segments.Seg14x4(i2c)

The above command will create the 14-segment class using the default I2C address of the display (0x70).  If you've changed the I2C address (like when using multiple backpacks or displays) you can override it in the initializer using an optional address keyword argument.

For example to create an instance of the Seg14x4 class on address 0x74:

display = adafruit_ht16k33.segments.Seg14x4(i2c, address=0x74)

You might notice the display turns on to a 'jumbled' collection of random LEDs.  Don't worry!  The display isn't broken, right now the module that controls it doesn't clear the display state on startup so you might see noise from random memory values.

To clear the display and turn all the LEDs off you can use the fill command with a color of 0 (off):


To use the display you can use the put function just like with the 7-segment display.  However the put function for the 14-segment display can take any alphanumeric character.  For example to write 'hi' to the display:

display.put('C', 0)
display.put('I', 1)
display.put('P', 2)
display.put('Y', 3)

You can also display numbers and hex values just like with the 7-segment display using the numberand hex function.

However you can also display a text string with the text function.  Remember there are only 4 characters available so keep the message short!  For example to write 'mpy!':


And just like with the 7-segment display you can use the brightness and blink functions just like with the matrices to control those attributes of the display!