El conector del puerto paralelo del PC EMBED Word.Picture.8 Definición de los pines Pin 1 2 3 4 5 6 7 8 9 Señal -Strobe Datos 0 Datos 1 Datos 2 Datos 3 Datos 4 Datos 5 Datos 6 Datos 7 Bit C0 D0 D1 D2 D3 D4 D5 D6 D7 Dirección Salida E/S E/S E/S E/S E/S E/S E/S E/S Pin 10 11 12 13 14 15 16 17 18-25 Señal -Ack Busy Paper feed Select -Auto feed -Error -Init -Select Tierra Bit S6 S7 S5 S4 C1 S3 C2 C3 Dirección Entrada Entrada Entrada Entrada Salida Entrada Salida Salida Programa primero #include <stdio.h> #include <unistd.h> //asm/io.h donde están las funciones ioperm() y outb() #include <asm/io.h> #define DATAPORT 0x378 /* Direccion más frecuente para el puerto paralelo*/ int main() { //Obtenemos permiso acceso a la direccion de DATAPORT y las 2 siguientes if (ioperm(DATAPORT, 3, 1)) {perror("ioperm"); return 1;} while(1) //Entramos en un bucle infinito { int input; //Le pedimos al usuario que introduzca un número printf("Introduce un número entre 0 y 255 (-1 para salir)\n"); scanf("%d", &amp;input); //Leemos valor introducido.Lo guarda en "input" if(input==-1) break; //Si "input" vale "-1" salimos del bucle //Si "input" no está entre "0" y "255" (y no era "-1" no nos //interesa, así que volvemos directamente al comienzo del bucle if(input < 0 || input > 255) continue; //Si hemos llegado hasta aqui es que "input" vale entre "0" y 1 } //"255" y podemos sacarlo por el puerto paralelo outb(input, DATAPORT); //Antes de terminar el programa dejamos permisos de acceso como estaban if (ioperm(DATAPORT, 3, 0)) {perror("ioperm"); return 1;} //El programa termina sin errores return 0; } Programa segundo #include <stdio.h> #include <unistd.h> #include <asm/io.h> #define DATAPORT 0x378 // lpt1 Direccion más frecuente para el puerto paralelo #define DELAY 150000 //Duración de cada paso en microsegundos #define REPEAT 4 //Numero de veces que se repite cada secuencia void Blink(); void Alternate(); void ZigZag(); int main() { //Obtenemos permiso de acceso para la direccion de DATAPORT y 2 siguientes if (ioperm(DATAPORT, 3, 1)) {perror("ioperm"); return 1;} int mode=0; //mode indica que secuencia es la que se esta ejecutando while(1) { int i; for(i = 0 ; i < REPEAT; i++) { int reset=0; switch (mode) //Comprueba el valor de mode { case 0: //Si vale 0 toca parpadeo Blink(); break; case 1: //Si vale 1 toca alternar pares e impares Alternate(); break; case 2: //Si vale 2 toca hacer un ZigZag ZigZag(); break; default: //Si vale otra cosa, vovemos a empezar: ponemos mode a -1 mode=-1; } } //Despues de repetir REPEAT veces una secuencia pasamos a la siguiente mode++; // suma 1 a mode } //Volvemos a cerrar los puertos if (ioperm(DATAPORT, 3, 0)) {perror("ioperm"); return 1;} return 0; 2 } void Blink() //Esta función hace parpadear los LEDS. { outb(255,DATAPORT); //Ponemos todos los led a 1 usleep(2*DELAY); //Y esperamos 2*DELAY microsegundos outb(0,DATAPORT); //Luego ponemos todos los leds a 0 usleep(2*DELAY); //Y volvemos a esperar } void Alternate() // Enciende alternativamente los LEDS pares y los impares { int i; for(i=0;i<4;i++) //repetimos cuatro veces { int output = 85; //Primero ponemos 85 que es 01010101 en binario,se iluminan los LEDS impares outb(output,DATAPORT); usleep(2*DELAY); // y esperamos 2*DELAY } // Desplazamos los bits de output un lugar a la izquierda, queda "10101010" output = output << 1; outb(output,DATAPORT); // Al sacar en el puerto se iluminan los LEDS pares usleep(2*DELAY); } void ZigZag()// Esta función enciende las luces al estilo del coche fantastico { int output = 1; // output solo tiene el último bit distinto de 0 //direction indica sentido movimiento de la luz: 1 izquierda, 0 derecha. int direction = 1; // Empezamos hacia la derecha while (output !=0) { outb(output, DATAPORT); // Sacamos output por el puerto usleep(DELAY); if(direction) //Si dirección distinto de cero movemos bits output hacia izq output = output << 1; else //Si no, los movemos hacia la derecha output = output >> 1; //Si output vale 256 es que se nos ha salido //la luz por la izquierda así que cambiamos la dirección if(output==256) { output = output >> 1; direction = !direction; } } } Peso de cada bit del puerto paralelo de la impresora Pin 2 Pin 3 Datos0 Datos1 1 2 00000001 00000010 3 Pin 4 Pin 5 Pin 6 Pin 7 Pin 8 Pin 9 Datos2 Datos3 Datos4 Datos5 Datos6 Datos7 4 8 16 32 64 128 00000100 00001000 00010000 00100000 01000000 10000000 Circuitos ejemplo de interconexión con el mundo real Módulo oscilador: basado en el CI 555 Módulo C A/D y Comparador 4 Display LCD HD44780 5 6