/*Para enviar datos al puerto paralelo se utiliza la instrucci˘n de C
outportb(direccion,dato), donde direcci˘n es la direcci˘n del puerto
(datos o de control) y dato es una variable con los ocho bits que se
desean enviar al puerto. El par metro direcci˘n debe coincidir con la
direcci˘n del puerto de estado.
*/

#include <ConIO.h>
#include <IOStream.h>
																																//LEDS1.cpp
int PuertoDatos = 0x378; //˘ 0x3bc
int PuertoEstado = PuertoDatos+1;
int PuertoControl = PuertoDatos+2;

void delay(int Tiempo){
	for (long i = 0; i<Tiempo*40000; i++)
		;
}

void main(){

	outportb (PuertoDatos, 0); //apagar leds manejados por puerto de datos con 00000000
	//todos los bits del puerto de datos trabajan de forma normal. bits 0 al 7.

	outportb(PuertoControl, 0xb);  //apagar leds manejados por puerto de control con 0xb:
	//0xb: 00001011
	//recuerde que los bits 0, 1 y 3 están invertidos, los bits de derecha a izquierda
	//el bit 2 está normal y los 4, 5, 6 y 7 no están habilitados.

	cout<< "Cuenta escribiendo en puerto de datos y prendiendo LEDs \n";
	for (int i=0; i<=256 ; i++){
		outportb(PuertoDatos, i);
		cout << i << endl;
		delay(100);
	}
	outportb(PuertoDatos, 0x00);  //se apagan los LEDS acoplados al puerto de control

	cout << "\nEnciende led rojo manejado por bit 0 del puerto de control\n";
	//0000 1010 = 0x0a //recuerde que el bit 0 esta invertido.
	//entonces hay que mandarle un 0 para que el Led se prenda
	outportb(PuertoControl, 0xa);  //enciende leds manejado por bit 0 del puerto de control
	delay(1000);
	outportb(PuertoControl, 0xb);  //apaga bit 0 del puerto de control. en realidad todos
	cout << "\nApaga led rojo manejado por bit 0 del puerto de control\n";

	cout << "\nEnciende led rojo manejado por bit 1 del puerto de control\n";
	//0000 1001 = 0x09 //recuerde que el bit 1 esta invertido.
	//entonces hay que mandarle un 0 para que el Led se prenda
	outportb(PuertoControl, 0x09);  //enciende led manejado por bit 1 del puerto de control
	delay(1000);
	cout << "\nApaga led rojo manejado por bit 1 del puerto de control\n";
	outportb(PuertoControl, 0xb);  //apaga bit 1 del puerto de control. en realidad todos

	cout << "\nEnciende led rojo manejado por bit 2 del puerto de control\n";
	//0000 1111 = 0x0f
	//hay que mandarle un 1 para que el Led se prenda
	outportb(PuertoControl, 0x0f);  //enciende led manejado por bit 2 del puerto de control
	delay(1000);
	cout << "\nApaga led rojo manejado por bit 2 del puerto de control\n";
	outportb(PuertoControl, 0xb);  //apaga bit 2 del puerto de control. en realidad todos

	cout << "\nEnciende led rojo manejado por bit 3 del puerto de control\n";
	//0000 0011 = 0x03 //recuerde que el bit 3 esta invertido.
	//entonces hay que mandarle un 0 para que el Led se prenda
	outportb(PuertoControl, 0x03);  //enciende led manejado por bit 2 del puerto de control
	delay(1000);
	cout << "\nApaga led rojo manejado por bit 3 del puerto de control\n";
	outportb(PuertoControl, 0xb);  //apaga bit 3 del puerto de control. en realidad todos
}
