Hi,
I'm trying to make a simple 2 digit, 7 segment counter with one button to start,stop,reset. This is my first real project with the arduino, and I'm having some real trouble with it. I haven't coded in a while(I did some c and VB back in the mid 90's), so please bear that in mind, I know my code probably isn't the best way of doing things, but it's the best way that i've come up with so far.
The circuit itself is pretty simple, the arduino sending BCD to two 74LS47 BCD-7seg decoders running two 7 segment leds. A momentary on pushbutton switch is connected to pin 10 of the arduino.
As the code stands now, the counter starts stopped at '00', when I press the button, the counter starts running, but if I press the button again, nothing happens, it just continues counting. Any help would be greatly appreciated, I'm pretty sure i've gone about this all wrong, I just don't know where i've gone wrong.
thanks in advance.
el ![]()
unsigned long t0; //This will be a global variable.
int switchPin=10; //digital pin for button
boolean lastButton=LOW; //for debounce
boolean currentButton=LOW; //for debounce
int ones=0; //integer for ones variable
int tens=0; //integer for tens variable
int runState = 0; //0=stopped ; 1=paused ; 2=reset back to 00 and counting again
void setup() {
// initialize pins 2-5 for digital output. This is the ones digit.
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
// Initialize pins 6-9 for digital output. This is the tens digit.
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(switchPin,INPUT);
t0 = millis(); // Record current time in milliseconds.
}
//debounce switch function
boolean debounce(boolean last)
{
boolean current = digitalRead(switchPin);
if (last != current)
{
delay(5);
current = digitalRead(switchPin);
}
return current;
}
void loop()
{
currentButton = debounce(lastButton); //debounce
if (lastButton == LOW && currentButton == HIGH && runState == 0) //if button is pressed and runState is 0(stopped)
{
runState=1; //setup runState to running
lastButton=currentButton; //reset button
while (ones <= 9 && tens <=5 && runState == 1) //begin counting loop
{
pickUnit(ones);
ones++;
delay(1000);
if (ones >= 10)
{
tens++;
pickTens(tens);
ones=0;
}
if (lastButton == LOW && currentButton == HIGH && runState == 1) //if counter running and button pressed, just display current units
{
lastButton=currentButton; //reset button
runState=2;
pickTens(tens);
pickUnit(ones);
if (lastButton == LOW && currentButton == HIGH && runState == 2)//if counter paused and button pressed, reset all values and break
{
lastButton=currentButton; //reset button
runState=0;
tens=0;
ones=0;
pickUnit(ones);
pickTens(tens);
break;
}
}
}
tens=0;
ones=0;
pickUnit(ones);
pickTens(tens);
} }
//handle output display to BCD
void pickUnit(int ones)
{
switch(ones)
{
default: units0();break;
case 1: units1();break;
case 2: units2(); break;
case 3: units3(); break;
case 4: units4(); break;
case 5: units5(); break;
case 6: units6(); break;
case 7: units7(); break;
case 8: units8(); break;
case 9: units9(); break;
}
}
void pickTens(int tens)
{
switch(tens)
{
default: tens0();break;
case 1: tens1();break;
case 2: tens2(); break;
case 3: tens3(); break;
case 4: tens4(); break;
case 5: tens5(); break;
case 6: tens6(); break;
case 7: tens7(); break;
case 8: tens8(); break;
case 9: tens9(); break;
}
}
void units0()
{
digitalWrite(2, LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
}
void units1()
{
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
}
void units2()
{
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
}
void units3()
{
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
}
void units4()
{
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
}
void units5()
{
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
}
void units6()
{
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
}
void units7()
{
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
}
void units8()
{
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
}
void units9()
{
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
}
void tens0()
{
digitalWrite(6, LOW);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
}
void tens1()
{
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
}
void tens2()
{
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
}
void tens3()
{
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
}
void tens4()
{
digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(8,HIGH);
digitalWrite(9,LOW);
}
void tens5()
{
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
digitalWrite(8,HIGH);
digitalWrite(9,LOW);
}
void tens6()
{
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,LOW);
}
void tens7()
{
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,LOW);
}
void tens8()
{
digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
digitalWrite(9,HIGH);
}
void tens9()
{
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
digitalWrite(9,HIGH);
}