//https://forum.arduino.cc/t/slot-car-lap-counter/1376016
/*
SN74HC595/6 PIN Equivalente
14 DS 14 SER SERIAL_IN
13 OE 13 OE GND
12 STCP 12 RCLK LATCH
11 SHCP 11 SRCLK CLOCK
10 MR 10 SRCLR +V
9 Q7S 9 QH SERIAL_OUT
15 Q0 A
1 Q1 F
2 Q2 G
3 Q3 E
4 Q4 D
5 Q5 C
6 Q6 B
7 Q7 DP
#define SER 7 //data
#define RCLK 5 // LATCH
#define SRCLK 6 // CLOCK
*/
// ********************************************************************
// Select count display mode:
// 4 counter 2 display each 4 Pin 9
// 2 counter 4 display each 2 Pin 10
// 1 counter 8 display 1 Pin 11
// ********************************************************************
int SRCLK = 6;//SHcp pin of 74HC595
int RCLK = 5;//STcp pin of 74HC595
int SER = 7;//ds pin of 74HC595
int digit1, digit2, digit3, digit4, digit5, digit6, digit7, digit8;
byte segmentsBits[] = {B01111011, //0
B01100000, //1
B01011101, //2
B01110101, //3
B01100110, //4
B00110111, //5
B00111111, //6
B01100001, //7
B01111111, //8
B01110111 //9
};
byte score1 = 0;
byte score2 = 0;
byte score3 = 0;
byte score4 = 0;
#define sns1 2
#define sns2 3
#define sns3 4
#define sns4 8
#define mode4 9
#define mode2 10
#define mode1 11
//------------------------------------------------------------------
void setup() {
pinMode(SRCLK, OUTPUT);
pinMode(RCLK, OUTPUT);
pinMode(SER, OUTPUT);
digitalWrite(SRCLK, LOW);
digitalWrite(RCLK, LOW);
digitalWrite(SER, LOW);
pinMode(sns1, INPUT_PULLUP);
pinMode(sns2, INPUT_PULLUP);
pinMode(sns3, INPUT_PULLUP);
pinMode(sns4, INPUT_PULLUP);
pinMode(mode4, INPUT_PULLUP);
pinMode(mode2, INPUT_PULLUP);
pinMode(mode1, INPUT_PULLUP);
}
//------------------------------------------------------------------
void loop() {
// 4 x 2
if (digitalRead(mode4) == LOW) {
if (digitalRead(sns1) == LOW) {
delay(30);
if (digitalRead(sns1) == LOW) {
while (digitalRead(sns1) == LOW) {}
score1++;
if (score1 > 99 )score1 = 0;
}
}
if (digitalRead(sns2) == LOW) {
delay(30);
if (digitalRead(sns2) == LOW) {
while (digitalRead(sns2) == LOW) {}
score2++;
if (score2 > 99 )score2 = 0;
}
}
if (digitalRead(sns3) == LOW) {
delay(30);
if (digitalRead(sns3) == LOW) {
while (digitalRead(sns3) == LOW) {}
score3++;
if (score3 > 99 )score3 = 0;
}
}
if (digitalRead(sns4) == LOW) {
delay(30);
if (digitalRead(sns4) == LOW) {
while (digitalRead(sns4) == LOW) {}
score4++;
if (score4 > 99 )score4 = 0;
}
}
}
// 2 x 4
if (digitalRead(mode2) == LOW) {
if (digitalRead(sns1) == LOW) {
delay(30);
if (digitalRead(sns1) == LOW) {
while (digitalRead(sns1) == LOW) {}
score2++;
if (score2 > 99 ) {
score2 = 0;
score1++;
if (score1 > 99 )score1 = 0;
}
}
}
if (digitalRead(sns2) == LOW) {
delay(30);
if (digitalRead(sns2) == LOW) {
while (digitalRead(sns2) == LOW) {}
score4++;
if (score4 > 99 ) {
score4 = 0;
score3++;
if (score3 > 99 )score3 = 0;
}
}
}
}
// 1 x 8
if (digitalRead(mode1) == LOW) {
if (digitalRead(sns1) == LOW) {
delay(30);
if (digitalRead(sns1) == LOW) {
while (digitalRead(sns1) == LOW) {}
score4++;
if (score4 > 99 ) {
score4 = 0;
score3++;
if (score3 > 99 ) {
score3 = 0;
score2++;
}
if (score2 > 99 ) {
score2 = 0;
score1++;
}
if (score1 > 99 ) {
score1 = 0;
}
}
}
}
}
digit1 = score1 % 10 ; // gets dec
showDig(digit1, 0xFD);
digit2 = (score1 / 10) % 10 ; //gets unit
showDig(digit2, 0xFE);
digit3 = score2 % 10 ; //gets dec
showDig(digit3, 0xFB);
digit4 = (score2 / 10) % 10 ; //gets unit
showDig(digit4, 0xF7);
digit5 = score3 % 10 ; //gets dec
showDig(digit5, 0xEF);
digit6 = (score3 / 10) % 10 ; //gets unit
showDig(digit6, 0xDF);
digit7 = score4 % 10 ; //gets dec
showDig(digit7, 0xBF);
digit8 = (score4 / 10) % 10 ; //gets unit
showDig(digit8, 0x7F);
}
//---------------------------------------------------------------------
void showDig(int digit, byte digitBits) {
digitalWrite(RCLK, LOW);
shiftOut(SER, SRCLK, MSBFIRST, digitBits);
shiftOut(SER, SRCLK, MSBFIRST, segmentsBits[ digit]);
digitalWrite(RCLK, HIGH);
delay(1);
}A
B
C
D
E
F
G