Yo tenía problemas al intentar mandar salidas al puerto paralelo en una ventana de XP OUTP ( ) no hacia nada en el puerto al mandar un numero solo algunas veces i con mucho retardo, con un bucle que repita baria veces OUTP la respuesta es de inmediato y segura
/**********************************************************
* puerto2.c *
* Escribe datos al puerto paralelo de la PC *
* (c)1999, Virgilio Gómez Negrete *
**********************************************************/
#include <stdio.h>
#include <dos.h>
int puerto(int direcc);
int seleccion;
int main()
{
unsigned int __far *puntero_a_direccion;
int i, direccion[3]={0,0,0}, disponible[3]={0,0,0};
puntero_a_direccion = (unsigned int __far *)0x00000408;
printf("Seleccione el puerto:\n");
/* ¿Cuantos puertos existen? */
for (i=0; i<3; i++)
{
if (*puntero_a_direccion == 0)
printf("Puerto LPT%d...............no disponible\n", i+1);
else
{
disponible[i] = 1;
direccion[i] = *puntero_a_direccion;
printf("Puerto LPT%d...............%d\n", i+1, i+1);
}
puntero_a_direccion++;
}
printf("Salir del programa........0\n");
scanf("%d", &seleccion);
do
{
switch(seleccion)
{
case 0: /* Salir del programa */
printf("Adios!!!\n"); /* return 0; */
break;
case 1:/* Puerto LPT1 */
if(disponible[0]==1)
puerto(direccion[0]);
else
{
printf("ERROR: PUERTO NO DISPONIBLE\n");
return 0;
}
break;
case 2: /* Puerto LPT2 */
if(disponible[1]==1)
puerto(direccion[1]);
else
{
printf("ERROR: PUERTO NO DISPONIBLE\n");
return 0;
}
break;
case 3: /* Puerto LPT3 */
if(disponible[2]==1)
puerto(direccion[2]);
else
{
printf("ERROR: PUERTO NO DISPONIBLE\n");
return 0;
}
break;
default:
printf("ERROR: OPCION INCORRECTA!\n");
break;
}
if(seleccion!=0)
{
printf("Seleccione otra opcion\n");
scanf("%d", &seleccion);
}
}
while(seleccion!=0);
return 0;
}
int puerto(int direcc)
{
unsigned int valor; /* Solo valores entre 0 y 255 */
int rep ,sal=1;
printf("Ahora puede escribir cualquier valor\n");
printf("entre 1 y 255, > 255 para terminar el programa\n");
do
{
printf("Valor al puerto?\n");
scanf("%d", &valor); /* variable de salida a P.Parlelo */
if ( valor > 255 ) sal =0;
if ( valor > 255 ) break; /* El programa original */
for ( rep =0; rep < 10 ; rep++ ) /* a mi NO me funciona en */
{ /* DOS-WINDOWS_XP sin el bucle */
outp (direcc, valor); /* que repite varias */
outp (direcc, valor); /* veces OUTP ( ) */
} /* */
/* ¿ si sabes como controlar el */
/* */
/* puerto serie en DOS->WIN_XP */
/* o algo mejor para el P. Paral. */
/* mandame algo a */
/*
[email protected] */
/* */
printf("Se ha escrito %d al puerto\n", valor);
}
while(sal!=0);
return seleccion=0;
}
/*
MASA RESISTENCIAS LEDS P.PARALELO SALIDAS
390 OMS * 8 PIN
___________/\/\/\/\/\______|/_________ D0 - 2
| |\
|
|__________/\/\/\/\/\_______|/_________ D1 - 3
| |\
|
|__________/\/\/\/\/\_______|/_________ D2 - 4
| |\
|
|__________/\/\/\/\/\_______|/_________ D3 - 5
| |\
|
|__________/\/\/\/\/\_______|/_________ D4 - 6
| |\
|
|__________/\/\/\/\/\_______|/_________ D5 - 7
| |\
|
|__________/\/\/\/\/\_______|/_________ D6 - 8
| |\
|
|__________/\/\/\/\/\_______|/_________ D7 - 9
| |\
|
|______________________________________ MASA - 18 A 25
*/