#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define LED_ALU1 16
#define LED_ALU2 17
#define BTN_SELECT 18
#define BTN_ENTER 19
int opcion = 0; // 1 = Escalar, 2 = SuperEscalar
int pulsos = 0;
int A = 10, B = 5, C = 3, D = 2;
int resultado1, resultado2;
unsigned long inicio, fin;
void setup() {
Serial.begin(115200);
pinMode(LED_ALU1, OUTPUT);
pinMode(LED_ALU2, OUTPUT);
pinMode(BTN_SELECT, INPUT_PULLUP); // Botón conectado a GND
pinMode(BTN_ENTER, INPUT_PULLUP); // Botón conectado a GND
lcd.init();
lcd.backlight();
mostrarMenu();
}
void mostrarMenu() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Menu:");
lcd.setCursor(0,1);
lcd.print("Select->Enter");
opcion = 0;
pulsos = 0;
}
void ejecutarEscalar() {
inicio = micros();
resultado1 = A + B; // Ciclo 1
resultado1 = resultado1 - C; // Ciclo 2
resultado1 = resultado1 * D; // Ciclo 3
fin = micros();
float tiempo_ms = (fin - inicio) / 1000.0; // convierte a ms
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Escalar");
lcd.setCursor(0,1);
lcd.print("Res:");
lcd.print(resultado1);
lcd.print(" T:");
lcd.print(tiempo_ms, 3); // imprime con 3 decimales
lcd.print("ms C:3");
Serial.println("Modo Escalar");
Serial.print("Resultado: ");
Serial.println(resultado1);
Serial.print("Tiempo(ms): ");
Serial.println(tiempo_ms, 3);
Serial.println("Ciclos: 3");
}
void ejecutarSuperEscalar() {
inicio = micros();
// Ciclo 1: ALU1 ejecuta ADD y MUL, ALU2 ejecuta SUB
resultado1 = (A + B) * D; // ALU1
resultado2 = C - D; // ALU2
fin = micros();
float tiempo_ms = (fin - inicio) / 1000.0; // convierte a ms
// Mostrar primero resultados
lcd.clear();
lcd.setCursor(0,0);
lcd.print("SuperEscalar");
lcd.setCursor(0,1);
lcd.print("R1:");
lcd.print(resultado1);
lcd.print(" R2:");
lcd.print(resultado2);
Serial.println("Modo SuperEscalar");
Serial.print("Resultado ALU1: ");
Serial.println(resultado1);
Serial.print("Resultado ALU2: ");
Serial.println(resultado2);
// LEDs para visualizar ejecución paralela
digitalWrite(LED_ALU1, HIGH);
digitalWrite(LED_ALU2, HIGH);
delay(500);
digitalWrite(LED_ALU1, LOW);
digitalWrite(LED_ALU2, LOW);
// Espera 5 segundos antes de mostrar tiempo y ciclos
delay(5000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Tiempo/Ciclos");
lcd.setCursor(0,1);
lcd.print("T:");
lcd.print(tiempo_ms, 3); // imprime con 3 decimales
lcd.print("ms C:2");
Serial.print("Tiempo(ms): ");
Serial.println(tiempo_ms, 3);
Serial.println("Ciclos: 2");
}
void loop() {
// Botón de selección: cuenta pulsos
if (digitalRead(BTN_SELECT) == LOW) {
delay(200); // debounce
pulsos++;
Serial.print("Pulsos: ");
Serial.println(pulsos);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Seleccion:");
lcd.setCursor(0,1);
lcd.print(pulsos);
while(digitalRead(BTN_SELECT) == LOW); // espera soltar
}
// Botón Enter: confirma opción
if (digitalRead(BTN_ENTER) == LOW) {
delay(200); // debounce
if (pulsos == 1) {
opcion = 1;
ejecutarEscalar();
} else if (pulsos == 2) {
opcion = 2;
ejecutarSuperEscalar();
} else {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Opcion invalida");
}
pulsos = 0; // reset
while(digitalRead(BTN_ENTER) == LOW); // espera soltar
}
}