/*
Steven Gates
Assessment 2
December 2023
Up and Down 16 bit Binary counter
Purpose of this program is to count in 4 bit binary and displaying using LEDs
*/
/*#define bit1LEDpin 10
#define bit2LEDpin 11
#define bit3LEDpin 12
#define bit4LEDpin 13
const int upButtonPin = 2; // Pin for the up count button
const int downButtonPin = 3; // Pin for the down count button
// Variables to store the previous state of buttons
int upButtonState;
int downButtonState;
int counter = 0; // Counter variable
int minValue = 0;
int maxValue = 15;
void setup() {
// Initialize serial communication for debugging (optional)
Serial.begin(9600);
// set pinModes for output LEDs and input PB
pinMode(bit1LEDpin, OUTPUT);
pinMode(bit2LEDpin, OUTPUT);
pinMode(bit3LEDpin, OUTPUT);
pinMode(bit4LEDpin, OUTPUT);
pinMode(upButtonPin, INPUT_PULLUP); // INPUT_PULLUP enables internal pull-up resistor
pinMode(downButtonPin, INPUT_PULLUP);
// Initialize button states
upButtonState = digitalRead(upButtonPin);
downButtonState = digitalRead(downButtonPin);
// Initial counter value display to assist in debugging
Serial.print("Counter: ");
Serial.println(counter);
}
void loop() {
// put your main code here, to run repeatedly:
// Read the current state of buttons
int upButtonCurrentState = digitalRead(upButtonPin);
int downButtonCurrentState = digitalRead(downButtonPin);
// Check for button presses
if (upButtonCurrentState != upButtonState) {
if (upButtonCurrentState == LOW && counter < maxValue) {
counter++;
Serial.print("Counter: ");
Serial.println(counter);
} else if (upButtonCurrentState == LOW && counter == maxValue) {
counter = minValue; // Reset the counter to the minimum value
Serial.print("Counter: ");
Serial.println(counter);
}
delay(50);
}
if (downButtonCurrentState != downButtonState) {
if (downButtonCurrentState == LOW && counter > minValue) {
counter--;
Serial.print("Counter: ");
Serial.println(counter);
} else if (downButtonCurrentState == LOW && counter == minValue) {
counter = maxValue; // Set the counter to the maximum value when at minimum
Serial.print("Counter: ");
Serial.println(counter);
}
delay(50);
}
// Update button states for the next iteration
upButtonState = upButtonCurrentState;
downButtonState = downButtonCurrentState;
if (counter == 0) {
digitalWrite(bit1LEDpin, LOW);
digitalWrite(bit2LEDpin, LOW);
digitalWrite(bit3LEDpin, LOW);
digitalWrite(bit4LEDpin, LOW);
}
else if (counter == 1) {
digitalWrite(bit1LEDpin, HIGH);
digitalWrite(bit2LEDpin, LOW);
digitalWrite(bit3LEDpin, LOW);
digitalWrite(bit4LEDpin, LOW);
}
else if (counter == 2) {
digitalWrite(bit1LEDpin, LOW);
digitalWrite(bit2LEDpin, HIGH);
digitalWrite(bit3LEDpin, LOW);
digitalWrite(bit4LEDpin, LOW);
}
else if (counter == 3) {
digitalWrite(bit1LEDpin, HIGH);
digitalWrite(bit2LEDpin, HIGH);
digitalWrite(bit3LEDpin, LOW);
digitalWrite(bit4LEDpin, LOW);
}
else if (counter == 4) {
digitalWrite(bit1LEDpin, LOW);
digitalWrite(bit2LEDpin, LOW);
digitalWrite(bit3LEDpin, HIGH);
digitalWrite(bit4LEDpin, LOW);
}
else if (counter == 5) {
digitalWrite(bit1LEDpin, HIGH);
digitalWrite(bit2LEDpin, LOW);
digitalWrite(bit3LEDpin, HIGH);
digitalWrite(bit4LEDpin, LOW);
}
else if (counter == 6) {
digitalWrite(bit1LEDpin, LOW);
digitalWrite(bit2LEDpin, HIGH);
digitalWrite(bit3LEDpin, HIGH);
digitalWrite(bit4LEDpin, LOW);
}
else if (counter == 7) {
digitalWrite(bit1LEDpin, HIGH);
digitalWrite(bit2LEDpin, HIGH);
digitalWrite(bit3LEDpin, HIGH);
digitalWrite(bit4LEDpin, LOW);
}
else if (counter == 8) {
digitalWrite(bit1LEDpin, LOW);
digitalWrite(bit2LEDpin, LOW);
digitalWrite(bit3LEDpin, LOW);
digitalWrite(bit4LEDpin, HIGH);
}
else if (counter == 9) {
digitalWrite(bit1LEDpin, HIGH);
digitalWrite(bit2LEDpin, LOW);
digitalWrite(bit3LEDpin, LOW);
digitalWrite(bit4LEDpin, HIGH);
}
else if (counter == 10) {
digitalWrite(bit1LEDpin, LOW);
digitalWrite(bit2LEDpin, HIGH);
digitalWrite(bit3LEDpin, LOW);
digitalWrite(bit4LEDpin, HIGH);
}
else if (counter == 11) {
digitalWrite(bit1LEDpin, HIGH);
digitalWrite(bit2LEDpin, HIGH);
digitalWrite(bit3LEDpin, LOW);
digitalWrite(bit4LEDpin, HIGH);
}
else if (counter == 12) {
digitalWrite(bit1LEDpin, LOW);
digitalWrite(bit2LEDpin, LOW);
digitalWrite(bit3LEDpin, HIGH);
digitalWrite(bit4LEDpin, HIGH);
}
else if (counter == 13) {
digitalWrite(bit1LEDpin, HIGH);
digitalWrite(bit2LEDpin, LOW);
digitalWrite(bit3LEDpin, HIGH);
digitalWrite(bit4LEDpin, HIGH);
}
else if (counter == 14) {
digitalWrite(bit1LEDpin, LOW);
digitalWrite(bit2LEDpin, HIGH);
digitalWrite(bit3LEDpin, HIGH);
digitalWrite(bit4LEDpin, HIGH);
}
else if (counter == 15) {
digitalWrite(bit1LEDpin, HIGH);
digitalWrite(bit2LEDpin, HIGH);
digitalWrite(bit3LEDpin, HIGH);
digitalWrite(bit4LEDpin, HIGH);
}
}*/
//EDIT: 15/12/23 Rewrote code to compact the coding
#define bit1LEDpin 10
#define bit2LEDpin 11
#define bit3LEDpin 12
#define bit4LEDpin 13
const int upButtonPin = 2;
const int downButtonPin = 3;
int upButtonState;
int downButtonState;
int counter = 0;
int minValue = 0;
int maxValue = 15;
void setup() {
Serial.begin(9600);
pinMode(bit1LEDpin, OUTPUT);
pinMode(bit2LEDpin, OUTPUT);
pinMode(bit3LEDpin, OUTPUT);
pinMode(bit4LEDpin, OUTPUT);
pinMode(upButtonPin, INPUT_PULLUP);
pinMode(downButtonPin, INPUT_PULLUP);
upButtonState = digitalRead(upButtonPin);
downButtonState = digitalRead(downButtonPin);
Serial.print("Counter: ");
Serial.println(counter);
}
//the updateLEDs function takes an integer value as input and sets the states of four LEDs based on the binary representation of that value.
//Each LED corresponds to a bit in the binary representation, and its state is determined by whether the corresponding bit is set or not.
//This compactly updates the LED states based on the binary value of the counter.
void updateLEDs(int value) {
digitalWrite(bit1LEDpin, (value & 0b0001) ? HIGH : LOW); //This line sets the state of the LED connected to bit1LEDpin based on the least significant bit of the binary representation of the value variable.
digitalWrite(bit2LEDpin, (value & 0b0010) ? HIGH : LOW);
digitalWrite(bit3LEDpin, (value & 0b0100) ? HIGH : LOW);
digitalWrite(bit4LEDpin, (value & 0b1000) ? HIGH : LOW);
}
void loop() {
int upButtonCurrentState = digitalRead(upButtonPin);
int downButtonCurrentState = digitalRead(downButtonPin);
if (upButtonCurrentState != upButtonState) {
if (upButtonCurrentState == LOW && counter < maxValue) {
counter++;
Serial.print("Counter: ");
Serial.println(counter);
} else if (upButtonCurrentState == LOW && counter == maxValue) {
counter = minValue;
Serial.print("Counter: ");
Serial.println(counter);
}
delay(50);
}
if (downButtonCurrentState != downButtonState) {
if (downButtonCurrentState == LOW && counter > minValue) {
counter--;
Serial.print("Counter: ");
Serial.println(counter);
} else if (downButtonCurrentState == LOW && counter == minValue) {
counter = maxValue;
Serial.print("Counter: ");
Serial.println(counter);
}
delay(50);
}
upButtonState = upButtonCurrentState;
downButtonState = downButtonCurrentState;
updateLEDs(counter);
}