// === CALCULADORA COM ATmega328P ===
// Dois botões, três LEDs, display 7 segmentos
#define BOT_INC 2 // Botão verde
#define BOT_ENTER 3 // Botão azul
#define SEG_A 4
#define SEG_B 5
#define SEG_C 6
#define SEG_D 7
#define SEG_E 11
#define SEG_F 12
#define SEG_G 13
#define LED_0 8
#define LED_1 9
#define LED_2 10
enum Estado {
ESPERANDO_NUM1,
ESPERANDO_NUM2,
MOSTRAR_RESULTADO
};
Estado estado = ESPERANDO_NUM1;
int numero1 = 0;
int numero2 = 0;
bool numero1Confirmado = false;
const byte digitos[4][7] = {
{1,1,1,1,1,1,0}, // 0
{0,1,1,0,0,0,0}, // 1
{1,1,0,1,1,0,1}, // 2
{1,1,1,1,0,0,1} // 3
};
bool estadoIncAnterior = HIGH;
bool estadoEnterAnterior = HIGH;
unsigned long debounceDelay = 50;
unsigned long ultimaLeituraInc = 0;
unsigned long ultimaLeituraEnter = 0;
void setup() {
Serial.begin(9600);
pinMode(BOT_INC, INPUT_PULLUP);
pinMode(BOT_ENTER, INPUT_PULLUP);
// Inicializa segmentos
int segmentos[] = {SEG_A, SEG_B, SEG_C, SEG_D, SEG_E, SEG_F, SEG_G};
for (int i = 0; i < 7; i++) {
digitalWrite(segmentos[i], LOW);
pinMode(segmentos[i], OUTPUT);
}
// Inicializa LEDs
int leds[] = {LED_0, LED_1, LED_2};
for (int i = 0; i < 3; i++) {
digitalWrite(leds[i], LOW);
pinMode(leds[i], OUTPUT);
}
mostrarDisplay(0);
limparLEDs();
Serial.println("Sistema iniciado. Display = 0. LEDs OFF.");
}
void loop() {
bool incPressionado = debounceBotao(BOT_INC, estadoIncAnterior, ultimaLeituraInc);
bool enterPressionado = debounceBotao(BOT_ENTER, estadoEnterAnterior, ultimaLeituraEnter);
switch (estado) {
case ESPERANDO_NUM1:
if (!numero1Confirmado) {
mostrarDisplay(numero1);
if (incPressionado) {
numero1 = (numero1 + 1) % 4;
mostrarDisplay(numero1);
Serial.print("Primeiro número da soma: ");
Serial.println(numero1);
}
if (enterPressionado) {
numero1Confirmado = true;
numero2 = 0;
mostrarDisplay(numero2);
Serial.print("Primeiro número confirmado: ");
Serial.println(numero1);
}
} else {
mostrarDisplay(numero2);
if (incPressionado) {
numero2 = (numero2 + 1) % 4;
mostrarDisplay(numero2);
Serial.print("Segundo número da soma: ");
Serial.println(numero2);
Serial.print("Segundo número confirmado: ");
Serial.println(numero2);
}
if (enterPressionado) {
int soma = numero1 + numero2;
mostrarResultadoBinario(soma);
Serial.print("Resultado da soma: ");
String bin3 = String(soma, BIN);
while (bin3.length() < 3) bin3 = "0" + bin3;
Serial.println(String(soma) + " (" + bin3 + ")");
estado = MOSTRAR_RESULTADO;
}
}
break;
case MOSTRAR_RESULTADO:
if (enterPressionado) {
limparLEDs();
numero1 = 0;
numero2 = 0;
numero1Confirmado = false;
mostrarDisplay(0);
Serial.println("Sistema resetado para nova operação.");
estado = ESPERANDO_NUM1;
}
break;
}
}
bool debounceBotao(int pino, bool &estadoAnterior, unsigned long &ultimaLeitura) {
bool leituraAtual = digitalRead(pino);
unsigned long agora = millis();
if (estadoAnterior == HIGH && leituraAtual == LOW && (agora - ultimaLeitura) > debounceDelay) {
ultimaLeitura = agora;
estadoAnterior = leituraAtual;
return true;
}
estadoAnterior = leituraAtual;
return false;
}
void mostrarDisplay(int numero) {
const int pinos[7] = {SEG_A, SEG_B, SEG_C, SEG_D, SEG_E, SEG_F, SEG_G};
for (int i = 0; i < 7; i++) {
digitalWrite(pinos[i], digitos[numero][i]);
}
}
void mostrarResultadoBinario(int valor) {
digitalWrite(LED_0, bitRead(valor, 0));
digitalWrite(LED_1, bitRead(valor, 1));
digitalWrite(LED_2, bitRead(valor, 2));
}
void limparLEDs() {
digitalWrite(LED_0, LOW);
digitalWrite(LED_1, LOW);
digitalWrite(LED_2, LOW);
}