CrazyEngineers Archive
Old, but evergreen and popular discussions on CrazyEngineers, presented to you in read-only mode.
@xheavenlyx • 16 Oct, 2006
Tutorial: Parallel Port Interfacing Techniques - Part 2

PC Parallel Port Interfacing Techniques - Part 2

16 October 2006 v1.0
Elec: 3.5 Comp: 2 Mech: 0​


In this tutorial we will flash a LED (Light Emitting Diode) connected to your printer port socket. Reading the first part is recommended to get a general idea what you are upto.


To connect a LED to your port first you have to know what it looks like. Here are the two most common connectors that you can have.

D-Type 25 Pin connector


Pin Layout:


36 Pin Parallel Centronics


Pin Layout:



Shown below is a very common LED found anywhere from toys to computers. To connect, insert the positive pin into Pin number 2 of your port. And the negative to any ground of your connector. Pin 19 is an easy reach.


In the above image the longer pin is positive and the shorter one is negative (ground). If you have a LED looking like the left one then you have to find out yourself which one is +/- by connecting it to a battery. I would recommend a 220ohm or 470ohm resistor in series with the LED. Mine worked without the resistor but I cannot promise anyone!

Ok after you finish this setup, it is now time to test the light! See if you have really found out the correct address by following the first tutorial then download this(** to have real-time control over your Port to test the light.


Open the executable; you should see a blue screen with port addresses, pins and their description. Choose the address where you have connected the port wire, and click on PIN 2 (Data 0) (there should be a cross on it now). Look at the LED, it must glow. If it does not glow then try different Port addresses, LPT1, LPT2 etc.

Programming the Parallel Port in C, C++, VB or Java with ‘Windows the great XP’ is not easy since it does not allow you to access the Ports directly. All hardware is virtualised. I somehow have a feeling programming in VB is easier. Very basic LED flashing is also easy through Assembly Language. I’ll look into this problem and post a tutorial soon.

Dont hesitate, ask me if you have trouble with anything!!! Writing a tutorial from scratch is not easy so please don’t mind random grammar mistakes 😀

Some Useful links: : A very detailed look into the Port basics and programming. : Excellent for explanation on Win NT/XP programming.

** : The Debug program to test your parallel port with LED
@Kaustubh Katdare • 16 Oct, 2006 Great going, xHx ! [​IMG]

We plan to make pdfs of the articles posted on CE forums and make them available for download* along with the poster's name/id & contact. How about coming up with your own diagrams?

-The Big K-
p.s: * You can already guess we have many things planned along with the forum restructure 😉 . Keep doing a good job, buddy!
@xheavenlyx • 16 Oct, 2006 Hay thanks biggie. I too am waiting for the upgrades and some attachment ability (if you all think its necessary). In this perticular tutorial, I took the working pics in the bottom, the remaining are from the linked sites, and since this was a very simple one it did not need any major schematics. I will be writing a tutorial to program in some languge for more flexability, there I will be clear on the diagrams and pictures.

I want ot see people get interested by reading this tutorial, and I hope I did that. If there can be any changes to improve it, anyones views are welcome! 😁

This is just the begining, we can in a year come up with a full home automation tutorial and project 😛

Thanks a lot again! 😀
Have fun.
@Kaustubh Katdare • 16 Oct, 2006 No promises for the attachment ability. The simpler way is to create an id on ( a Yahoo! Company ) and link the images. Let the Flickr guys do the image hosting job 😉

This is just the begining, we can in a year come up with a full home automation tutorial and project 😛
Of course! To speed up the process, our editor-in-chief & I had chat with professors from Engineering colleges & they seemed to be excited about us. Probably we'll see better stuff in coming days.

Good initiative, xHx! Very soon, we will try to have a separate place for all the good articles 😀

-The Big K-
@desijays • 16 Apr, 2007 i hope you guys don't mind me digging up this post from under the grave, but i was just going throught it and kinda got curious.

xheavenly, would it be possible for you to make a brief post about USB interfacing if you have time. Just the basics!!. Just like your posts about parallel port interfacing would be good.

And probably turning on and off an LED using the USB port if thats possible 😉

and few other things...

is there any difference between RS232, the parallel port and the serial port?
@xheavenlyx • 21 Apr, 2007
xheavenly, would it be possible for you to make a brief post about USB interfacing if you have time. Just the basics!!. Just like your posts about parallel port interfacing would be good.

And probably turning on and off an LED using the USB port if thats possible 😉

and few other things...

is there any difference between RS232, the parallel port and the serial port?
1. Well USB is a bit difficult than parallel or serial port. And moreover I have never worked with USB. Their programming in windows is shrouded with crappy permition protocols and timing stuff. wind00z XP/Vista is really the worst OS you can possibly use for programing hardware. Its all virtualised.

Take a look at

2. [SIZE=-1]
  • RS-232 IS serial port. It has serial communication. That is, one bit after the other in a single wire. It has a longer range too, meaning long wires will not spoil the data. Check this page for [SIZE=-1]Interfacing the Serial Port - Parts 1 and 2.[/SIZE]
  • The USB is a whole other story. Here is line from
  • " Starting out new with USB can be quite daunting. With the USB 2.0 specification at 650 pages one could easily be put off just by the sheer size of the standard. This is only the beginning of a long list of associated standards for USB. There are USB Class Standards such as the HID Class Specification which details the common operation of devices (keyboards, mice etc) falling under the HID (Human Interface Devices) Class - only another 97 pages. If you are designing a USB Host, then you have three Host Controller Interface Standards to choose from. None of these are detailed in the USB 2.0 Spec."
  • Anyway, if you really want to interface a USB device 😀 then have a look at the whole tutorial here [SIZE=-1]USB in a Nutshell - Making sense of the USB standard[/SIZE]
Good luck! Its really fun though😀
@desijays • 25 Apr, 2007 Link galore. 😀 Thanks for the links mate. I'll look into it.

Hopefully I should get something going 😀
@Ashraf HZ • 12 Sep, 2007 Oh, I should have posted here instead of Part 1 of the tutorial 😛 great work xheavenlyx. Wanted to ask a few things:
  • Is it safe to use the parallel port on a laptop for experiments? eg, lighting LED's.
  • Can you give a sample C code on how to light an LED on and off? Like what libraries to use. At least I know it involves a while loop and a delay 😛 I believe you have to use this file called Inpout32.dll, am I right?
  • Can you also recommend me a program to use for Assembly Language programming?
Thanks a lot dude!
@xheavenlyx • 13 Sep, 2007 1. No its not really safe to directly use a parallel port of a laptop. You CAN try an LED or something, because the grounds can sink that much current from your port. However, dont try using motors directly. The links I have provided are VERY useful and have many circuits too. Read carefully. I cant cover that here, since everyone has their own design.

2. god, forgive me, I actually stoped programming PP in newer PC because of that problem (Windooz..input32.dll) but if you search you will get a LOT of info. As for the libraries, not many are needed. In win98 it were stdio.h and io.h or something. Very few. Here is a sample code I wrote 4 years ago (!):

//This example code shows how to switch a LED on/off in Visual C++.
//We use two variables N and L explained below.

//I am assuming you have some knowledge in C++. Instruction to connect the LED is given in the Tutorial.

#include <iostream.h>  //The most important include to display data on screen.
#include <conio.h>     //Include for outp and inp functions for the printer port.
#include <windows.h>   //For _sleep functions for our time delay.

#define addr 0x3BC     //IMPORTANT: Normaly 378 is the most common address, 
                       //if not then insert your address instead of 378

int main()
    int freq; //Variable for time delay.
    int L; //Variable for counts of Blinking LED.
    cout<<"\t\t XheavenlyX WELCOMES YOU!!! \n\n";         //How can I forget this ^_^
    cout<<"How many times to blink?? Enter 0 to exit: ";  //Ask user how many times to blink the LED
    cin>>L;                                               //And exit if zero is entered.  
    if (L==0)
        cout<<endl<<"Exiting application..."<<endl;             //Code to exit if L = 0. 
        for (int i=0;i<=5;i++) {_sleep(500);}                   //A lame pause before exit!

    cout<<"Frequency (in mS): ";                          //Ask user to enter the frequency at which the LED will blink.
    cin>>freq;                                              //Store that value in freq.
//Bottom code is the Juice! This will blink your LED the number of times you put in L.
//The speed of blinks will depend on freq. As an example if you entered 500milliseconds. The LED
//will blink twice every second since 500ms is half of 1000ms (1000millisecondss = 1sec)

    for (int i=1;i<=L;i++)        //The loop. L times to blink.
    _outp(addr,1);             //Output is high in the first 'Data bit' of port(*), i.e Pin number 2 where you have connected the LED.
    _sleep(freq);               //freq mS delay between the high and low of LED.
    _outp(addr,0);             //Output is low now
    _sleep(freq);               //Pause again between the high,
    return 0;                   //main returns nothing to you. ^_^
}                               // For an indepth look at 

//(*)NOTE: There are some simple calculations to turn on/off the other PINs on the printer port.

// _outp, _inp etc.
How input32.dll works:

3. Assembly learning is somewhat a smooth ride if you stick with it. And it can be very very helpful. Speacially if you are planning on optimizing complex control instructions. It can be for Microcontrollers or your PP programming. That too, youll have to search...😀
@Ashraf HZ • 14 Sep, 2007 Cool, thanks a lot bro! Really appreciate it 😀
@Abyss • 24 Sep, 2007 Hi..good day
I would like to say thank you for posting those stuffs about parallel ports. It helped me a lot. I am very much interested with that tutorial. Thank God there are people like you. As for now, i want to make a project using LEDs to connect in parallel port. The LEDs should turn off/on upon user input. The whole thing is to be controlled by an Assembly language program or a C++ program that has an inline funtions of Assembly language. The problem is, I got very little Knowledge in assembly language. From your tutorial,i already leared how to connect the LEDs in the parallel port. Thanks to you. I hope you can help me.

Aside from LEDs, i was also pkanning to use the stepper motor. Same thing will happen,it will be connected thru the Pport. Even a single or continous rotation operation of the motor may do. Still an Assembly language program is needed here.

I am looking forward for your reply.

I am Carlo Moratalla.
My email:

Thaks a lot.
@xheavenlyx • 24 Sep, 2007 Thank you for telling me that this page was really important to you! and hope to help in anyway can.

Firstly, I have to confess that I haven't tested PP interfacing on new OS! Like Wondows XP and Vista. Thats because in these new OS, windows does now allow direct hardware access. You have to access it through another dll, read the above posts. And my laptop has no ParallelPort! Now there are 2 things you can do.

1. go to these sites I have given above and here. and try to implement it in XP. When I get time to do this, Ill surely let you know. And if you have an old pc with windows 98 then better.

2. I can give you the schematica of interfacing a motor, or stepper motor. And an idea of the algorithm, but remember you have to implement it yourself on your PC so, the only way to learn it is thru experimentation.

Remember, I cannot explain all the electroncis and programming involved, its impossible. So here is some start:

@xheavenlyx • 24 Sep, 2007 [​IMG]

The above image shows how to interface a relay. 12V relay is good since this relay which in turn will control the switch of a simple DC motor. The diodes are very important, so as to reduce the voltage spike moving into your PP and destroying it.

Now dear bro, for stepper motor you have to research yourself. Presently I am on a college project so I have no time to do that. Go further in your project and tell me how its going and what you have done!! Thats the most important part. So try whatever you have learnt and tell us about it.

By the way @ash, can you tell me if you have tried interfacing on XP and what were the results, please try to do so this week if you can, it will be really helpful.
@Ashraf HZ • 24 Sep, 2007 Ah, I haven't tried yet, was also busy with projects. But I'll try by the end of this week hopefully! My roommates had interfaced with it on a desktop PC with Windows XP, lighting up a mini traffic light system. I'll get them to teach me a bit.
@sgrshukla • 29 Sep, 2007 @ abyss and @ heavenly..
Hello friends, i am also looking to run a stepper motor using the parallel port.. i have bit idea of stepper motor operation . i am also finding difficulties in outout on parallel port as i am having winXP .. can win98 solve this problem??? and what to do if i want to run the same program in winXP???

@sgrshukla • 29 Sep, 2007 @ abyss and @ xheavenlyx..
Hello friends, i am also looking to run a stepper motor using the parallel port.. i have bit idea of stepper motor operation . i am also finding difficulties in outout on parallel port as i am having winXP .. can win98 solve this problem??? and what to do if i want to run the same program in winXP???

@xheavenlyx • 29 Sep, 2007 Listen very carefully here:

Do everything I have given above in the tutorial plus the following posts and experiment. Then tell us what you have done and what were the results and how you have tried it, what was your code in which language, and what was your circuit? everything like this.

THEN you can post your problem here, and we will try our best to ans you.

And yes win98 is easier to program then XP. (How its done is given above somewhere)
@Abyss • 07 Oct, 2007 Hi every..I have done LEd and Motor controlling thru the parallel port..Mine work even in WindowsXP..
@xheavenlyx • 07 Oct, 2007 Mere bhai, please can you help the people here and me and tell how you did it??

Some circuit diagram, and explaination, something!!@!!
@Abyss • 15 Oct, 2007 INTRODUCTION

Computer programming was one of the great advancement in technology. It contributed a lot to help humanity. Most electronic devices that we use today are endowed with programming.

Implementation of computer programs with hardware is quite an arduous task. The computer program comes in various languages. The proper programming language must be noted. Furthermore, the bus line should be appropriate in order for the hardware to run effectively. Hence, the language to use should be relative with the bus line.

Assembly language program was found to be the outstanding language when it comes to hardware programming. It provides an easy data communication between the program and the hardware. It shows an actual data representation which can be use to drive the hardware.

In harmony, the parallel port was one of the suitable line of communication between the program and hardware. As a bus line, it allows a direct link amid the instruction set and the data output.

In this project, I introduce the PC Parallel Port and how to identify its address for use in home electronic projects. An assembly language program was used to drive the hardware. The hardware deals with LEDs (Light Emitting Diode). It includes simple LEDs and a Seven-segment Display. The program contains instruction that can turn the LEDs ON and OFF. The program also receives values that will be use to drive the seven-segment display. The program uses an A86 macro assembler, D86 debugger V4.04.

By implementing this project, one can have a better understanding about Hardware Programming.


1 Breadboard
1 Printer Cable (DB-25)
8 Light Emitting Diodes
1 Seven-segment Display
Connecting wires


The Parallel Port

The Parallel Port is the most commonly used port for interfacing home made projects. This port will allow the input of up to 9 bits or the output of 12 bits at any one given time, thus requiring minimal external circuitry to implement many simpler tasks. The port is composed of 4 control lines, 5 status lines and 8 data lines. It's found commonly on the back of your PC as a D-Type 25 Pin female connector. There may also be a D-Type 25 pin male connector.

The lines in DB25 connector are divided in to three groups, they are:
  • Data lines
  • Control lines
  • Status lines

As the name refers, data is transferred over data lines, Control lines are used to control the peripheral and of course, the peripheral returns status signals back computer through Status lines. These lines are connected to Data, Control and Status registers internally. The details of parallel port signal lines are given in Figure1.

Fig 1: The Parallel Port

Table 1. Pin Assignments of the D-Type 25 pin Parallel Port Connector.
Pin No D-Type 25
Signal Name
Data 0
Data 1
Data 2
Data 3
Data 4
Data 5
Data 6
Data 7
Paper-Out / Paper-End
nError / nFault
18 - 25

Port Addresses

The Parallel Port has three commonly used base addresses. These are listed in table 2, below. The 3BCh base address was originally introduced used for Parallel Ports on early Video Cards. This address then disappeared for a while, when Parallel Ports were later removed from Video Cards. They has now reappeared as an option for Parallel Ports integrated onto motherboards, upon which their configuration can be changed using BIOS.
LPT1 is normally assigned base address 378h, while LPT2 is assigned 278h. However this may not always be the case as explained later. 378h & 278h have always been commonly used for Parallel Ports. The lower case h denotes that it is in hexadecimal. These addresses may change from machine to machine.

3BCh - 3BFh
Used for Parallel Ports which were incorporated on to Video Cards
378h - 37Fh
Usual Address For LPT 1
278h - 27Fh
Usual Address For LPT 2

Accessing Ports: Writing to the Port
To write to the eight data registers we can pass a value of 0 - 255 at the parallel port address. In Binary every bit of that number controls one or more output bit. Table 4 illustrates them.
Data Pin

Table 3: Data Pins Value
For example to set pins 2 and 3 to logic 1 then output value would be: 1+2=3. Similarly to set on pins 3, 5 and 6 then output value would be: 2+8+16=26. In this way value for any bit combination can be calculated. Also it should be noted that:
Set all data Pins to logic level Zero
Set all data Pins to logic level One

Table 4: Particular Value

Schematic Diagram

The Program Code

The following Assemble Code writes 255b to the port using Assembly’s OUT mnemonic. The OUT accepts 2 operands: DX and AL. it writes the data from the AL (Accumulator Register) to the port Address stored in DX (Data Register).

MOV DX,03BcH ;Port AddressMOV AL,255 ;Data: All LEDs onOUT DX,ALINT 21H

A86 macro assembler, D86 debugger V4.04

A86 (with its 32-bit version A386) is the finest assembler available, at any cost under any terms, for the Intel 86-family of microprocessors (IBM-PC, compatibles, and not-so-compatibles).
A86 accepts assembly language source files, and transforms them directly into either: (1) .COM files executable under DOS (or in a DOS box under Windows), starting at offset 0100 within a code segment; (2) .OBJ files suitable for feeding to a linker to create EXE files; or (3) object files starting at offset 0, suitable for copying to ROMs. A86 is a full featured, professional-quality program. I designed A86 to be as closely compatible to the standard Intel/IBM assembly language as possible, given that I insisted upon making design and language enhancements necessary to make A86 the best possible assembler.
D86 (with its 32-bit version D386) is a screen-oriented program that allows you to troubleshoot faulty computer programs written to run under DOS (or in a DOS box under Windows). It "freezes" the state of your program, and allows you to investigate the values of registers, flags, and memory. You can monitor your program's execution by stepping it one instruction or procedure at a time; or you can start your program running, telling D86 to stop it when it reaches certain locations. D86 recognizes the symbol-table output of the A86 assembler, creating a symbolic disassembly of your A86 program, and allowing you to refer to locations and variables by name.

T Assemble the Hardware to the breadboard and connect the circuit to the designated data pins.
T Plug the Printer cable to the parallel port.
T Make sure that the Assembler is in the location: C:\ASM
T Run the CMD.exe.

T On the cmd, type in cd\. Then press enter. Next, type in cd asm then press enter.

T Assemble the file 255.asm, off.asm, LED.asm and segment.asm respectively. Use these syntax:
asm LED.asm
T Run each program by just typing the filename.
T Use the table 4 for desired outputs.
@xheavenlyx • 15 Oct, 2007 Thanks a lot for this dude! Much appreciated.

But I thing there is problem, even debug or assembly compilers do not work easily in XP and Vista, direct hardware access is not allowed. And if this is taken from some website then dont forget to post the actual website address, since some diagrams are missing, and I want to go through them.
@Smint • 23 Nov, 2008 Thanks to xHx for all this information.

I'm just getting interested in programming for the parallel port.

Actually I have a current project where I need some simple digital IO from a PC.

My question is if it would be possible to use the parallel port for continous input and output at the same time.

1: Some program state tells me I need an automatic door to be opened.
2: I'll set a one bit output to be high so I trigger a switch for the door.
3: This switch is connected to a set of sensors determining if it's ok to open door. There are some security issues.
4: If it is not ok a light at the door will show that manual actions need to be done to allow the door to be opened.
5: When it's ok a switch will send a input to the parallel port and the program will do some task that depends on the door beeing open.

So what i need is 1 bit output saying that i need the door to be opened and a 1 bit input to tell me if the door is open. But these has to be simultaniously available.

The cable will be short as the switches for both input and output will be placed next to the PC and the long wires will go from the switch to door circuits.

Can this be done with the parallel port or do i need to invest in a digital 16 channel PCI I/O board? (seems thats the minimum number of IO's on that sort of cards on the market.)

I would really like to be able to just use the parallel port as to not impose anything vendor specific on the project.
@Munguti • 09 Jan, 2009 I found a turorial on the parallel port. It had the following include files which refused to work in my visual studio 98.
dos.h problem with this is that it was claimed in the turtorial to have outportb function and delay both of which were absent.
_defs.hwhich was non existent and also hed problems with some of its code. they generated alot of errors.
i obtained both the header files in the net. they had alot of issues. anyone know what the problem is??????????
the actual tutorial broke the 20000 words limit and i couldn,t post it however here is a sample of one of the programs it had.

D. Simple Example

Refer to the figure titled Figure #3 - Typical Application showing a normally open push button switch being read on the BUSY input (Status Port, Bit 7) and an LED which is controlled by Bit 0 on the Data Port. A C language program which causes the LED to flash when the push-button is depressed appears below. Note that an output logic zero causes the LED to light.

/* File LED_FLSH.C
** Illustrates simple use of printer port. When switch is
** depressed LED flashes. When switch is not depressed, LED is
** turned off.
** P.H. Anderson, Dec 25, '95

#include <stdio.h>
#include <dos.h> /* required for delay function */

#define DATA 0x03bc
#define STATUS DATA+1
#define CONTROL DATA+2

void main(void)
int in;
in = inportb(STATUS);
if (((in^0x80)&0x80)==0)
/* if BUSY bit is at 0 (sw closed) */
outportb(DATA,0x00); /* turn LED on */
outportb(DATA, 0x01); /* turn it off */
/* if PB not depressed, turn LED off */

Fig 3 Printer Port - Typical Application

Circuit Description: Logic 1 on output DATA 0 (Data Port - Bit 0) causes LED to be off. Logic 0 causes LED to turn on.

Normally open push-button causes +5V (logic 1) to appear on input BUSY (STATUS PORT - Bit 7). When depressed, push-button closes and ground (logic 0) is applied to input Busy.

Note external source of 5V.

Program Description: When idle, push-button is open and LED is off. On depressing push-button, LED blinks on and off at nominally 5 pulses per second.
@Munguti • 09 Jan, 2009 And could someone tell me how to put images in your site😕
@shalini_goel14 • 09 Jan, 2009
And could someone tell me how to put images in your site😕
Hi munguti,

Inserting image into post is simple. Just upload your image to popular image hosting sites [ ex. Welcome to Flickr - Photo Sharing ] and copy the complete url of the image [upto the file extension ]. You can do it by right-clicking on the image and selecting "Copy Image Location" option.

Then click on the [​IMG] button in post editor of CE and insert that URL. Your image will appear inside the post.

I guess you asked for this only na.😕
@Munguti • 09 Jan, 2009 thanx shalini
What about the other question ?? 😒
@Munguti • 10 Jan, 2009 Check out this tutorial i found it helpful
Parallel port output
@maonin • 15 Oct, 2011 hi xheavenlyx,

can you please help me in my project I posted here.
here's the link to my thread.

Related Posts

@Morningdot Hablu · Feb 11, 2010

i know that ram is a volatile memory ...but is it possible to store some data permanently in ram memory....???? i mean is it possible to use ram memory as...

@Guneet Khanuja · Mar 24, 2015 is a consumer electronics company co-founded by Bharanidharan Viswanathan and Nitin Mathur in the year 2010. is curently the largest gadget research site in India. They provide information,...

@Ankita Katdare · Jan 14, 2016

I am listing here all the CDAC courses that are MORE relevant to Electronics and Telecommunication engineers. In general most courses in CDAC are suited for computer science and IT...

@Chirayu Samarth · Jan 12, 2015

The Indian mobile manufacturer, Micromax has unveiled yet another budget smartphone- Canvas Hue, further expanding its Canvas series of smartphones. The company claims the device to be a perfect blend...

@Ankita Katdare · Feb 15, 2015

Samsung fans in India have a new smartphone to munch on as the brand new Galaxy A7 has been officially released in the country with hopes to capture the attention...