Display HT16K33 4 digit 16 segments 0.8"


I wanted some displays slight different that the ebay/aliexpress offering and decided to design my own.
The idea with this design is that my LED display driver library supports this schematic. This means that in addition to the boards designed here, the schematic can also be included in other projects (With or without indicators and buttons) and then the library will support the display for that design.

    Display HT16K33 4 digit 16 segments 0.8"
        Parts to use
        Part list
        Using the button input
        Circuit board
        Using decimal point (DP)
    Notes and download



Parts to use

For the digits I selected 16 segment 0.8" alphanumeric displays, I can have 4 of these within 10cm. For indicators I decided to use a 5mm RGB led for each digit, this is a very flexible solution.
The above means I have 4x17 leds for the displays and 4x3 leds for the indicators for a total of 80 leds to drive. This sound reasonable enough, but it is not because the display needs 17 segment drive lines and the driver only have 16. There is no good solution for this (See schematic).

The displays I uses are from KingBright:
DSC_0253 DSC_0255 DSC_0254

Segments Digits

The above segment naming do not match my segment naming.


The actual pin numbers for each segment, due to difference in pin naming this is easier to check against other brands.

For driving LED displays the typical chips are: With requirement of 16+ segment drives the only choice is HT16K33 28pin.

The indicator is a standard common cathode 5mm RGB led:




A important point for me was to keep the amount of soldering (especially SMD) as low as possible, i.e. only include what is absolute necessary for the circuit. That affect how I designed the button interface.
Because the chip uses the same matrix for buttons as for display, pressing two buttons will short two segments, this do not in any way damage the chip or display, but it looks silly. To avoid this each button can include a series diode, I did not make space for them on the circuit board. They can be mounted at the buttons if desired.
I did not want to give completely up on the decimal points and added a connector and series resistors for them. This means I can link from VCC to a any of the DP segment to get a fixed decimal point or use four pins on the Arduino to control all the DP segments.

This design is for 5V and is not guaranteed to work when connected to 3.3V processors, a level translator must be included between the display and the processor for reliable function.

MemoryMap Names-16-segment

The memory map of the HT16K33 controller, the red part uses the segment definition from my library (As shown beside the table), the _ means a unused bit.
The difference in segment naming will only affect the segment definition in my library, it do not have anything to do with the hardware.

Part list

ReferenceNumber ofComponent
U1, U2, U3, U44KingBright PSA08-11 any color or similar
D1, D2, D3, D44RGB 5mm led, single color 3 or 5 mm led can be used
U41HT16K33 28 pin
R1, R2, R3, R4, R5522kohm 0805
R6, R7, R8, R94220ohm 0805
C11100nF 0805
C2147uF 1206 (Smaller capacity can be used)
D711N4148 diode SOD323 or other small diode.
J119 pin strip
J2, J3, J434 pin strip

The price is controlled by two items: The displays (About $3 each) and shipping, everything else is about $2 together. It is necessary to buy for multiple PCBs to get this price (i.e. 10 displays, 5 pcbs and 10-100 each of the passive parts and the diodes).
I got the displays from mouser.com and the HT16K33 from lcsc.com (It is also on aliexpress.com).
The other parts are from aliexpress.com, ebay.com and lcsc.com

Using the button input

SchematicNoDiodes SchematicOneDiodes SchematicDiodess

The button switches can be wires with or without diodes: The chip supports up to 39 buttons using 3 scan lines and 13 input lines. If more than 8 buttons are needed it is possible to find the signals on the back of the PCB on the display pins. The library reads all buttons inputs, but do not return more than the first 8, to get more the code must be modified.

Circuit board



The layout with four digits and 4 leds.


The board size and placement of mounting holes. The mounting holes is for M2 screws.



Here is the board finished board, it have a few bugs on it: The D5 symbol is the wrong way around. I routed some wrong wires to the Buttons connector. Both bugs are fixed in the attached gerbers and project files.


For easiest mounting use this sequence:

The chip has a marking at pin 1 and must be mounted in the orientation shown above (The white line indicates pin 1).


Diodes has a line to mark direction, this line must be mounted towards the jumper pads.


Orientation of display, the button connector is bottom.


The long pin of 4 pins RGB leds goes in the marked hole. With single color leds it is the short pin that goes into the marked hole and the long pin goes in the 4 hole, this means they will be on the blue indicator line.


The board is mounted.


Two boards in series.


To use multiple boards the correct address links must be shorted:


All parts can be mounted on the PCB, but it may not be necessary. This means the simplest version is only HT16K33, two capacitors, one 4 pin connector and 1 to 4 displays.

Using decimal point (DP)

Because the driver is 16 bit wides and there is 16 segment, there is no drive left for the decimal point, but there is a way around it:


With this connector any decimal point can be turned on permanently by linking from VCC to the desired decimal point. DP0 is left most digit.
It is also possible to connect the pins to microprocessor and control them from there, but it requires a output pin for each digit.
The decimal point is not affected by the brightness control, this means they matches the display best when it is at full brightness.

If the decimal point has a fixed position, use the link. For a single position with on/off control it manually from the Arduino. To get full control of all the decimal points use the library mode with support for it.
It is possible to use an IO-expander to handle the decimal point, but it requires code to scan the display buffer and copy decimal point to the expander. Use "getDigits();" to get a pointer to the buffer and then AND each byte with digitDp to find the decimal points (This only works with the W version of the driver).


I had two purposed with this display, one was to try the 16 segment display, the other was to get a larger (0.8") text display. Both succeeded nicely.
It did require some update to the Led display driver library, I have added both a 16 bit wide driver and a 32 bit wide driver, the extra 16 bit means support for a decimal point using the extra connector on the display, but it will increase the memory consumption.

Notes and download

LED display driver library

Gerber for display
KiCad project for display