/* CONTROL DE ACTUADORES Y SENSORES MEDIANTE PUERTO PARALELO Programaci¢n de la interface b sica de 8 LED y 8 microinterruptores Actuadores - LED en las 8 l¡neas de DATOS: 7 6 5 4 3 2 1 0 D7 D6 D5 D4 D3 D2 D1 D0 Sensores - DIP switch de 8 pos. en 4 l¡neas de CONTROL y 4 de ESTADO: 7 6 5 4 3 2 1 0 S7# S6 S5 S4 C3# C2 C1# C0# 2002 V¡ctor R. Gonz lez */ #include #include /* Direcciones del puerto paralelo */ #define LPT_BASE 0x378 #define DATOS LPT_BASE #define ESTADO LPT_BASE+1 #define CONTROL LPT_BASE+2 main () { unsigned byte; unsigned i, j; /* Control de actuadores digitales (8 diodos LED en el puerto de DATOS) */ printf ("Control de salidas digitales (valor > 255 para fin):\n"); byte = 0; /* La primera vez apaga los diodos (env¡a 0) */ while (byte < 256) { outportb (DATOS, byte); printf (" Introduce el byte que se enviar  al puerto: "); scanf ("%u", &byte); getchar(); } /* Control de sensores digitales (8 microinterruptores -DIP switch- 4 en l¡neas de CONTROL y 4 en l¡neas de ESTADO) */ printf ("\nControl de entradas digitales (f para fin):\n"); outportb (CONTROL, 0x04); /* Pone CONTROL en modo entrada (si posible) */ do { byte = ((inportb(CONTROL) & 0x0F) | (inportb(ESTADO) & 0xF0)) ^ 0x8B; printf (" Byte le¡do del puerto: %u ", byte); } while (getchar() == '\n'); getchar(); /* Interacci¢n de actuadores y sensores */ printf ("\nRealimentaci¢n de las salidas con las entradas digitales (f para fin):"); printf ("\n\t entrada < 16 = dirige la entrada a la salida"); printf ("\n\t entrada < 32 = destello impares"); printf ("\n\t entrada < 64 = destello pares"); printf ("\n\t entrada < 128 = intermitencia 5 s"); printf ("\n\t entrada < 256 = destello progresivo\n"); do { /* Toma nibble bajo de CONTROl y alto de ESTADO e invierte bits 0, 1, 3 y 7 */ byte = (inportb(CONTROL) & 0x0F | inportb(ESTADO) & 0xF0) ^ 0x8B; printf (" Byte le¡do: %u ", byte); if (byte < 16) /* Env¡a el valor de la entrada a la salida */ outportb (DATOS, byte); else if (byte < 32) { /* Realiza un destello en las salidas impares */ outportb (DATOS, 85); /* Enciende */ delay (500); outportb (DATOS, 0); /* Apaga */ } else if (byte < 64) { /* Realiza un destello en las salidas pares */ outportb (DATOS, 170); /* Enciende */ delay (500); outportb (DATOS, 0); /* Apaga */ } else if (byte < 128) /* Intermitencia durante 5 segundos */ for (i=1; i<=10; i++ ) { outportb (DATOS, 0); delay (250); /* Apaga */ outportb (DATOS, 255); delay (250); /* Enciende todos */ } else /* Destello progresivo */ for (i=1; i<=10; i++ ) { for (j=7; j<=224; j*=2) { outportb (DATOS, j); delay(50); } for (j=224; j>=7; j/=2) { outportb (DATOS, j); delay(50); } } } while (getchar() == '\n'); return 0; }