#include <LedControl.h>
// Pin configuration for MAX7219
// DIN to pin 12, CLK to pin 11, CS to pin 10
LedControl lc = LedControl(12, 11, 10, 1); // (dataPin, clkPin, csPin, numDevices)
float num1, num2, result;
char operation;
void setup() {
// Initialize MAX7219
lc.shutdown(0, false); // Wake up display
lc.setIntensity(0, 8); // Set brightness (0-15)
lc.clearDisplay(0); // Clear display
Serial.begin(9600);
// Display "CALC" on startup
displayString("CALC");
delay(2000);
lc.clearDisplay(0);
}
void loop() {
displayString("NUM1");
while(Serial.available() == 0) {}
num1 = Serial.parseFloat();
displayNumber(num1);
delay(1000);
displayString("OPER");
while(Serial.available() == 0) {}
operation = Serial.read();
displayChar(operation);
delay(1000);
displayString("NUM2");
while(Serial.available() == 0) {}
num2 = Serial.parseFloat();
displayNumber(num2);
delay(1000);
switch(operation) {
case '+': result = num1 + num2; break;
case '-': result = num1 - num2; break;
case '*': result = num1 * num2; break;
case '/':
if(num2 != 0) result = num1 / num2;
else {
displayString("ERR");
delay(2000);
return;
}
break;
default:
displayString("ERR");
delay(2000);
return;
}
displayString("RES");
delay(1000);
displayNumber(result);
delay(5000);
lc.clearDisplay(0);
}
// Function to display numbers on 7-segment
void displayNumber(float number) {
lc.clearDisplay(0);
char numStr[8];
dtostrf(number, 7, 2, numStr); // Convert float to string with 2 decimal places
// Remove leading spaces and display
int startPos = 7;
for(int i = 0; i < 8 && numStr[i] != '\0'; i++) {
if(numStr[i] != ' ') {
if(numStr[i] == '-') {
lc.setChar(0, startPos, '-', false);
startPos--;
}
else if(numStr[i] == '.') {
lc.setLed(0, startPos+1, 7, true); // Set decimal point
}
else {
lc.setDigit(0, startPos, numStr[i] - '0', false);
startPos--;
}
}
}
}
// Function to display strings (limited characters)
void displayString(const char* str) {
lc.clearDisplay(0);
int len = strlen(str);
for(int i = 0; i < len && i < 8; i++) {
lc.setChar(0, 7-i, str[i], false);
}
}
// Function to display single character
void displayChar(char c) {
lc.clearDisplay(0);
lc.setChar(0, 7, c, false);
}