forked from Skystalker/BinaryCalculator
306 lines
6.9 KiB
Arduino
306 lines
6.9 KiB
Arduino
|
// Buttons
|
||
|
const int buttonFirstRow = A0;
|
||
|
const int buttonSecondRow = A1;
|
||
|
const int buttonAdd = A2;
|
||
|
const int buttonSub = A3;
|
||
|
const int buttonXXX = A4;
|
||
|
|
||
|
const byte debounceLevel = 5;
|
||
|
|
||
|
// LED Matrix
|
||
|
const int driverFirstRow = 7;
|
||
|
const int driverSecondRow = 6;
|
||
|
const int driverResultRow = 5;
|
||
|
|
||
|
const int driverBit0Column = 8;
|
||
|
const int driverBit1Column = 9;
|
||
|
const int driverBit2Column = 10;
|
||
|
const int driverBit3Column = 11;
|
||
|
const int driverBit4Column = 12;
|
||
|
|
||
|
// Calculator Variables
|
||
|
byte FirstValue = 0;
|
||
|
byte SecondValue = 0;
|
||
|
byte ResultValue = 0;
|
||
|
|
||
|
// Matrix Variables
|
||
|
byte ActiveRow = 0; // 0 = FirstRow, 1 = SecondRow, 2 = ResultRow
|
||
|
|
||
|
// Timer Variables
|
||
|
unsigned long currentMillis;
|
||
|
unsigned long previousMillis;
|
||
|
|
||
|
// Button debounce
|
||
|
byte buttonFirstRowDebounceCounter = 0;
|
||
|
byte buttonSecondRowDebounceCounter = 0;
|
||
|
byte buttonAddDebounceCounter = 0;
|
||
|
byte buttonSubDebounceCounter = 0;
|
||
|
byte buttonXXXDebounceCounter = 0;
|
||
|
|
||
|
// Button States
|
||
|
bool buttonFirstRowPressed = false;
|
||
|
bool buttonSecondRowPressed = false;
|
||
|
bool buttonAddPressed = false;
|
||
|
bool buttonSubPressed = false;
|
||
|
bool buttonXXXPressed = false;
|
||
|
|
||
|
//
|
||
|
unsigned int startupCounter = 1;
|
||
|
|
||
|
//
|
||
|
// Setup Routine (started o)
|
||
|
//
|
||
|
|
||
|
void setup() {
|
||
|
// Setup Buttons
|
||
|
pinMode(buttonFirstRow, INPUT_PULLUP);
|
||
|
pinMode(buttonSecondRow, INPUT_PULLUP);
|
||
|
pinMode(buttonAdd, INPUT_PULLUP);
|
||
|
pinMode(buttonSub, INPUT_PULLUP);
|
||
|
pinMode(buttonXXX, INPUT_PULLUP);
|
||
|
|
||
|
// Setup LED Matrix
|
||
|
pinMode(driverFirstRow, OUTPUT);
|
||
|
digitalWrite(driverFirstRow, LOW);
|
||
|
pinMode(driverSecondRow, OUTPUT);
|
||
|
digitalWrite(driverSecondRow, LOW);
|
||
|
pinMode(driverResultRow, OUTPUT);
|
||
|
digitalWrite(driverResultRow, LOW);
|
||
|
pinMode(driverBit0Column, OUTPUT);
|
||
|
digitalWrite(driverBit0Column, LOW);
|
||
|
pinMode(driverBit1Column, OUTPUT);
|
||
|
digitalWrite(driverBit1Column, LOW);
|
||
|
pinMode(driverBit2Column, OUTPUT);
|
||
|
digitalWrite(driverBit2Column, LOW);
|
||
|
pinMode(driverBit3Column, OUTPUT);
|
||
|
digitalWrite(driverBit3Column, LOW);
|
||
|
pinMode(driverBit4Column, OUTPUT);
|
||
|
digitalWrite(driverBit4Column, LOW);
|
||
|
|
||
|
// save current Timestamp to start first Task in 10ms
|
||
|
previousMillis = millis();
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Main Program (Loop)
|
||
|
//
|
||
|
|
||
|
void loop() {
|
||
|
// get current Timestamp
|
||
|
currentMillis = millis();
|
||
|
|
||
|
// Enter this Statement if 10ms difference between both timestamps
|
||
|
if ((unsigned long)(currentMillis - previousMillis) >= 3) {
|
||
|
|
||
|
if (startupCounter > 0) {
|
||
|
|
||
|
StartupAnimationTask();
|
||
|
} else {
|
||
|
// Check if any button is pressed
|
||
|
ButtonTask();
|
||
|
}
|
||
|
|
||
|
// Update LED Matrix
|
||
|
LEDMatrixTask();
|
||
|
|
||
|
// save current Timestamp to trigger next Task in 10ms
|
||
|
previousMillis = currentMillis;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// SubRoutines
|
||
|
//
|
||
|
|
||
|
void ButtonTask() {
|
||
|
//
|
||
|
ReadButtonsDebounced();
|
||
|
|
||
|
if (buttonFirstRowPressed) {
|
||
|
buttonFirstRowPressed = false;
|
||
|
FirstValue++;
|
||
|
if (FirstValue > 0x0F) {
|
||
|
FirstValue = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (buttonSecondRowPressed) {
|
||
|
buttonSecondRowPressed = false;
|
||
|
SecondValue++;
|
||
|
if (SecondValue > 0x0F) {
|
||
|
SecondValue = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (buttonAddPressed) {
|
||
|
buttonAddPressed = false;
|
||
|
ResultValue = FirstValue + SecondValue;
|
||
|
}
|
||
|
|
||
|
if (buttonSubPressed) {
|
||
|
buttonSubPressed = false;
|
||
|
ResultValue = FirstValue - SecondValue;
|
||
|
}
|
||
|
|
||
|
if (buttonXXXPressed) {
|
||
|
buttonXXXPressed = false;
|
||
|
// Program here your own function
|
||
|
ResultValue = FirstValue xor SecondValue;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void ReadButtonsDebounced() {
|
||
|
// First Row Button
|
||
|
if (digitalRead(buttonFirstRow) == LOW) {
|
||
|
if (buttonFirstRowDebounceCounter < debounceLevel) {
|
||
|
buttonFirstRowDebounceCounter++;
|
||
|
}
|
||
|
} else {
|
||
|
if (buttonFirstRowDebounceCounter >= debounceLevel) {
|
||
|
buttonFirstRowPressed = true;
|
||
|
}
|
||
|
buttonFirstRowDebounceCounter = 0;
|
||
|
}
|
||
|
|
||
|
// Second Row Button
|
||
|
if (digitalRead(buttonSecondRow) == LOW) {
|
||
|
if (buttonSecondRowDebounceCounter < debounceLevel) {
|
||
|
buttonSecondRowDebounceCounter++;
|
||
|
}
|
||
|
} else {
|
||
|
if (buttonSecondRowDebounceCounter >= debounceLevel) {
|
||
|
buttonSecondRowPressed = true;
|
||
|
}
|
||
|
buttonSecondRowDebounceCounter = 0;
|
||
|
}
|
||
|
|
||
|
// Add Button
|
||
|
if (digitalRead(buttonAdd) == LOW) {
|
||
|
if (buttonAddDebounceCounter < debounceLevel) {
|
||
|
buttonAddDebounceCounter++;
|
||
|
}
|
||
|
} else {
|
||
|
if (buttonAddDebounceCounter >= debounceLevel) {
|
||
|
buttonAddPressed = true;
|
||
|
}
|
||
|
buttonAddDebounceCounter = 0;
|
||
|
}
|
||
|
|
||
|
// Sub Button
|
||
|
if (digitalRead(buttonSub) == LOW) {
|
||
|
if (buttonSubDebounceCounter < debounceLevel) {
|
||
|
buttonSubDebounceCounter++;
|
||
|
}
|
||
|
} else {
|
||
|
if (buttonSubDebounceCounter >= debounceLevel) {
|
||
|
buttonSubPressed = true;
|
||
|
}
|
||
|
buttonSubDebounceCounter = 0;
|
||
|
}
|
||
|
|
||
|
// XXX Button
|
||
|
if (digitalRead(buttonXXX) == LOW) {
|
||
|
if (buttonXXXDebounceCounter < debounceLevel) {
|
||
|
buttonXXXDebounceCounter++;
|
||
|
}
|
||
|
} else {
|
||
|
if (buttonXXXDebounceCounter >= debounceLevel) {
|
||
|
buttonXXXPressed = true;
|
||
|
}
|
||
|
buttonXXXDebounceCounter = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void LEDMatrixTask() {
|
||
|
if (ActiveRow == 0) {
|
||
|
DisplayValueInRow(driverFirstRow, FirstValue);
|
||
|
ActiveRow = 1;
|
||
|
} else if (ActiveRow == 1) {
|
||
|
DisplayValueInRow(driverSecondRow, SecondValue);
|
||
|
ActiveRow = 2;
|
||
|
} else {
|
||
|
DisplayValueInRow(driverResultRow, ResultValue);
|
||
|
ActiveRow = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void DisplayValueInRow(int row, byte value) {
|
||
|
// disable all rows
|
||
|
digitalWrite(driverFirstRow, LOW);
|
||
|
digitalWrite(driverSecondRow, LOW);
|
||
|
digitalWrite(driverResultRow, LOW);
|
||
|
|
||
|
// set new value
|
||
|
if (bitRead(value,0) == 1) {
|
||
|
digitalWrite(driverBit0Column, HIGH);
|
||
|
} else {
|
||
|
digitalWrite(driverBit0Column, LOW);
|
||
|
}
|
||
|
if (bitRead(value,1) == 1) {
|
||
|
digitalWrite(driverBit1Column, HIGH);
|
||
|
} else {
|
||
|
digitalWrite(driverBit1Column, LOW);
|
||
|
}
|
||
|
if (bitRead(value,2) == 1) {
|
||
|
digitalWrite(driverBit2Column, HIGH);
|
||
|
} else {
|
||
|
digitalWrite(driverBit2Column, LOW);
|
||
|
}
|
||
|
if (bitRead(value,3) == 1) {
|
||
|
digitalWrite(driverBit3Column, HIGH);
|
||
|
} else {
|
||
|
digitalWrite(driverBit3Column, LOW);
|
||
|
}
|
||
|
if (bitRead(value,4) == 1) {
|
||
|
digitalWrite(driverBit4Column, HIGH);
|
||
|
} else {
|
||
|
digitalWrite(driverBit4Column, LOW);
|
||
|
}
|
||
|
|
||
|
// enable row
|
||
|
digitalWrite(row, HIGH);
|
||
|
}
|
||
|
|
||
|
void StartupAnimation() {
|
||
|
startupCounter++;
|
||
|
|
||
|
if (startupCounter < 150) {
|
||
|
FirstValue = 15;
|
||
|
SecondValue = 0;
|
||
|
ResultValue = 0;
|
||
|
} else if (startupCounter < 300) {
|
||
|
FirstValue = 0;
|
||
|
SecondValue = 15;
|
||
|
ResultValue = 0;
|
||
|
} else if (startupCounter < 450) {
|
||
|
FirstValue = 0;
|
||
|
SecondValue = 0;
|
||
|
ResultValue = 31;
|
||
|
} else if (startupCounter < 600) {
|
||
|
FirstValue = 1;
|
||
|
SecondValue = 1;
|
||
|
ResultValue = 1;
|
||
|
} else if (startupCounter < 750) {
|
||
|
FirstValue = 2;
|
||
|
SecondValue = 2;
|
||
|
ResultValue = 2;
|
||
|
} else if (startupCounter < 900) {
|
||
|
FirstValue = 4;
|
||
|
SecondValue = 4;
|
||
|
ResultValue = 4;
|
||
|
} else if (startupCounter < 1050) {
|
||
|
FirstValue = 8;
|
||
|
SecondValue = 8;
|
||
|
ResultValue = 8;
|
||
|
} else if (startupCounter < 1200) {
|
||
|
FirstValue = 0;
|
||
|
SecondValue = 0;
|
||
|
ResultValue = 16;
|
||
|
} else if (startupCounter < 1350) {
|
||
|
FirstValue = 0;
|
||
|
SecondValue = 0;
|
||
|
ResultValue = 0;
|
||
|
startupCounter = 0;
|
||
|
}
|
||
|
}
|