7 segment display, atmega328 to control it. 4 buttons. The buttons control each digit respectively. If I keep pressing a button the appropriate digit will cycle through 0-9 functions and correctly displays 0-9.
Here's the problem, the " turnOffAllExcept" function I have doesn't do what it was supposed to do(I'm assuming it's the culprit) and when pressing the buttons, all the numbers change instead of just their specific ones. Now I thought the way it's supposed to work is turn on one digit, display what I want, turn off the rest, then turn on the next digit, display what I want, turn off the previous one and the next two, etc.etc. Then do that more than 50 times a second. what can I do to fix it? I've been looking at this for days and just can't see it. ![]()
//set integers for switches
const int S1 = A3;
const int S2 = A2;
const int S3 = A1;
const int S4 = A0;
//set integers for 7 segment display
const int SegA = 11;
const int SegB = 10;
const int SegC = 9;
const int SegD = 8;
const int SegE = 5;
const int SegF = 4;
const int SegG = 3;
const int SegDP = 2; //decimal point
const int SegCOL = 1; //colon, ":"
//set integers for digits.(i.e D1 is equal to digit 1 and also T1, transistor 1, on board.
const int D1 = 13;
const int D2 = 12;
const int D3 = 7;
const int D4 = 6;
//track swith read value
int buttonState1 = HIGH;
int buttonState2 = HIGH;
int buttonState3 = HIGH;
int buttonState4 = HIGH;
int counterD1 = 0;
int counterD2 = 0;
int counterD3 = 0;
int counterD4 = 0;
void (*DigitFunctions[10])( int );
void turnOffAllExcept(int targetDigit)
{
int digits[4] = {
D1, D2, D3, D4 };
for(int i=0; i<4; i++){
if(i != targetDigit){
digits[i] = LOW;
}
}
}
//N1
void turnOnNumber1(int targetDigit){
digitalWrite(SegA, HIGH);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, HIGH);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, HIGH);
digitalWrite(SegG, HIGH);
digitalWrite(SegDP, HIGH);
turnOffAllExcept(targetDigit);
}
//N2
void turnOnNumber2(int targetDigit){
digitalWrite(SegA, LOW);
digitalWrite(SegB, LOW);
digitalWrite(SegC, HIGH);
digitalWrite(SegD, LOW);
digitalWrite(SegE, LOW);
digitalWrite(SegF, HIGH);
digitalWrite(SegG, LOW);
digitalWrite(SegDP, HIGH);
turnOffAllExcept(targetDigit);
}
void turnOnNumber3(int targetDigit){
digitalWrite(SegA, LOW);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, LOW);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, HIGH);
digitalWrite(SegG, LOW);
digitalWrite(SegDP, HIGH);
turnOffAllExcept(targetDigit);
}
void turnOnNumber4(int targetDigit){
digitalWrite(SegA, HIGH);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, HIGH);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, LOW);
digitalWrite(SegG, LOW);
digitalWrite(SegDP, HIGH);
turnOffAllExcept(targetDigit);
}
void turnOnNumber5(int targetDigit){
digitalWrite(SegA, LOW);
digitalWrite(SegB, HIGH);
digitalWrite(SegC, LOW);
digitalWrite(SegD, LOW);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, LOW);
digitalWrite(SegG, LOW);
digitalWrite(SegDP, HIGH);
turnOffAllExcept(targetDigit);
}
void turnOnNumber6(int targetDigit){
digitalWrite(SegA, LOW);
digitalWrite(SegB, HIGH);
digitalWrite(SegC, LOW);
digitalWrite(SegD, LOW);
digitalWrite(SegE, LOW);
digitalWrite(SegF, LOW);
digitalWrite(SegG, LOW);
digitalWrite(SegDP, HIGH);
turnOffAllExcept(targetDigit);
}
void turnOnNumber7(int targetDigit){
digitalWrite(SegA, LOW);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, HIGH);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, HIGH);
digitalWrite(SegG, HIGH);
digitalWrite(SegDP, HIGH);
turnOffAllExcept(targetDigit);
}
void turnOnNumber8(int targetDigit){
digitalWrite(SegA, LOW);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, LOW);
digitalWrite(SegE, LOW);
digitalWrite(SegF, LOW);
digitalWrite(SegG, LOW);
digitalWrite(SegDP, HIGH);
turnOffAllExcept(targetDigit);
}
void turnOnNumber9(int targetDigit){
digitalWrite(SegA, LOW);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, HIGH);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, LOW);
digitalWrite(SegG, LOW);
digitalWrite(SegDP, HIGH);
turnOffAllExcept(targetDigit);
}
void turnOnNumber0(int targetDigit){
digitalWrite(SegA, LOW);
digitalWrite(SegB, LOW);
digitalWrite(SegC, LOW);
digitalWrite(SegD, LOW);
digitalWrite(SegE, LOW);
digitalWrite(SegF, LOW);
digitalWrite(SegG, HIGH);
digitalWrite(SegDP, HIGH);
turnOffAllExcept(targetDigit);
}
void setup() {
//set switches as inputs with internal pullup resistor
pinMode(S1, INPUT_PULLUP);
pinMode(S2, INPUT_PULLUP);
pinMode(S3, INPUT_PULLUP);
pinMode(S4, INPUT_PULLUP);
pinMode(SegA, OUTPUT);
pinMode(SegB, OUTPUT);
pinMode(SegC, OUTPUT);
pinMode(SegD, OUTPUT);
pinMode(SegE, OUTPUT);
pinMode(SegF, OUTPUT);
pinMode(SegG, OUTPUT);
pinMode(SegDP, OUTPUT);
pinMode(SegCOL, OUTPUT);
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
pinMode(D3, OUTPUT);
pinMode(D4, OUTPUT);
DigitFunctions[0] = &turnOnNumber0;
DigitFunctions[1] = &turnOnNumber1;
DigitFunctions[2] = &turnOnNumber2;
DigitFunctions[3] = &turnOnNumber3;
DigitFunctions[4] = &turnOnNumber4;
DigitFunctions[5] = &turnOnNumber5;
DigitFunctions[6] = &turnOnNumber6;
DigitFunctions[7] = &turnOnNumber7;
DigitFunctions[8] = &turnOnNumber8;
DigitFunctions[9] = &turnOnNumber9;
}
void loop() {
//Keeps colon sign on always
digitalWrite(SegCOL, LOW);
if(didPressButtonDown(S1, buttonState1)){
if(counterD1 == 9){
counterD1 = -1;// it will be incremented to 0 on the next line
}
turnOnNumberForDigit(++counterD1, D1);
}
if(didPressButtonDown(S2, buttonState2)){
if(counterD2 == 9){
counterD2 = -1;// it will be incremented to 0 on the next line
}
turnOnNumberForDigit(++counterD2, D2);
}
if(didPressButtonDown(S3, buttonState3)){
if(counterD3 == 9){
counterD3 = -1;// it will be incremented to 0 on the next line
}
turnOnNumberForDigit(++counterD3, D3);
}
if(didPressButtonDown(S4, buttonState4)){
if(counterD4 == 9){
counterD4 = -1;// it will be incremented to 0 on the next line
}
turnOnNumberForDigit(++counterD4, D4);
}
delay(250);
}
bool didPressButtonDown(int button, int buttonState)
{
int tempValue = digitalRead(button);
if(tempValue == LOW && tempValue != buttonState){
buttonState = LOW;
return true;
}
else if(tempValue == HIGH && tempValue != buttonState){
buttonState = HIGH;
}
return false;
}
void turnOnNumberForDigit(int value, int targetDigit)
{
void (*turnOnNumber)(int targetDigit);
turnOnNumber = DigitFunctions[value];//get function N# where # == value
turnOnNumber(targetDigit);
}
and the schematic:
