Embedded Lab
Making a 8×40 LED matrix marquee using shift registers
Posted on May 18, 2013 by R-B 139 comments |LED matrix displays provide flexibility to display text, graphics, animations, and video, and therefore, they have become a popular mean of displaying information these days. You can see them at gas stations displaying the gas prices, or in the public places displaying information, and alongside highways displaying advertisements on large dot matrix panels. This project is about constructing a mono-color LED matrix display board that consists 320 LEDs arranged in 8 rows and 40 columns. The heart of this project is PIC16F1847 microcontroller which receives data from a PC through a serial port (or USB using an USB-UART interface), and display on the LED matrix with the help of five 74HC595 shift registers.
8x40 LED Matrix Display
Theory
If you are not familiar with LED matrices at all, I strongly suggest to read my two experimental tutorials that were posted earlier: Basics of LED matrix display and Scrolling text message on an LED matrix. The first tutorial describes the basic structure of LED matrices and the multiplexing technique of driving them to display static characters. The second tutorial is focussed more on creating animation and demonstrates the concept of displaying a scrolling message on a matrix of 16×8 LEDs. This project is basically a continuation of those two tutorials and I am hopeful it will further improve your understanding of driving a bigger size LED matrix display, both at hardware and software level. The operational part of the project hardware is described in the following section along with the circuit diagram.
Circuit diagrams
Five 8×8 square LED display modules are arranged in a linear fashion to construct an 8-row X 40-column display matrix. The LED display modules I used in this project are NFM-12883AS from Futurlec. They are common-row-cathode type, which means the cathodes of all the LEDs in each individual row are interconnected, and therefore each row pin is supposed to sink currents from eight LEDs in that row. The similar row pins of all 5 modules are further connected together and are fed to the the output sinks of an ULN2803 IC, which consists of 8 Darlington arrays. Now each output pin of ULN2803 is a sink for 40 (=8×5) LEDs in that particular row. Since ULN2803 can sink current up to 500 mA per pin, the current per LED is limited to 500/40 = 12.5 mA.
The anode terminals of LEDs are accessible through column pins. Since we are going to apply row scanning technique (read Scrolling text message on an LED matrix), each column pin needs to source current for only one LED, as only one row is active in that column at a time. The columns are driven by the outputs of a 40-bit serial-in-parallel-out arrangement constructed by cascading five 74HC595 ICs. The 74HC595 device is an 8-bit serial-input and parallel/serial output shift register. The serial output feature allows cascading of multiple 74HC595 devices. From engineering point of view, 74HC595 may not be a good choice as column drivers because they are not meant for sourcing current for LEDs. But several experiments done by people (including me) have shown that they can drive LEDs reasonably bright, and therefore can be used as column drivers in an LED matrix project like this.
The microcontroller used in this project is PIC16F1847 from the enhanced mid-range 8-bit PIC family. It runs at 32 MHz using its internal clock source (with PLL enabled). PORTB provides ground path for individual rows (cathode) through the ULN2803 darlington pair array, whereas RA0, RA1, and RA2 pins are used to control the Data, SH_CP, and ST_CP lines of the cascaded shift registers. Pin 8 and 7 of PIC16F1847 are the default pins for UART communication. They go to the USB-UART module for serial communication with the PC. A serial terminal program running on the PC can be used to send character data to the microcontroller which saves the received information into its internal EEPROM.