LED Modules

Note: hexadecimal values are marked as 0x.

Introduction

LED (Light Emitting Diode)  displays can be found in many forms, capable of indicating letters, numbers, and other symbols. For examples of LED displays please have a read of my overview of diodes and LEDs using this link:

https://sites.google.com/site/jamesskingdom/Home/electronics-by-james-s/electronic-components-explained#TOC-Diode

By pairing LED displays with additional circuitry LED modules are able to accept commands and automatically refresh the display as well as be chainable (connected to one another in succession) to other LED modules, making the control of LED displays, especially large collection of displays, much easier. The LED display modules typically have a serial or parallel interface usually designed to be connected to some form of computer or microcontroller in order for the display module to receive instructions, such as the text or symbols to display, their position, colour, and so on.

Because LED displays have good contrast in most lighting conditions and do not require a backlight, LED modules are ideal for equipment used both indoor and outdoor, as typically seen on home equipment as well as at train stations, to give a few examples. Generally, there are 2 main types of LED modules which are the 7-segment (or higher) types used to give numerical (and limited text) information and the dot matrix types which display numbers, characters, and symbols in a more easily readable format than the segment type.

LED modules are available ranging from small to very large (usually consisting of many smaller LED displays) and may be only able to display one of a few colours for the segments or dots, or capable of RGB which can output thousands of colours. But on the downside LED modules typically require more current than LCDs, have much lower resolution, and are more expensive compared to LCDs with similar resolution, and so on.

OLED (Organic Light Emitting Diode) displays are an alternative to traditional LED displays, offering lower power consumption and high contrast even at small size, and are being increasingly used in TVs, mobile phones, media players, and so on. Cheap OLED displays are available to hobbyist, typically with some kind of serial interface (SPI/I2C/etc.), useful for relaying real time information to the user in a compact form, for example.

Please see the various sections for a look at a number of LED Modules I have encountered. Note that downloads are at the bottom of the page.

New: Update: Sure 2416... (2/4/24)

SSD1306 0.91" 128x32 OLED Module (1/4/24)

SSD1306 GME12864-43 0.96" 128x64 OLED Module (31/3/24)

P10 LED Panel With HD-U6A Controller (04/09/2019)

Dinamap Compact T LED Board (26/12/2017)

Update: Sure 0832... (03/03/2015)

Update: DLR1414 4 Character 5x7 Alphanumeric LED Dot Matrix Display Module (21/05/2014)

Build Your Own Display

You can email me at james.boshikoopa@gmail.com

To return to the main electronics page please click here.

Dinamap Compact T LED Board

This LED board comes from the Dinamap Compact T vital signs monitor which you can read about here:

https://sites.google.com/site/jamesskingdom/Home/electronics-by-james-s/inside-manufactured-products#TOC-Dinamap-Compact-T

The board has the markings '8630AB03' and '8630BS03' and is based around x3 Maxim max7219 chips (IC1-IC3) which handles the displays and the 3 individual LED's D1 - D3. To read up on the max7219 check up on the datasheet at:

https://datasheets.maximintegrated.com/en/ds/MAX7219-MAX7221.pdf

Here is a photo of the LED board:

The max7219 is designed for common cathode LED displays and a single chip can handle up to 64 segments (8 displays having 8 segments each) or 64 individual LED's. The chip handles multiplexing and requires a single resistor to set the current for all of the LED's as well as having software control over the LED intensity. A number of commands are recognised, which includes the option to enable BCD decoding and individual segments can also be modified. A serial interface is used for communication which can run up to 10MHz.

On the LED board are x19 7-segment displays (DS1 - DS19) and three LED's (D1 - D3), with combinations of colours and display sizes. Connector PL31 (on the underside) is for the LCD that is also part of the Dinamap Compact T and connector PL30 (also on the underside) is the main interface to the LED board. Pin 1 is identified as the pin that has a square blob of solder; looking down at the main component side pin 1 is at the top left and it can be seen that the pin immediately below it is connected to pin 1. Using numbering with odd numbers at the top and even at the bottom the connector pinout is as follows:

1 +5V

2 +5V

3 GND

4 GND

5 DIN IC1-IC3 via 1K resistor

6 CLk IC1-IC3 via 1K resistor

7 IC1 LOAD via 1K resistor

8 IC3 LOAD via 1K resistor

9 IC2 LOAD via 1K resistor

10 LED D1, LED D2, and LED D3 K

11 LED D5 A (switches board)

12 S4 built-in LED A (switches board)

13 GND

14 LCD backlight control (connects to TR1 gate).

The resistors in series with the DIN, CLK and LOAD inputs are possibly to protect the IC's in event of a fault and to help prevent ringing. Because IC3 handles 2 different types of displays as well as individual LED's, resistors/links R1-R11 have been placed in series with the anodes of the LED's that have different current requirements (this is explained in the Dinamap compact T service manual).

Following is list of the displays handled by IC1 - IC3 and in brackets is the display number starting with 0 for the first display:

IC1 handles DS1 (0), DS4 (1), DS7 (2), DS11* (3), DS14 (4), DS17 (5).

IC2: DS2 (0), DS5 (1), DS8 (2), DS10 (3), DS12 (4), DS15 (5), DS18 (6).

IC3: DS13 (3), DS16 (4), DS19 (5), DS3 (0), DS6 (1), DS9 (2), LED D1, LED D2, LED D3. LED D3 is segment e of digit 6; LED D2 is segment d of digit 6; LED D1 is segment c of digit 6.

*Not marked on the board.

At power up the max7219 IC's control registers are reset, and any connected displays are blanked as the chip starts up in shutdown mode but commands can still be sent to the chip. It is easy to put the IC into test mode, which illuminates all connected segments, but the IC must be taken out of test mode for it to be able to do anything else, even to exit shutdown mode.

To test the LED board I wrote some code for the Arduino Uno which you can find attached to the bottom of this page as 'Dinamap_Compact_T_LED_board_test.ino'. Download the file, open it up in the Arduino IDE (V1.8.3 or later) and transfer the program to your Arduino. Connect the LED board as follows (the pin number in () refers to the LED board pin number):

LED board +5V (1/2) to Arduino 5V

LED board GND (3/4) to Arduino GND

LED board DIN (5) to Arduino D2

LED board CLK (6) to Arduino D3

LED board LOAD 1 (7) to Arduino D4

LED board LOAD 2 (8) to Arduino D5

LED board LOAD 3 (9) to Arduino D6

When you power up the Uno you should see after a brief delay that all segments and LED's come on then after 2 seconds the 7-segments displays will be lit as:

Displays 0 - 5 on each of the displays in group 1 (IC1).

Displays 0 - 6 on each of the displays in group 2 (IC2).

Displays 0 - 5 on each of the displays in group 3 (IC3).

Let's now look at the Arduino code which is something I put together quickly and doesn't represent well written programming. In the setup() function we set up our I/O which are the LED board signals (DIN, CLK, LOAD 1, LOAD 2 and LOAD 3) which are set to outputs and their default states are also set. A delay of 1 second begins which I found necessary as without it sometimes the LED board would be blank or 'glitched up' after power up (this is when powering the Arduino off PC USB); looking online other people had similar issues. After the delay, all 3 max7219 IC's are put in test mode by calling LED_out_data() with the data value to send (LED_test_mode) and the display group to update. If you look at LED_out_data() you will see it sends out each bit on DIN as a 16-bit string, starting with the most significant bit first. Once DIN is set accordingly, LED_clk() is called to take LED_CLK high then low and once all bits are sent LED_load() takes the appropriate load signal (LED_LOAD_1/LED_LOAD_2/LED_LOAD_3) high then low so that the max7219 acts of the data it has been given.

Back to setup(): there is a delay of 2 seconds and then we do the following:

Exit test mode.

Set to use BCD code B mode for all digits.

Set LED intensity to medium.

Set to scan all digits.

Exit shutdown mode.

Lastly, we use function LED_out_disp_num() with the display group to update and the number of digits in the group so that each display in the group in order displays 0, 1, 2, etc. The routine LED_out_disp_num() always writes to the maximum 8 digits but when it goes past the specified last digit it blanks the remaining segments. To actually update the displays we call LED_out_data() either with digit_num OR'd with the digit number (i) so that it gets the BCD number or digit_num is OR'd with 0x0F which in BCD code B (see the max7219 datasheet for the full list of values) blanks the segments.

Some notes:

With all of LED's on (using test mode on IC1 - IC3 without changing default intensity) I measured 330mA was being drawn by the LED board.

I noticed flickering on the LED displays and LED's handled by IC3 when using the default brightness. 

DLR1414 4 Character 5x7 Alphanumeric LED Dot Matrix Display Module

This LED dot matrix display module can illuminate up to 4 characters, each of which can be one of a number of predefined letters, numbers, or special characters such as punctuation. Each LED dot is red and the whole module runs off a single 5V supply and is TTL compatible. Note that the display module starts up in a random state.

The display module is not truly intelligent as it can only receive raw data of what character to display; it cannot accept any commands. Two address signals, A0 and A1 select which digit to update and a single active low write signal latches the data for the chosen digit. The ASCII value of the character to display for the selected digit is written to the 7 bit data bus; the display module has 128 built in characters conforming to the ASCII standard (with some exceptions). 

A triangle on the side of the display points out the first pin and on the opposite side of the display is pin 12 (just like with DIP IC numbering). The pinout is as follows:

1 D5

2 D4

3 /WR

4 A1 digit select

5 A0 digit select

6 Vcc

7 GND

8 D0

9 D1

10 D2

11 D3

12 D6

Each digit is numbered from 1 to 4 with digit 4 being on the end where pin 1 and 12 are. Use A0 and A1 to select the digit as below:

A1 A0 Digit

0   0    1

0   1    2

1   0    3

1   1   4

When it comes to soldering LED displays I usually use a chip holder and fortunately if you want to fit multiple of these displays side-by-side onto chip holders you can fit two into a single 28 pin chip holder (there is approx. 20mm distance between the rows of pins). This works out because there is a gap of one pin's worth between both displays.

SSD1306 GME12864-43 0.96" 128x64 OLED Module

I bought from Temu a couple of OLED displays, the first of which will be discussed in this section, a GME12864-43 0.96" (diagonal) monochrome I2C display with 128x64 pixels for £2.96. I learnt the hard way that when Temu discontinues a product you can now longer view the associated page and access the little technical information there was. What I did know was the display had yellow and blue pixels but can still be considered monochrome as the yellow pixels occupy the first 16 rows and the remaining rows have blue pixels but what I didn't realise was that there is a blank row between the last yellow row and first blue row, something that as we shall see shortly took me by surprise.

As mentioned the module uses an I2C interface, which is accessed via the already soldered 4-way male header, with pins labelled VCC, GND, SCL and SDA. Written on the flat flex is GME12864-43, which I Googled, coming back with results such as from alibaba.com, on that page it can be seen that the display is similar, but the driver IC is claimed to be SSD1315 (which I now know isn't the case for my one). Another Google result was for winstar.com.tw, on that page is a very similar display, and the main IC is stated to be SSD1306 (which is correct). The datasheet downloadable from the page states VCC can be 2.8-5.2V, it also specifies the input high voltage of VCC max so would be 5V tolerant if VCC is 5V.

On the PCB underside of the display module I have it has the I2C address select with the address set to 0x3C using a resistor (alternatively can be set to 0x3D). On the PCB it has written:

GME12864-11-12-13
V3.6

I noticed in the corner of the display it has written 9E6018A0, one particular Google result is a wiki for the display:

http://www.lcdwiki.com/0.96inch_SPI_OLED_Module

It claims the display runs on 3-5V and is 5V tolerant, as well as giving information on how to set the type of interface to SPI/I2C by modifying the PCB. There are also technical information links and software downloads. If you click on the link 0.96inch OLED Specification(YELLOW and BLUE) you will be taken to a technical PDF for the LED096Y OLED module. If you look under Active Area / Memory Mapping & Pixel Construction of the PDF on page 5 you will see it shows how the yellow and blue sections are separated, this is also clearly shown in the illustration on the following page.

The display did come in a small plastic box with a Chinese label, which when translated reads:

0.96 4-pin two-colour/Y-B
Wide board small screen
Batch:40229

The box came in a bag which states the brand as Aokin Electronic. In addition it states Blue Yellow 0.96 and has 10534YB also on the label, which Googled gives a similar alibaba.com result. On the page it states the IC to be SSD1306, and the typical power supply 2.8V, but can be run from 3.3-5V. If the display controller IC is indeed SSD1306 we can look at the datasheet to get full technical information, it can be found at:

https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf

The datasheet SSD1306 confirms it's a 128x64 dot matrix OLED/PLED Segment/Common Driver with Controller made by Solomon Systech. The datasheet specifies no maximum for high logic input level, however, specifies supply voltage to be -0.3 to +4 and input voltage to be VDD+0.3V max. Looking online at SSD1306 based displays people generally suggest to use 3.3V to power the display and also for logic so I decided to use my STM32 Discovery Kit IoT Node board, since that is a 3.3V based device, and has Arduino Uno compatibility for ease of use. The display's VCC needs to be connected to the Discovery's 3.3V, GND to GND, both on CN2, SDA to D14, SCL to D15, both on CN1.

Fortunately there is an Arduino SSD1306 library for ease of use:

https://www.arduino.cc/reference/en/libraries/ssd1306/

This can be installed from within the Arduino IDE, go to Tools->Manage Libraries... Search for SSD1306 and install the top result (should just be called SSD1306) - there is also an Adafruit library which I later found out is more flexible. After installing, will then have a lot of examples (File->Examples->ssd1306). Note that the library defaults to I2C address of 0x3C, which matches what my display is set to.

I tried out the ssd1306_demo (File->Examples->ssd1306->demos->ssd1306_demo), which goes through showing graphics, text and animation. This was when I noticed the gap between the yellow and blue parts of the display which disrupt the demo somewhat since images have a line through them. To be clear, there aren't missing pixels, it's just that the 17th row starts one row down than on a 'normal' display. If you look at the display while it's off and get the right angle you can see the two parts of the display, the intention with this approach is probably that small amounts of information is shown in the yellow area (e.g. date/time) and then the blue area is used for graphics. With new designs you can take into account the unusual quirk and work around it or modify existing code to take advantage of the separation.

To illustrate the division between the two parts of the screen I modified the demo sketch to display four lines using ssd1306_drawLine(), each line being the width of the screen and placed at Y locations 0, 15, 16, and 63, resulting in two yellow lines and two blue lines, with a blank row between the second yellow line and first blue line.

While I'm very happy with the display, especially liking the high contrast and decent resolution in a small size, always take caution when buying displays (and other components) from Temu and similar sites, especially when there isn't a lot of information available at the point of purchase.

While I was playing with the display and with Easter approaching I put together an Easter egg utilizing the OLED display to output the message 'Happy Easter', and four LEDs positioned around the egg switch on and off in succession and increasing speed. I made the egg from carboard with felt glued on front, with holes made for the LEDs and display peeking through a hole in the centre of the egg. The Arduino script which runs the display and LEDs can be found downloadable from the bottom of the page and is called Easter_2024.ino.

You can view a brief demonstration of the Easter egg in action below:

SSD1306 0.91" 128x32 OLED Module

The second display module I bought from Temu is a 0.91" (diagonal) blue 128x32 pixel OLED for £2.54, and as with the first OLED I bought from Temu (GME12864-43), the product was discontinued after I bought it, along with any technical information there may have been. On the outer packaging it states the brand to be Aokin Electronic, same as the other OLED display I had purchased from Temu. The inner packaging has a Chinese label, stating it to be a 0.91 4-pin blue. Indeed the module has 4 holes to solder the provided male header, with labelled connections on the PCB for GND, VCC, SCK, SDA. On the display flat cable is written B23112608, the last character may be a B as it's hard to read.

On the PCB underside it has written:

0.91 OLED
Ver:1.6

To test I used a STM32 Discovery Kit IoT node since the display likely runs on 3.3V and limited to 3.3V logic levels, and the board is Arduino Uno compatible, making testing easy. To connect the display to the Discovery:

Discovery GND to OLED GND
Discovery 3V3 to OLED VCC
Discovery D15 to OLED SCK
Discovery D14 to OLED SCL

No I2C address is specified on the display module but with it hooked up to the Discovery board I used an I2C scanner sketch:

https://playground.arduino.cc/Main/I2cScanner/

This revealed the address to be 0x3C. Guessing the display module uses the SSD1306 controller as with the other OLED display, I tried a test sketch:

ssd1306_128x32_i2c

Which is part of the SSD1306 library:

https://www.arduino.cc/reference/en/libraries/ssd1306/

This worked successfully, confirming that indeed the module uses the SSD1306 driver. Note that the usable display area is smaller than the glass, especially noticeable in the vertical direction.

Sure 0832 DE-DP10XV110 LED Dot Matrix Display Module

This display is a real beauty but quite surprisingly can be bought fairly cheap which is just as well as the accompanying documentation is very poor and not because it was translated from another language. The documentation has only just the basic information for using the display and some parts are quite confusing. For example, the display module has a blink command that you might assume would flash all the LEDs on or off but it actually blinks only LEDs that were previously lit; there is no mention in the documentation what exactly the blink command does so it's only though trying that you find out.

The display module (below) has 256 red LEDs arranged in an 8 by 32 format (8 height and 32 wide, although you could have it the other way up and treat it as a tall display). The module is actually made up of 4 smaller LED dot matrix displays each of which has 64 LEDs in 8 by 8 format, however, the module chip maps the addresses to the correct LEDs for you.

Cascading the display modules is possible so that you can put together up to 4 display modules to create a longer or higher display system. Each display module has two 16 pin connectors for power and interface signals so that each display can be linked up to the next (a ribbon cable came packaged with the display module). There is also a set of switches on each display module in which to give each a unique selection value through the interface (so that if you do have more than one display connected together, you can select each in turn to 'talk to' by its ID value). If you do link up display modules, you can solder connectors to the display modules in which to supply more power.

Being a serial display module data has to be sent to the display as a number of bits one after each other along with a write or read signal that acts as a clock for timing. Although it is possible to read from the display module's memory, if you are interfacing using a computer you can probably do without the read connection (by keeping it at logic 1) since a computer should have enough memory to keep a copy of what is on the LED display if need be. But with the case of a microcontroller based system that has very little RAM is might be a good idea to make use of the read signal.

The display module runs off a 5V supply (although not mentioned in the documentation, it appears to be TTL compatible) but is able to retain its memory long after power is disconnected, perhaps due to an on-board capacitor. Interestingly, although the display module is one colour only, the LEDs look to be of the tri-colour type (if you look closely at each LED you can see three connections) and since the display module is available in different colours, perhaps Sure only connect the colour that is needed save having to use a different display type for each colour type.

There are a number of commands that the display module recognises to turn the display on or off, to write data to the display memory to turn the LEDs on or off, to read from the display memory, and various others. Even though the commands have to be sent in serial form and to fill or clear the display requires a lot of data to be sent to the display module, it still updates instantly even through a parallel port interface (yes I used the parallel port even though the display module is serial but it was the best interface for me to use at the time).

You can write 4 bits to each display memory address and each of those 4 bits controls a group of 4 LEDs in sequence. To light an LED, the bit needs to be at logic 1 and to turn off an LED the bit must be at logic 0. Since the display module is not able to generate characters itself, you have to create the characters (numbers, letters, etc) and other images yourself and then send them to the display module as the correct arrangement of bits.

I had planned to use the display in a message board which would display the time, date and messages and for that I used an Arduino to update the display. While that worked OK I found it very time consuming to keep making small changes before transferring to the Arduino. So I moved to using the Raspberry Pi since that would let me develop the code on the computer itself and I would see the results much quicker.

At the bottom of this page you can download my test code, 'Sure_0832_test.py', a Python script for the Raspberry Pi which works the LED display through the Rasp's GPIO. It is designed for Python V3 and as it uses GPIO must be run from the terminal using:

sudo python3 Sure_0832_test.py

The hardware setup follows (LDM=Sure 0832 LED dot matrix display. Rasp GPIO numbers are the pin numbers)

LDM pin 3 (/CS1) to Rasp GPIO pin 12

LDM pins 1 (/CS2), 2 (/CS3) and 4 (/CS4) to Rasp +5V pin 2

LDM pin 5 (/WR) to Rasp pin 16

LDM 6 (/RD) to Rasp +5V pin 2

LDM 7 (DATA) to Rasp pin 18

LDM 12, 14 and 16 (+5V) to Rasp +5V pin 2

LDM 8, 11, 13 and 15 (GND) to Rasp GND pin 6

You must set the 0832's CS switches so that only CS1 is set to on.

When the script is run you should see the time displayed in format hour:minute with a ':' flashing every second. When Ctrl+C is pressed you will be given the option to change the current mode; 'T' for time, 'D' for date (in format day/month), 'M' to scroll a message from right to left, or 'Q' to exit the program. After entering your selection and pressing Enter the mode will change and as long as you did not quit you can press Ctrl+C to bring up the options once more.

At the main program start point (near the end of the script) the GPIO is setup and then a loop is entered which checks the current mode and calls the necessary function to update the display. If Ctrl-C is pressed then the KeyboardInterrupt exception is raised and the getChangeMode() function is called to ask the user what mode they want to change to before actually changing the mode.

To display anything on the LED display then the displayChar() function is used which takes as input charI (character index) and charPos (the character to display). This function displays a single character anywhere on the display using a charPos from 0 (left side of display) to 64 (right side of display), even values only. The reason for even values is that each character is 5x8 dots and vertically two addresses make up one line of the character as each address controls four dots vertically. Thus each character requires 5 bytes and the character data is stored in the chars[] list.

Function displayChar() will clip characters or part of characters that are partly off the display to one end so that scrolling is smooth. Building on top of displayChar(), displayStr() takes a null terminated string (str) and start position (startPos) and displays the string by calling displayChar() to show each character. While displayChar() takes a character index which indexes chars[] displayStr() uses ASCII values and converts to the charI values.

Another notable function is fillDisplay() which writes to every LED by either turning them all on (by passing True) or all off (by passing False). This is useful for testing and for clearing the display which is what the function clearDisplay() does. Function fillDisplay() does not use the most optimized code, however, but it is still very fast.

There are some low level functions to talk about, starting with opAddress() which outputs an address to the display. Function opCommand() outputs a command, such as to turn the display system on. Lastly, opCmdCode() outputs a command code, which is the value representing the command.

There are a number of things that need to be fixed, one of which is the flickering you see when a message scrolls across the screen. This can be improved either by making clearDisplay() more optimized or by only outputting the dots that actually change between each frame. Another problem is that sometimes dots appear that shouldn't, however, I've yet to find what causes the random dots which may be a problem with the display itself.

Sure 2416 DE-DP016 LED Dot Matrix Display Module

This display module is similar to the Sure 0832 DE-DP10XV110 LED Dot Matrix Display Module but with a different arrangement of pixels and more of them. It has 384 red LEDs arranged in a 24 by 16 format (16 height and 24 wide), consisting of six UPM1088DEG LED displays. The displays combined measure 96x64mm and the overall PCB size is 99x96mm. Although up to four of these display modules can be linked up in the same way as the 0832 display module, the 2416 modules can only be stacked closely together side-by-side as the main circuit is at the bottom of the display module.

The display module can be seen below:

Although the LEDs are on maximum brightness they don't fare well when surrounded by decent illumination but do appear brighter than the photo suggests. Notice the flux residue especially around the connectors that wasn't cleaned up from manufacture.

Bundled with the display module was two ribbon cables, and two additional power connectors were already soldered to the display module should you need to provide external 5V power rather than power off whatever is controlling the display. The pinout is almost the same as the 0832 display module with the difference in the order of the chip select connections (a much more logical order). So if you wanted to link one of these displays to a 0832 display module, all you need to do is remember that the chip select signals will be different for one of the displays. Oddly, in the documentation (which is only slightly worse than the documentation for the 0832 display module), the photo of the display module shows that it has eight switches yet the pinout lists only the (expected) four chip select signals.

There is one problem with this display module using the same control chip as the 0832 display module (HT1632); when power is first connected, it is only possible to access half of the display. By way of a command (called common options) you have to tell the display module to switch to the mode where you can use the whole display. This also changes the layout of the display memory addresses so that they flow down the complete display. 

As mentioned the controller IC is a HT1632, located below the LED modules on the PCB. The controller datasheet can be found at:

https://cdn-shop.adafruit.com/datasheets/ht1632cv120.pdf

Which shows the IC has 5V tolerant inputs, take note.

One way to test the display is by using an Arduino, for example, you can use this library:

https://github.com/adafruit/HT1632

It can be installed through Tools->Manage Libraries... Search for HT1632 and install. Make sure you select to install dependencies if prompted. After installing you will find examples at File->Examples->HT1632

I tried the basicdemo; if you look at the start of the sketch you will see how to connect the display to an Arduino (any one should work). You can use connectors BR1/BR2 on the display module for DATA, WR, CS (CS1), and GND, don't forget to also connect +5V (either to Arduino 5V or external PSU with common GND connected), using either the interface connectors or J1/J2 power connectors. Also, don't forget to set CS1 switch to on, and connect to CS1 for CS. However, for it to work I had to change in setup() of the sketch from:

matrix.begin(ADA_HT1632_COMMON_16NMOS);

to:

matrix.begin(ADA_HT1632_COMMON_16PMOS);

If you are unsure which one to use just try either and see which one works.

I modified the basicdemo sketch so all the pixels were on at maximum brightness and then measured the current drawn by the display module on the 5V line and found it to peak at 156mA, which a typical Arduino can happily supply.

Additionally, I did try the matrixdemo and matrixshapes example sketches but even after making the aforementioned necessary change in setup() the images weren't displayed correctly, possibly because the library expects a different arrangement of LED modules, so the code would need to be modified to fix but at least the library shows the display working.

Build Your Own Display

While displays of all sorts are readily available at cheap prices, it's very rewarding to make your own and it may be that you can't get hold of a particular type of display or the one you want is expensive. This section will deal with making your own 7-segment LED display which can be connected to some form of decoder to show numbers on the display. So while the rest of this page has been concerned with display modules, which are displays that have a built-in decoder and interface, this section is about making just the display part.

A 7-segment display is made up of 7 segments arranged in a figure '8' which can display numbers and some letters by lighting combinations of the segments. I should point out that although these types of displays are called 7-segment, they often include one or more LED's that act as a decimal point. The decimal point may be at the left of the main 7 segments, to the right, at both sides, and may even include additional LED's either side near the top (such as for clock radios).

Internally, big 7 segment displays, like those typically used in arcade machines, their segments are actually made up of multiple LED's in a row, since a single LED would not light up the whole area of the segment. If you look carefully at the back of one of these large displays while the segments are on, you should be able to make out the individual LED's that make up each segment.

Before making the display you need to think about the size you want it to be, the colour of the segments and how many decimal points (if any) you want. A good idea is to pick the LED's you want to use (they could be round or rectangular) and then place them into a board with pre-drilled holes (such as strip board or matrix board). You can then space out the LED's as you please and see how they look as well as the overall size of the display.

Once you know the layout of the LED's and how many LED's each segment is made up of you can work out the wiring. This will depend on whether you want the display to be common anode or common cathode and how the LED's of each segment are to be connected. If you want to be able to use low voltage for the segments then the LED's in each segment can be connected in parallel (through suitable limiting resistor). However, if you intend to operate the display segments at a higher voltage then the segment LED's could be connected in series which could eliminate the need for segment limiting resistors (for e.g., 3 LED's with a forward voltage drop of 2V can be connected in series and run off 6V without a limiting resistor). If there are a lot of LED's in each segment then you may have to connect them in a combination of series and parallel as to get a good balance of voltage and current requirements.

I needed a large, dual 7-segment LED display for a project and instead of buying one I made my own which you can view below:

Except for the two decimal point LED's, each segment is made up of three blue, high brightness LED's in parallel. As there were only three LED's for each segment I figured that would be better than putting them in series which would require a higher voltage and possibly complicate the controller circuit.

Two sets of cables carry the common cathode and separate anode connections for the LED segments. If you wanted you could connect the matching segments together and use individual common cathodes to act as a multiplex display but I avoided that because I would be using the display with a controller chip that doesn't support multiplexed displays.

As for the soldering, I arranged the LED's in such a way that the cathodes would be near to each other so I could solder across the LED legs to common them. For the anodes I took advantage of the coloured cables so that each segment was in turn and represented by a colour. Be sure to solder as quickly as possible to prevent damage to the LED's and test often to ensure none of them have blown.

Each of the blue LED's has a forward voltage drop of 3.2V and draws about 15mA so a single segment (that isn't a decimal point) draws around 45mA and we would expect a total current draw of something like 630mA if all the main segments were on. To lower the current requirement we could use a higher limiting resistor at the cost of loss of brightness.

P10 LED Panel With HD-U6A Controller

Recently I bought a job lot of x19 P10-3216-346-4S-V1.2 LED panels which came with cables and an HD-U6A controller made by Huidu. Each P10 panel measures approx. 320mm x 160mm and has 32 x 16 through-hole amber LEDs. Please have a look at the video I did of the panels and controller which complement this section:

https://youtu.be/JW7ESWU2B0k

Let's look at the front of a P10 LED panel:

The LED panel is the type that you would see at a train station or on a bus, and so on, where readability in many lighting conditions is important as well as being clear at a fair distance.

For a look at the bottom of the panel see the photo that comes next:

There are 4 screws protruding  from the back of the panel (2 either side) for mounting to a framework which in the image above are hidden as they each have a magnetic screw  with inside thread attached to them (silver in colour and appear to be M3 type) with a circular magnetic disc inserted in the top that can be removed. The reasoning for the use of the magnetic screws seems to be so that they can be magnetically attached to a supporting structure although you would want to use additional control to make sure the display cannot be knocked rather than just rely on the magnets.

Also on the back of the panel are 2 connectors to supply power to the display (5V and GND) which typically you would wire to the controller as well as other displays if used. Note that the power connector isn't exactly in the middle as to  not get in the way of a supporting framework attached to the display.

Both ends of the P10 panel have an 8 x 2 connector which are used to daisy chain the panels together by connecting the output of 1 panel to the input of the next in line.  A horizontal and vertical arrow on one end of the panel indicates which way up each panel goes and this end is also where the output connector is located. The other end, which has the pinout listed on the circuit board under the connector, is the input side. 

Now for a look at the HD-U6A controller:

The HD-U6A controller is designed to drive single colour LED panels (such as the P10) and features a power connector (5V and GND), USB connector to load configuration and display program(s) from a flash drive, a power LED, a run LED (shows the display program is running when it blinks) and a mode button (just labelled 'S1') which supposedly is for switching between programs stored on a connected flash drive but from my experience pressing the button just restarts the controller. There is built-in 1MB flash memory on the controller which is likely for firmware (which can be updated) and possibly to store display programs but I have yet to get that working.

The controller supports a maximum of 320 x 32 LEDs arranged as 10 P10 (or similar) panels across by 2 down. To connect the display panels to the controller there are two 8 x 2 connectors, 1 marked 12 x 1 and the other 12 x 2. The 12 x 1 connector is for the top row of 10 panels in the daisy chain configuration and the 12 x 2 is for the bottom row of 10 panels. Why it's called 12 x 1 and 12 x 2 I don't know. Note that the last LED panel in a chain is the very left of the whole 'display' made up on many LED panels.

Note: unlike on the P10 panels which have keyed connectors the HD-U6A controller doesn't have keyed connectors. However, there is a triangle to the side of each connector on the controller which marks pin 1. Using the ribbon cables that were supplied to me the red band faces the triangle marking. 

You can view the official product page, which covers the full range of HD-U6X controllers, at:

http://www.huidu.cn/en/single-and-double-color-u-disk-control-card.html 

You will see toward the bottom of the page links to download software, specifications and instruction manual, which we will go over shortly.

It took me some while to get the controller working with the LED panels as when I first connected them up and powered on the time is displayed (the controller has a battery for maintaining the time) and then after a short while what looks like Chinese text scrolls by and some patterns are displayed. However, although one display connected to the controller works, I found 2 or more in a horizontal configuration causes the program to quickly restart (the display blanks briefly and the RUN LED stops blinking). At first I thought it may be a power supply problem as just 1 LED panel may need almost 1A (depending on how many LEDs are lit) but I saw the same issue even when using a 15A regulated power supply.  So I downloaded the software, HD2018, for creating the display programs to be put on a flash drive from:

http://www.huidu.cn/en/monochrome-and-dichroism.html 

The HD2018 program lets you set up the hardware configuration and what you want displayed on the LED panels, whether it be static or moving text, or images, to give a few examples. You can design multiple programs to be switched between that display different information and that have different effects.

Fortunately the HD2018 software is easy to use has a lot of features but is lacking an edit/undo facility. It uses a hierarchical arrangement (shown at the left of the window, see image below) with a screen being the major item representing the overall display (consisting of multiple LED panels) and the controller type and settings. Under the screen can be one or more programs and each program can contain one or more items such as text, time, hypertext, etc. These items, including adding programs, is done using the selection buttons under the menu near the top of the window. If you have multiple programs (up to 1000 when using the HD-U6A) the controller will automatically switch between them either when a sequence has finished (e.g. text scrolled all the way) or if date/time item it will wait a number of seconds.

We will now go through a simple example of setting up the controller and LED panels using HD2018.

After installing the software go to File->New Screen->New Screen. A pop-up window will ask for the password which is 168. I only found this out by downloading the manual which you can get from:

http://www.huidu.cn/en/monochrome-and-dichroism_76182.html 

Click the Download button to the right of 'HD2018 Operation manual V1.0' to view the manual.

Back to the software: after entering the password you will be presented with the Screen Settings window (see screenshot below). I set the Card Model to 'HD-U6A' and changed the Width to 64 and the height to 16. I did not change anything on the Hardware Settings page as it already had the correct panel selected (P10). I then clicked 'OK'.

At the left of the main window where it shows the hierarchical arrangement, I deleted 'Screen1' (make sure it is selected and press the Delete key) and clicked on the 'Text' icon under the menu bar. In the large black box toward bottom right of the window I typed 'Hello World!' and changed the font size to 10 (make sure the text in the black box is highlighted when you change the font size). In the preview window where it shows what the text will look like across all panels I grabbed the corner of the smaller box and dragged it so that the text filled the whole area. I made sure that in the Effect area near the bottom of the program window that Single effects check box was selected and the Display Static option was chosen.

If you've followed along correct you should have something similar to this:

It seems you can write a program to the HD-U6A controller's on-board memory but I cannot see how to do that by looking in the manual and when I tried connecting the controller to my PC it just powered it only (could have been the cable I used that was at fault). But what I did get working was using a flash drive which the program calls a 'U Disk'. With a flash drive in my PC I clicked on the 'U Disk' icon, made sure the flash drive was selected for the 'Please select device' drop-down and clicked the 'Export File' button.  The message that appears 'Successfully export, whether to pop up U disk?' is asking whether you want the flash drive 'ejected'.

Note: before exporting to flash drive, if you check the 'Adjust Time' checkbox then the PC's current date and time will get exported and be used as the starting date and time for the controller but that means every time the controller is powered on the date and time will restart according to the settings on the flash drive. If you don't check 'Adjust Time' then the current date and time stored on the controller, backed up by the battery, will be used.

Now when I powered up the controller with the flash drive inserted '6A' and '2M' appear, then 'USB' appears on one of the panels followed by 'OK' and then 'Hello World!' appears across 2 displays horizontally. There is a slight flicker when the programmed text first appears. I saw a current draw of about 1.2A for the controller and 2 displays.

You can save the setup in HD2018 to a file on your PC by choosing File->Save or File->Save As... but HD2018 will remember your setup and programs in the hierarchy the next time you open the app even if you didn't previously save. If you choose to Save as (File menu) and then open that file what you have previously saved will be appended to the hierarchy.

If you add a time component the program shows in real time the PC’s current time in the preview area of the HD2018 software. However if the program is written to a flash drive and run on the LED panels, every 10 seconds the seconds count will skip forward randomly anything from 2 to 4 seconds. The fault does not appear to be with the HD-U6A controller's on-board RTC since I’ve checked the displayed time against the stopwatch on my phone and at most it gets ahead by only a second. Possibly it’s losing time by not changing the seconds quick enough (i.e. taking 2 seconds to change) which means it doesn’t get ahead too much.

I’ve also tried restricting the time to just one or 2 panels (while 4 are still connected) but that doesn’t help.

If there is a countdown on its own the seconds never skip but if you have the time being displayed as well as a countdown the countdown seconds will skip exactly the same time as the time seconds displays so that the time and countdown are always the same number of seconds apart.

Another issue is that I've noticed, at least on the LED panels I have, is that a number of LEDs are faintly lit several rows above and below most of the lit LEDs.

Now to go over briefly what makes the HD-U6A and the LED panels work. Starting with the P10 panel, it has a number of chips of note on the back:

ICN2595 16-Channel Constant Current LED Sink Driver.

ICN74HC245 octal bus transceiver.

ICN74HC138 3-line to 8-line decoder/demultiplexer.

MP4953 dual P-channel MOSFET.

There are only LEDs on the other side of the panel circuit board (remove the small screws to get to the other side).

The HD-U6A controller uses the following chips:

AMS1117 3.3 3.3V low dropout voltage regulator.

TZ32F202C unknown, possibly a microcontroller.

P25Q16H 16Mb serial flash memory.

AT85163 real-time clock and calendar.

ICN74HC245 octal bus transceiver.

All content of this and related pages is copyright (c) James S. 2010-2024