/*
  * Diseñado por Juan David Gallego García y Juan Esteban Pulgarín Arango
  * El programa puede ser descargado y modificado
  * 
  * LOGICA COMBINACIONAL PARA NAND NOR NOT y XOR
   * Pines para seleccionar tipo de compuerta
   * A0(a) A1(b)
   * 0  0   NAND 
   * 0  1   NOR
   * 1  0   NOT
   * 1  1   XOR
   *
   *¨Pines para operaciones lógicas
   * A2(c) A3(d) NAND  NOR NOT(A2) XOR
   * 0      0     1     1    1      0
   * 0      1     1     0    1      1
   * 1      0     1     0    0      1
   * 1      1     0     0    0      0
  */

void setup() {
  /*Salida para la combinación lógica*/
  pinMode(2,OUTPUT); //Salida del led
  pinMode(A0, INPUT_PULLUP);
  pinMode(A1, INPUT_PULLUP);
  pinMode(A2, INPUT_PULLUP);
  pinMode(A3, INPUT_PULLUP);
  digitalWrite(2,HIGH); //Se configura led como apagado 
}

void loop() {
  bool a = !digitalRead(A0); 
  bool b = !digitalRead(A1);
  bool c = !digitalRead(A2);
  bool d = !digitalRead(A3); 
  if(!a&&!b){//Compuerta NAND
    if(!(c&&d)){
      digitalWrite(2,LOW);//Al menos una de las entradas c y d están en LOW, Prende led
    }else{
      digitalWrite(2,HIGH);//En caso de que las dos estén en HIGH, apaga el LED
    }  
  }else if(!a&&b){//Compuerta NOR
      if(!(c||d)){
      digitalWrite(2,LOW);//Entradas c y d están en LOW Prende led
    }else{
      digitalWrite(2,HIGH);//En caso de que al menos de las dos  estén en HIGH apaga el LED
    }  
  }else if(a&&!b){//Compuerta NOT
      if(!c){
      digitalWrite(2,LOW);//Entrada c está en LOW Prende led
    }else{
      digitalWrite(2,HIGH);//Entrada c está en HIGH Apaga led
    }  
  }else{//Compuerta XOR
    if(c^d){ 
        digitalWrite(2,LOW); //Cuando c y d son diferentes enciende led
      }else{
        digitalWrite(2,HIGH);  //Cuando c y d son iguales apaga led
      }
  }
}