Parallel Port Microcontroller and Flash Memory Programmer

The parallel port programmer.

This parallel port multiple device programmer was originally created some years ago to program 32 pin flash memories that then were used in most PCs to store the BIOS code. That was due to the very high demand for the flashing service caused by the very damaging Chernobyl or CIH virus. Later, a variety of adapters were created to program a few microcontrollers, including AVRs, PICs and 8051 derivatives.

To learn more about this basic programmer click the link after the break. Full schematics and software included.

This circuit was inspired by a circuit designed to program EEPROMS published by ELEKTOR magazine. I don't have the magazine anymore. That circuit used some TTL ICs that weren't available in my country's stores so I built my version with the ICs that were then available.

Seen from below:

The parallel port programmer seen from below.

How it works

This circuit is mostly composed by five shift registers, one (19 bits) for memory addressing, two (8 bits) for device control bus bits read and write and two more (8 bits) registers for 8 bit data bus read and write. The 8 bit write bus for data is tri-stated. Only the 19 bit memory shift register is not buffered.

Think of these shift registers as 3 serial to parallel converters and two parallel to serial converters. So in the parallel port you can see that there are lines for setting and reading data bits and clock lines to feed the new bits or get the next bit from the parallel to serial converters.

Following the schematic (shown further below), the parallel port bits are labeled and used as indicated below:

PP0: Data for Address bus bits.
PP1: Clock for Addressing bus bits.
PP4: Clear Address bus.

PP0: Data for Data bus write bits.
PP2: Clock for Data bus write bits.
PP5: Clear Data bus write shift register.

PP0: Data for Control bus write bits.
PP3: Clock for Control bus write bits.
PP6: Clear Control bus shift register. (Data may still be present in the latch)

PP7: Clock for Data bus read shift register.
PPBSY: Data for Data bus read.

PP7: Clock for Control bus read shift register.
PPACK: Data for Data bus read.

The control data bits are used differently depending on the device being programmed o read, but for the original purpose (32 pin flash memories and EEPROMS) its meaning are as described below:

OE: Device output enable.
CE: Device chip enable.
WE: Device write enable.

The control bus also controls some of the programmers functions:

DBE: Data bus enable, this bit sets the Data bus in tri-state.
L: Load bits into parallel to serial converter IC for host recovery of the control bus state.
K: Enable 12V output.

It requires 5V and 12V inputs that can be taken directly from the PC and this power source better be very stable with good contacts because, as a TTL circuit any glitch in the power supply will change the state of the ICs very easily and very quickly.

The cables and connectors that I use to feed it:

The parallel port programmer's power cables.

That DE9 connector was attached to the back of a PC case that had openings for serial ports.

The adapters

When I began to use microcontrollers the easiest and shortest way for me to have a programmer was to simply add adapters for each new type of microcontroller that I wished to try. So I built a few.

AT89C/S52/3 and AT86C2051/4051

The parallel port programmer 8051 adapter.


The parallel port programmer AT90S4414 adapter.


The parallel port programmer ATMega32/324 adapter.


The parallel port programmer AT90S2323 adapter.

PIC16F8X and PIC16F87X

The parallel port programmer PIC adapter.

The schematics for these adapters are shown below.

The schematics

Click the following images for a large version of the corresponding schematics.

The programmer schematic:

The parallel port programmer schematic.

The adapters schematics:

AT89C/S52/3 and AT86C2051/4051

The parallel port programmer schematic.

AT90S2323 and AT90S4414/8815

The parallel port programmer schematic.

ATMega32/324 and PIC16F8X + PIC16F87X

The parallel port programmer schematic.

The software

The software for this circuit is a real mess, be forewarned it was never meant to be used by someone other than myself, but can be useful if you get to understand it. It can be used to test and experiment with the PC's parallel port.

This program is compiled in the (sadly no longer) freely available Turbo Delphi Explorer. Click here to download it. It is about 1MB.

This software can run on its own, no need to install nothing. This program is unfinished, so if you ever try it it could show errors if you don't input all the required data.

Besides running the programmer it can be useful to test the parallel port. Win the main window input a datum in the field above the button named “Escribir”, click the button and it will write an 8 bit number to the parallel port, and it will read the input bit if you click the button labeled “Leer”. It only works for the port 378h. The other fields are used to test the programmer circuit.

This image is a screen shot of the main window:

The parallel port programmer software main window screenshot.

The following image is a screen shot of the 8051 and PIC programming window:

The parallel port programmer software 8051 and PIC programming window screenshot.

The following image is a capture of the AVR programming window:

The parallel port programmer software AVR programming window screenshot.

To work with HEX files it is necessary to copy an HEX2BIN.EXE program that takes as a parameter an HEX file in the same folder as the grablpt.exe.

The following is a capture of the window that allows to read memory and compare memory data with the source files for verification. To read the memory of a particular microcontroller, just click the correspondingly labeled button. It is also possible to store a file binary from the data in the table:

The parallel port programmer software data download and verifying window screenshot.

There are more windows in this program. Some are for programming the BIOS flash memories and other types of memories.


This circuit is old and as it is based in TTL IC's it can be very sensitive to any glitch in the power supply. I'd recommend to use this as inspiration rather than trying to reproduce it exactly. Also, even though it worked well on all the computers where I've tested it, timing is not based on a real time clock or timer and the operation timing will depend on the speed of the computer on which the software is run.

Bookmark and Share