//---------------------------------------------------------------------------------------------------------------
// Pia 8255 a puerto paralelo.
// J.Rubio.   www.tecnofilos.org
//---------------------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <stdlib.h>

#define DATOS   0x378
#define ESTADO  0x379
#define CONTROL 0x37A
#define ECR 0x378+0x402
#define ModoBidireccional outp(0x378+0x402,128);
#define Lectura outp(CONTROL,inp(CONTROL) | 32);
#define Escritura outp(CONTROL,inp(CONTROL) & 223);

//---------------------------------------------------------------------------------------------------------------
// Rutinas de utilización de la pia.
//---------------------------------------------------------------------------------------------------------------
void Control(unsigned char dato){
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x04); //Todos a 1.
   Escritura  outp(DATOS,dato);
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x0C); //WR a 0.
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x04); //Todos a 1.
   Lectura
}

void Pa(unsigned char dato){
   Escritura outp(DATOS,dato);
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x0F);  //0100
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x07);  //1100
   Lectura
}

unsigned char Pa(void){
unsigned char dato;
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x03);  //1000
   Lectura
   dato = inp(DATOS);
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x07);  //1100
return(dato);
}

void Pb(unsigned char dato){
   Escritura outp(DATOS,dato);
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x0E);  //0101
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x06);  //1101
   Lectura
}

unsigned char Pb(void){
unsigned char dato;
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x02);  //1001
   dato = inp(DATOS);
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x06);  //1101
return(dato);
}

void Pc(unsigned char dato){
   Escritura outp(DATOS,dato);
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x0D);  //0110
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x05);  //1110
   Lectura
}

unsigned char Pc(void){
unsigned char dato;
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x01);  //1001
   dato = inp(DATOS);
   outp(CONTROL,(inp(CONTROL) & 0xF0) | 0x05);  //1101
return(dato);
}

//----------------------------------------------------------------------------
// RUTINA PRINCIPAL DEL PROGRAMA. Ejemplo de utilización.
//----------------------------------------------------------------------------

main(){
unsigned char a,b,c;
   
	ModoBidireccional Lectura
	Control(128);

// Ejemplo de salida de datos:

	Pa(0x00);
	Pb(0x19);
	Pc(0x27);

// Ejemplo de entrada de datos.
	a = Pa();
	b = Pb();
	c = Pc();   	

getch();
}


