Está en la página 1de 10

PUERTO PARALELO

El puerto paralelo se utiliza generalmente para manejar impresoras. Sin


embargo, dado que este puerto tiene un conjunto de entradas y salidas
digitales, se puede emplear para hacer prácticas experimentales de lectura de
datos y control de dispositivos.

En la actualidad el puerto paralelo se incluye comúnmente incluido en la placa

madre de la computadora (MotherBoard).

Este puerto utiliza un conector hembra DB25 en la computadora y un conector

especial macho llamado Centronic que tiene 36 pines.

Es posible conectar el DB25 de 25 pines al Centronic de 36 pines ya que cerca

de la mitad de los pines del Centronic van a tierra y no se conectan con el

DB25.

Descripción del conector DB25 del PC y el conector DB25 del Centronic

El puerto paralelo está formado por 17 líneas de señales y 8 líneas de tierra.

Las líneas de señales están formadas por tres grupos:

o 4 Líneas de control

o 5 Líneas de estado

o 8 Líneas de datos
En el diseño original las líneas de control son usadas para la interface, control

e intercambio de mensajes desde el PC a la impresora.

Las líneas de estado son usadas para intercambio de mensajes, indicadores de

estado desde la impresora al PC (falta papel, impresora ocupada, error en la

impresora).

Las líneas de datos suministran los datos de impresión del PC hacia la

impresora y solamente en esa dirección. Las nuevas implementaciones del

puerto permiten una comunicación bidireccional mediante estas líneas.

Cada una de estas líneas (control, estado, datos) puede ser referenciada de

modo independiente mediante un registro.

En la tabla que se muestra a continuación se muestra la relación que existe

entre las líneas físicas del conector del PC :

Polaridad
Patita E/S Descripción
activa
1 Salida 0 Strobe
Líneas de datos
2~9 Salida -
(bit 0/patita 2, bit 7/patita 9)
Línea acknowledge
10 Entrada 0 (activa cuando el sistema remoto
toma datos)
Línea busy
11 Entrada 0 (si está activa, el sistema remoto
no acepta datos)
Línea Falta de papel
12 Entrada 1 (si está activa, falta papel en la
impresora)
13 Entrada 1 Línea Select
(si está activa, la impresora se ha
seleccionado)
Línea Autofeed
(si está activa, la impresora inserta
14 Salida 0
una nueva
línea por cada retorno de carro)
Línea Error
15 Entrada 0 (si está activa, hay un error en la
impresora)
Línea Init
(Si se mantiene activa por al menos
16 Salida 0 50
micro-segundos, ésta señal
autoinicializa la impresora)
Línea Select input
17 Salida 0 (Cuando está inactiva, obliga a la
impresora a salir de línea)
18 ~ 25 - - Tierra eléctrica

STROBE - a través de el, el ordenador comunica al periférico que esta


preparado para transmitir.

BUSY - el periférico comunica a través de el, que NO esta preparado para


recibir datos.

ACK - el periférico comunica a través de el, que esta preparado para recibir
datos.

SELECT Y SELECTIN - indican el tipo de error producido en el periférico.

ERROR - indica que se ha producido un error en el periférico.

PE - depende del tipo del periférico, en el caso de la impresora indica que no


tiene papel.
DIAGRAMA DE CONEXION

Para manejar los puertos por medio del lenguaje C.

Son necesarias las siguientes funciones de la librería (dos.h)

Inportb(numero del puerto) .- Lee los datos de el puerto

Outportb(numero del puerto, dato a mandar) .- Escribe los datos en el puerto

En este caso usamos 0x378, que es el número que se le asigna al puerto


paralelo

En seguida se muestra un ejemplo:

El siguiente programa realiza una operación NOT bit por bit con las teclas de
función F1...F8

F9 hace una suma de uno al numero que se encuentra mostrado por los leds
F10 Sale del programa
/* Este programa prende led por led representando un número binario de de 8
bits, en la salida del puerto*/
/* Es necesario para esta prueba hacer en un protoboard la conexión de los
leds, según los pines de salida y conectarlo con un cable de impresora */

/*Precaución: debe tener cuidad al hacer la conexión del cable al protoboard,


si hace corto cualquiera de los pines podría dañar el puerto paralelo de la
computadora */

/* Autor: Raúl Espejel */


/* Marzo 2003*/

#include <stdio.h>
#include <conio.h>
#include <dos.h>
int bit[8];
int i,C,n,num,a,b,marc;
void not(int b);
void vista();

void main ()
{
clrscr();
i=C=n=num=a=b=marc=0;
for(i=0;i<=7;i++){

bit[i]=0; //arreglo solo de seguimiento bit por bit

}
outportb(0x378,0x00); // apaga todos los leds

for (i=1;;i++){
vista();
if (kbhit()){ //kbhit() se encuentra en conio.h y es una función que detecta si se ha oprimido alguna tecla
C=getch();
switch(C){
case 59:
marc=0;
if (bit[0]==0)
not(0);
else
not(1);
break;
case 60:
marc=1;
if (bit[1]==0)
not(0);
else
not(1);
break;
case 61:
marc=2;
if (bit[2]==0)
not(0);
else
not(1);
break;
case 62:
marc=3;
if (bit[3]==0)
not(0);
else
not(1);
break;
case 63:
marc=4;
if (bit[4]==0)
not(0);
else
not(1);
break;
case 64:
marc=5;
if (bit[5]==0)
not(0);
else
not(1);
break;
case 65:
marc=6;
if (bit[6]==0)
not(0);
else
not(1);
break;
case 66:
marc=7;
if (bit[7]==0)
not(0);
else
not(1);
break;
case 67:
num=inportb(0x378);
num++;
outportb(888,num);
break;
}
if(C==68){
break;
}

}
}
}
void not(int b){
a=inportb(0x378); //lee el número desplegado por los leds
if(b==0){
bit[marc]=1;
switch(marc){
case 0:
b=1;
num=a|b; //Operación OR lógica
outportb(888,num); //888 es 0x378 en decimal
break;
case 1:
b=2;
num=a|b;
outportb(888,num);
break;
case 2:
b=4;
num=a|b;
outportb(888,num);
break;
case 3:
b=8;
num=a|b;
outportb(888,num);
break;
case 4:
b=16;
num=a|b;
outportb(888,num);
break;
case 5:
b=32;
num=a|b;
outportb(888,num);
break;
case 6 :
b=64;
num=a|b;
outportb(888,num);
break;
case 7:
b=128;
num=a|b;
outportb(888,num);
break;
}

}
else{
bit[marc]=0;
switch(marc){
case 0:
b=254;
num=a&b; //operación lógica AND
outportb(888,num);
break;
case 1:
b=253;
num=a&b;
outportb(888,num);
break;
case 2:
b=251;
num=a&b;
outportb(888,num);
break;
case 3:
b=247;
num=a&b;
outportb(888,num);
break;
case 4:
b=239;
num=a&b;
outportb(888,num);
break;
case 5:
b=223;
num=a&b;
outportb(888,num);
break;
case 6:
b=191;
num=a&b;
outportb(888,num);
break;
case 7:
b=127;
num=a&b;
outportb(888,num);
break;
}
}
}

void vista(){
gotoxy(5,1);
for(i=0;i<=7;i++){
printf("%d ",bit[i]);
}