8×16 Microchip PIC LED message board. Preface.

My fun with LED message boards started in the very end of 2004 and ended in August 2005.
By the August 2005 I had created some simple LED message boards (8×64 and 8×128), which are usually called here “the running string”, and had placed myself to stalemate.
For my boards I used Assembler language and PIC microcontrollers. They were a good choice for a simple projects but it was a pain to create any complex and cool features with such stuff.
I had to switch to Atmel microcontrollers and C/C++ programming language in order to do any animation, graphics, color and so on.
But my time had run out, I had to move to other place and so, by the end of the August 2015 my highest achievement was 8×128 single color LED message board, which could be reprogrammed using a PC.
As I remember it hadn’t any fancy effects. Maybe it can read some special control characters to change speed or hold a word on the display for awhile. But that was all.

All my boards were made according the same basic schematics.
They all had dynamic rendering.
They had a long shift-register to control the state of all LEDs in one row simultaneously, and a decoder to set the active row (row scan).
Boards that are made by this scheme has a few disadvantages.
The main problem is brightness. You can’t achieve a brightness of a DC powered LED using a PWM powered LED that has duty cycle 1/8.
Also there may be some problems with long wires because of the high frequency switching, and such boards has a visual tilt of letters.

But dynamic scheme has a lot of advantages, which are especially significant when you have narrow means.
In a static scheme you have to control each LED separately and to sustain a constant current for it.
It dramatically increases complexity of the LED matrix board.
For example, 8×64 board in case of dynamic mode has 72 pins and for static mode it has at least 512 pins.
Next problem is a power consumption. Of course the static mode is brighter, but half of our board’s LEDs will consume about 7A. So you better be prepared for total current of 15-20A for a small board, consisting of cheapest 30mA LEDs.
If you intend to use static mode you have to use specialized LED driver ICs. It is impossible to control hundreds of pins by generic shift-registers like 4094 so you will have to use specialized ICs like MBI LED drivers MBI5026 and, probably, to integrate them into the LED matrix.
In my case these drivers were too expensive and unreachable (as the Atmel microcontrollers).
I had some of them for a static-mode 7-segment display project but it took months to get them by the post at those times.

If you have access to a good equipment and you aren’t forced to create homemade PCBs by smoothing-iron and iron chloride,
if you can get specialized LED drivers,
if you have good power sources and wires then you can create a bright, static scheme LED message board.
Furthermore, there is no need for you to read these posts, they are too low-tech 🙂

So, dynamic (scanning) rendering scheme had been chosen because of its simplicity and cheapness.

In the current and a few next posts I will discuss development stages of 8×16 board based on the PIC16F84 microcontroller.
Because I am unable to check this old programs in hardware – I have created simulations in Proteus 8.4. These simulations are too slow on my (and I think any other) PC so it is impossible to view the real text on a board there. But they are the proof that attached asm files are usable and they show how those files are working.
I’ve been told that one can achieve real-time or almost real-time simulation speed if scheme design would be reduced to digital components only.
So if you want to try this, you can remove all resistors and transistors, change LED types to digital (or use the led-matrix component) and connect LEDs directly to the logic pins.

For the assembly I always used MPLAB IDE, so you have to use MPLAB for reassembling the code and then load resulting hex file into PIC.
Internal assembler in Proteus doesn’t work for me, I think that was a problem with include files but I didn’t dig that way.

Unfortunately, I have no pictures of my first, 8×16 test board in working condition. But I have a few pictures where I used their LED matrix for the test purposes.
Here they are:


On these pictures you can see that all parts were mounted on the single development board. There is no pictures of the bottom side but I can say that all connections were made by wires.
You can see 8×16 LED matrix, organized in 16 columns and 8 rows.
Naturally, this matrix is represented in PIC’s SRAM in a such way, that each column of the matrix (8 LEDs) corresponds to the one byte of SRAM (8 bits).
So, there is a sequence of bytes in SRAM, that is kinda video RAM 🙂 They hold the BMP, bit-mapping picture that should be rendered.
The rendering process goes row by row, not column by column, so, to put information for the N-th row you have to collect and to send N-th bit of each videoRAM’s byte.

Because PIC16F84 has 68 bytes of RAM it is hard (but possible) to create an 8×64 message board. The key is to use only 4 general purpose registers for program’s needs and left the rest 64 registers for videoram.

On the left side you can see eight pairs of transistors which select an active row by connecting it to a power source (+5V).
Those transistors are controlled by the decimal decoder like 4028, which is placed in the left top corner.

To the right from decoder’s socket you can see the place for PIC16F84 and it’s crystal oscillator. Then the place for the an 8-pin EEPROM. And on the far right side there are two sockets for 4094 shift-registers.

Between the IC’s sockets and LED matrix there is a row of transistors, controlled by shift-registers, which are responsible for connecting LEDs to the “ground”.
All 32 transistors can be any cheap and low-frequency, but keep in mind that pulse current in row switches can be up to 600mA.