#include <stdio.h>
#include <unistd.h>
#include <sys/io.h>
// Esta es la direccion más frecuente para el puerto paralelo
#define DATAPORT 0x378 /* lpt1 */
//Duración de cada paso en microsegundos
#define DELAY 150000
//Numero de veces que se repite cada secuencia
#define REPEAT 4
void Blink();
void Alternate();
void ZigZag();
int main()
{
//Obtenemos permiso de acceso para la direccion de DATAPORT y
//las 2 siguientes
if (ioperm(DATAPORT, 3, 1)) {perror("ioperm"); return 1;}
//mode indique que secuencia es la que se esta ejecutando
int mode=0;
while(1)
{
int i;
for(i = 0 ; i < REPEAT; i++)
{
int reset=0;
//Comprueba el valor de mode
switch (mode)
{
//Si vale 0 toca parpadeo
case 0:
Blink();
break;
//Si vale 1 toca alternar pares e impares
case 1:
Alternate();
break;
//Si vale 2 toca hacer un ZigZag
case 2:
ZigZag();
break;
//Si vale otra cosa, vovemos a empezar. Para ello
// ponemos mode a -1
default:
mode=-1;
}
}
//Despues de repetir REPEAT veces una secuencia pasamos
//a la siguiente sumandole 1 a mode
mode++;
}
//Volvemos a cerrar los puertos
if (ioperm(DATAPORT, 3, 0)) {perror("ioperm"); return 1;}
return 0;
}
//Esta función hace parpadear los leds.
void Blink()
{
//Ponemos todos los led a 1
outb(255,DATAPORT);
//Y esperamos 2*DELAY microsegundos
usleep(2*DELAY);
//Luego ponemos todos los leds a 0
outb(0,DATAPORT);
//Y volvemos a esperar
usleep(2*DELAY);
}
//Esta función enciende alternativamente los leds pares y los impares
void Alternate()
{
int i;
//repetimos cuatro veces
for(i=0;i<4;i++)
{
int output = 85;
//Primero ponemos 85 que es 01010101 en binario,
//con lo que se iluminan los leds impares, y esperamos 2*DELAY
outb(output,DATAPORT);
usleep(2*DELAY);
//Desplazamos los bits de output un lugar a la izquierda,
//con lo que nos queda "10101010"
output = output << 1;
//Al pasarlo al puerto paralelo se iluminan los leds pares
outb(output,DATAPORT);
usleep(2*DELAY);
}
}
//Esta función enciende ulas luces al estilo del coche fantastico
void ZigZag()
{
//output solo tiene el último bit distinto de 0
int output = 1;
//direction indica el sentido de movimiento de la luz: 1 izquierda,
// 0 derecha. Empezamos hacia la derecha
int direction = 1;
while (output !=0)
{
//Sacamos output por el puerto
outb(output, DATAPORT);
usleep(DELAY);
//Si dirección es distinto de cero
//movemos los bits de output hacia la izquierda
if(direction)
output = output << 1;
//Si no, los movemos hacia la derecha
else
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;
}
}
}