/* Ejemplo b sico de E/S digital mediante el puerto paralelo 2002 V¡ctor R. Gonz lez */ #include #include #define LPT_BASE puerto_dir /* Direcci¢n base del puerto paralelo */ #define DATOS LPT_BASE /* Direcci¢n de E/S del reg. de datos */ #define CONTROL LPT_BASE+2 /* Direcci¢n de E/S del reg. de control */ #define C5_ON 0x20 /* Bit 5 de CONTROL a 1 */ main () { unsigned char byte; /* byte para operaciones de E/S */ unsigned char ctrl; /* byte para estado de CONTROL */ int puerto; /* n£mero de puerto paralelo: 0 (LPT1), 1 (LPT2), 2 (LPT3) */ unsigned int puerto_dir; /* direcci¢n del puerto */ /* Determina los puertos instalados y sus direcciones */ for (puerto=2; puerto>=0; puerto--) { LPT_BASE = peek(0x0040,0x0008 + puerto*2); if (LPT_BASE == 0) printf("No hay puerto asignado a LPT%d \n", puerto+1); else printf("La direcci¢n de LPT%d es 0x%X\n", puerto+1, LPT_BASE); } if (LPT_BASE > 0) { /* Suponemos puerto bidireccional (comprobar en BIOS) */ ctrl = inportb(CONTROL); /* guarda el valor actual del reg. de CONTROL */ printf ("Introduce el byte que se enviar  al puerto: "); scanf("%u", &byte); getchar(); /* pone el puerto en modo salida */ outportb (CONTROL, ctrl & ~C5_ON ); outportb (DATOS, byte); /* env¡a un byte */ printf ("Polariza las l¡neas del puerto y pulsa una tecla\n"); getchar(); /* pone el puerto en modo entrada */ outportb (CONTROL, ctrl | C5_ON ); byte = inportb (DATOS); /* lee un byte */ printf ("El valor le¡do es %i", byte); outportb(CONTROL, ctrl); /* restaura el valor original del reg. de CONTROL */ } return 0; }