Detector de Números Primos, Pares e Impares

Tabla de Verdad

Entradas: A, B, C, D (Número binario de 4 bits, donde A=MSB y D=LSB) | Salidas: nPrimos, nPares, nImpares

Entradas Valor Decimal Salidas
A B C D nPrimos (Pin 13) nPares (Pin 12) nImpares (Pin 11)
00000010
00011001
00102110
00113101
01004010
01015101
01106010
01117101
10008010
10019001
101010010
101111101
110012010
110113101
111014010
111115001

Funciones Lógicas

1. Número Primo:

Forma Canónica: nPrimos = !A·!B·C·!D + !A·!B·C·D + !A·B·!C·D + !A·B·C·D + A·!B·C·D + A·B·!C·D
Función Simplificada (Karnaugh): nPrimos = !A*!B*C + !B*C*D + !A*B*D + B*C*!D

2. Número Par:

Forma Canónica: nPares = !A·!B·!C·!D + !A·!B·C·!D + !A·B·!C·!D + !A·B·C·!D + A·!B·!C·!D + A·!B·C·!D + A·B·!C·!D + A·B·C·!D

Función Simplificada: nPares = !D

3. Número Impar:

Forma Canónica: nImpares = !A·!B·!C·D + !A·!B·C·D + !A·B·!C·D + !A·B·C·D + A·!B·!C·D + A·!B·C·D + A·B·!C·D + A·B·C·D

Función Simplificada: nImpares = D

Código Arduino

const int leds[] = {13,12,11,10,9,8,7,6,5};
const int entradas[] = {28,26,24,22};
const int numeroLeds = sizeof(leds) / sizeof(leds[0]);
const int numeroEntradas = sizeof(entradas) / sizeof(entradas[0]);
bool A, B, C, D, nPrimos, nPares, nImpares;

void setup()
{
  Serial.begin(115200);
  for(int i = 0; i < numeroLeds; i++){
    pinMode(leds[i], OUTPUT);
  }
  for(int i = 0; i < numeroEntradas; i++){
    pinMode(entradas[i], INPUT);
  }
}

void loop()
{
  A = digitalRead(entradas[0]); // Leo estado Pin 28
  B = digitalRead(entradas[1]); // Leo estado Pin 26
  C = digitalRead(entradas[2]); // Leo estado Pin 24
  D = digitalRead(entradas[3]); // Leo estado Pin 22

  // Funciones
  nPrimos = (!A && !B && C && !D) ||
            (!A && !B && C && D) ||
            (!A && B && !C && D) ||
            (!A && B && C && D) ||
            (A && !B && C && D) ||
            (A && B && !C && D);
  // Misma función con + y * : nPrimos = !A*!B*C*!D + !A*!B*C*D + !A*B*!C*D + !A*B*C*D + A*!B*C*D + A*B*!C*D;
  // Función Simplificada (Karnaugh): nImpares = nPrimos = !A*!B*C + !B*C*D + !A*B*D + B*!C*D;

  nPares = !A*!B*!C*!D + !A*!B*C*!D + !A*B*!C*!D + !A*B*C*!D + A*!B*!C*!D + A*!B*C*!D + A*B*!C*!D + A*B*C*!D; 
  // También se puede hacer con (nPares = !A) o (nPares = A^B^C^D)

  nImpares = !A*!B*!C*!D + !A*!B*C*!D + !A*B*!C*!D + !A*B*C*!D + A*!B*!C*!D + A*!B*C*!D + A*B*!C*!D + A*B*C*!D;
  // También se puede hacer con (nImpares = !nPares), (nImpares = A) o (nImpares = !(A^B^C^D))
  
  // Salidas
  digitalWrite(leds[0], nPrimos);   // Salida Nº Primo en Pin 13
  digitalWrite(leds[1], nPares);    // Salida Nº Par en Pin 12
  digitalWrite(leds[2], nImpares);  // Salida Nº Impar en Pin 11
  
}