Jag har inte skrivit så mycket här, mest knackat kod och jobbat. Men nu är jag nog framme vid version 1.0!  
Har bjudit hem "beställaren" för avprovning, det går ju att dividera sig gul och blå på hur saker ska fungera, så jag tänkte att det är nog lättare att han själv tar en titt och tycker till.
Kod: Markera allt
#include <Time.h>
#include <Timer.h>
Timer t;
long lastDebounceTime = 0;  // the last time the output pin was toggled
long debounceDelay = 200;    // the debounce time; increase if the output flickers
int pinBTN1 = 3;   //StartFromZero
int pinBTN2 = 18;  //StartFromSet
int pinBTN3 = 19;  //Pause
int pinBTN4 = 20;  //StopAndZero
int pinBTN5 = 21;  //PointCountActive
int pinLED1 = 9;   //StartFromZero
int pinLED2 = 10;  //StartFromSet
int pinLED3 = 11;  //Pause
int pinLED4 = 12;  //StopAndZero
int pinLED5 = 13;  //PointCountActive
int pinBCD11 = 39; //Minutsiffra 1
int pinBCD12 = 41;
int pinBCD14 = 43;
int pinBCD18 = 45;
int pinBCD21 = 47; //Minutsiffra 2
int pinBCD22 = 49;
int pinBCD24 = 51;
int pinBCD28 = 53;
int pinBCD31 = 38; //Poäng hemma
int pinBCD32 = 40;
int pinBCD34 = 42;
int pinBCD38 = 44;
int pinBCD41 = 46; //Poäng Borta
int pinBCD42 = 48;
int pinBCD44 = 50;
int pinBCD48 = 52;
int pinRLK   = 30;  //Latch
int pinSLK   = 28;  //Clock
int pinDAT   = 26;  //Data
int pinDP1   = 22;
int pinDP2   = 24;
String sToDisp;
String iMM;
String iSS;
String iMMSS;
char OneChar;
volatile int StartFromZero = LOW;
volatile int StartFromSet = LOW;
volatile int Pause = LOW;
volatile int StopAndZero = LOW;
volatile int PointCountActive = LOW;
int pinDP1state = LOW;
int pinDP2state = LOW;
int enableTick;
int runMode = 0; //Runmodes. 0=init. 1=Roll logo. 2=StartFromZero. 3=StartFromSet. 4=Pause. 5=StopAndZero.
int enablePoints = LOW;
int StartFromZeroInit = LOW;
int StartFromSetInit = LOW;
int PauseInit = LOW;
int ipMM;
int ipSS;
int lastRunMode = 0;
void setup()
{
  pinMode(pinBTN1, INPUT_PULLUP);  //StartFromZero
  pinMode(pinBTN2, INPUT_PULLUP);  //StartFromSet
  pinMode(pinBTN3, INPUT_PULLUP);  //Pause
  pinMode(pinBTN4, INPUT_PULLUP);  //StopAndZero
  pinMode(pinBTN5, INPUT_PULLUP);  //PointCountActive
  pinMode(pinBCD11, INPUT_PULLUP); //Minutsiffra 1
  pinMode(pinBCD12, INPUT_PULLUP);
  pinMode(pinBCD14, INPUT_PULLUP);
  pinMode(pinBCD18, INPUT_PULLUP);
  pinMode(pinBCD21, INPUT_PULLUP); //Minutsiffra 2
  pinMode(pinBCD22, INPUT_PULLUP);
  pinMode(pinBCD24, INPUT_PULLUP);
  pinMode(pinBCD28, INPUT_PULLUP);
  pinMode(pinBCD31, INPUT_PULLUP); //Poäng hemma
  pinMode(pinBCD32, INPUT_PULLUP);
  pinMode(pinBCD34, INPUT_PULLUP);
  pinMode(pinBCD38, INPUT_PULLUP);
  pinMode(pinBCD41, INPUT_PULLUP); //Poäng Borta
  pinMode(pinBCD42, INPUT_PULLUP);
  pinMode(pinBCD44, INPUT_PULLUP);
  pinMode(pinBCD48, INPUT_PULLUP);
  pinMode(pinLED1, OUTPUT);        //StartFromZero
  pinMode(pinLED2, OUTPUT);        //StartFromSet
  pinMode(pinLED3, OUTPUT);        //Pause
  pinMode(pinLED4, OUTPUT);        //StopAndZero
  pinMode(pinLED5, OUTPUT);        //PointCountActive
  pinMode(pinDAT, OUTPUT);
  pinMode(pinDAT, OUTPUT);
  pinMode(pinSLK, OUTPUT);
  pinMode(pinRLK, OUTPUT);
  pinMode(pinDP1, OUTPUT);
  pinMode(pinDP2, OUTPUT);
  attachInterrupt(1, intrptBTN1, FALLING); //StartFromZero
  attachInterrupt(5, intrptBTN2, FALLING); //StartFromSet
  attachInterrupt(4, intrptBTN3, FALLING); //Pause
  attachInterrupt(3, intrptBTN4, FALLING); //StopAndZero
  attachInterrupt(2, intrptBTN5, FALLING); //PointCountActive
  Serial.begin(9600);
  t.every(500, DP12tick);
  t.every(5000, showScore);
  
}
void loop() {
  t.update();
//Runmodes. 0=init. 1=Roll logo. 2=StartFromZero. 3=StartFromSet. 4=Pause. 5=StopAndZero  
switch (runMode) {
    case 0:
        initScoreBoard();
      break;
    case 1: //Roll logo
        digitalWrite(pinLED1, HIGH);//StartFromZero LED
        digitalWrite(pinLED2, HIGH);//StartFromSet LED
        digitalWrite(pinLED3, HIGH);//Pause LED
        digitalWrite(pinLED4, LOW);//StopAndZero LED
        enableTick = LOW;
        RollLogo();
      break;
    case 2: //StartFromZero
        digitalWrite(pinLED1, LOW);//StartFromZero LED
        digitalWrite(pinLED2, HIGH);//StartFromSet LED
        digitalWrite(pinLED3, HIGH);//Pause LED
        digitalWrite(pinLED4, HIGH);//StopAndZero LED
        PauseInit = LOW;
        enableTick = HIGH;        
        CountFromZero();
      break;
    case 3: //StartFromSet
        digitalWrite(pinLED1, HIGH);//StartFromZero LED
        digitalWrite(pinLED2, LOW);//StartFromSet LED
        digitalWrite(pinLED3, HIGH);//Pause LED
        digitalWrite(pinLED4, HIGH);//StopAndZero LED
        PauseInit = LOW;
        enableTick = HIGH;        
        CountFromSet();
      break;      
    case 4: //Pause
        digitalWrite(pinLED1, HIGH);//StartFromZero LED
        digitalWrite(pinLED2, HIGH);//StartFromSet LED
        digitalWrite(pinLED3, LOW);//Pause LED
        digitalWrite(pinLED4, HIGH);//StopAndZero LED
        enableTick = LOW;        
        PauseTime();
      break;
    case 5: //StopAndZero
        StartFromZeroInit = LOW;
        StartFromSetInit = LOW;
        digitalWrite(pinLED1, HIGH);//StartFromZero LED
        digitalWrite(pinLED2, HIGH);//StartFromSet LED
        digitalWrite(pinLED3, HIGH);//Pause LED
        digitalWrite(pinLED4, LOW);//StopAndZero LED
        enableTick = LOW;
        digitalWrite(pinDP1, LOW);  digitalWrite(pinDP2, LOW);        
        runMode = 1;
      break;     
      
  }
}
void PauseTime() {
    
    if (PauseInit == LOW) {
      
      ipMM = minute();
      ipSS = second();
      PauseInit = HIGH;
    }
    setTime(00,ipMM,ipSS,01,01,2001);
    enableTick = LOW;
    digitalWrite(pinDP1, HIGH);  digitalWrite(pinDP2, HIGH);
}
void CountFromZero() {
  if (StartFromZeroInit == LOW) {
    setTime(00,00,00,01,01,2001);
    StartFromZeroInit = HIGH;
  }
  iMM = String(minute(), DEC);
  if (iMM.length() == 1) { iMM = "0" + iMM; }
  iSS = String(second(), DEC);
  if (iSS.length() == 1) { iSS = "0" + iSS; }
  iMMSS = iMM + iSS;
  DispOut(iMMSS);
  
}
void CountFromSet() {
  int iSetMM;
  String sMM;
  if (StartFromSetInit == LOW) {
  iSetMM = BCDminut1() * 10;
  iSetMM = iSetMM + BCDminut2();
    setTime(00,iSetMM,00,01,01,2001);
    StartFromSetInit = HIGH;
  }
  iMM = String(minute(), DEC);
  if (iMM.length() == 1) { iMM = "0" + iMM; }
  iSS = String(second(), DEC);
  if (iSS.length() == 1) { iSS = "0" + iSS; }
  iMMSS = iMM + iSS;
  DispOut(iMMSS);
  
}
void showScore() {
  if (PointCountActive == HIGH) {
    String sBuildScore = "";
    int hemmaP = BCDhemmap();
    int bortaP = BCDbortap();
    sBuildScore = sBuildScore + String(hemmaP, DEC);
    sBuildScore = sBuildScore + "  ";
    sBuildScore = sBuildScore + String(bortaP, DEC);
    DispOut(sBuildScore);
    delay(3000);
  }
}
void initScoreBoard() {
  DispOut("8888");
  digitalWrite(pinDP1, HIGH);  digitalWrite(pinDP2, HIGH);
  digitalWrite(pinLED1, LOW);  digitalWrite(pinLED2, LOW); digitalWrite(pinLED3, LOW); digitalWrite(pinLED4, LOW); digitalWrite(pinLED5, LOW);  
  delay(2000);
  digitalWrite(pinDP1, LOW);  digitalWrite(pinDP2, LOW);
  digitalWrite(pinLED1, HIGH);  digitalWrite(pinLED2, HIGH); digitalWrite(pinLED3, HIGH); digitalWrite(pinLED4, LOW); digitalWrite(pinLED5, HIGH);
  runMode = 1;
  lastRunMode = 1;
  enableTick = LOW;
}
void RollLogo() {
  int  dly1 = 200;
  int  dly2 = 500;
  if (runMode == 1) {  DispOut("    ");  delay(dly1);  DispOut("   A");  delay(dly1);  DispOut("  AS");  delay(dly1);  DispOut(" ASb");  delay(dly1);  DispOut("ASby");  delay(500);  }
  if (runMode == 1) {  DispOut("Sby ");  delay(dly1);  DispOut("by  ");  delay(dly1);  DispOut("y   ");  delay(dly1);  DispOut("    ");  delay(dly2);  }
  if (runMode == 1) {  DispOut("   1");  delay(dly1);  DispOut("  1F");  delay(dly1);  DispOut(" 1F ");  delay(dly2);  }
  if (runMode == 1) {  DispOut("1F  ");  delay(dly1);  DispOut("F   ");  delay(dly1);  DispOut("    ");  delay(dly2);  }
}
void DP12tick(){
  pinDP1state = !pinDP1state;
  pinDP2state = !pinDP2state;
  if (enableTick == HIGH) { digitalWrite(pinDP1, pinDP1state); digitalWrite(pinDP2, pinDP1state);}
  if (enableTick == LOW) { digitalWrite(pinDP1, LOW); digitalWrite(pinDP2, LOW); }
}
int BCDminut1() {
  int BCDsum = 0;
  if (digitalRead(pinBCD11) == LOW) BCDsum = BCDsum + 1;
  if (digitalRead(pinBCD12) == LOW) BCDsum = BCDsum + 2;
  if (digitalRead(pinBCD14) == LOW) BCDsum = BCDsum + 4;
  if (digitalRead(pinBCD18) == LOW) BCDsum = BCDsum + 8;
  return BCDsum;
}
int BCDminut2() {
  int BCDsum = 0;
  if (digitalRead(pinBCD21) == LOW) BCDsum = BCDsum + 1;
  if (digitalRead(pinBCD22) == LOW) BCDsum = BCDsum + 2;
  if (digitalRead(pinBCD24) == LOW) BCDsum = BCDsum + 4;
  if (digitalRead(pinBCD28) == LOW) BCDsum = BCDsum + 8;
  return BCDsum;
}
int BCDhemmap() {
  int BCDsum = 0;
  if (digitalRead(pinBCD31) == LOW) BCDsum = BCDsum + 1;
  if (digitalRead(pinBCD32) == LOW) BCDsum = BCDsum + 2;
  if (digitalRead(pinBCD34) == LOW) BCDsum = BCDsum + 4;
  if (digitalRead(pinBCD38) == LOW) BCDsum = BCDsum + 8;
  return BCDsum;
}
int BCDbortap() {
  int BCDsum = 0;
  if (digitalRead(pinBCD41) == LOW) BCDsum = BCDsum + 1;
  if (digitalRead(pinBCD42) == LOW) BCDsum = BCDsum + 2;
  if (digitalRead(pinBCD44) == LOW) BCDsum = BCDsum + 4;
  if (digitalRead(pinBCD48) == LOW) BCDsum = BCDsum + 8;
  return BCDsum;
}
void intrptBTN1() {
  if ((millis() - lastDebounceTime) > debounceDelay) {
    runMode = 2; //StartFromZero    
  }
      lastDebounceTime = millis();
}
void intrptBTN2() {
  if ((millis() - lastDebounceTime) > debounceDelay) {
    runMode = 3; //StartFromSet
  }
      lastDebounceTime = millis();
}
void intrptBTN3() {
  if ((millis() - lastDebounceTime) > debounceDelay) {
    runMode = 4; //Pause
  }
      lastDebounceTime = millis();
}
void intrptBTN4() {
  if ((millis() - lastDebounceTime) > debounceDelay) {
    runMode = 5; //StopAndZero
  }
      lastDebounceTime = millis();
}
void intrptBTN5() {
  if ((millis() - lastDebounceTime) > debounceDelay) {
    PointCountActive = !PointCountActive;
    digitalWrite(pinLED5, !PointCountActive);
  }
      lastDebounceTime = millis();
}
byte CharMap(char sData) {
  byte rData = 0;
  if (sData == '0') rData = 126;
  if (sData == '1') rData = 12;
  if (sData == '2') rData = 182;
  if (sData == '3') rData = 158;
  if (sData == '4') rData = 204;
  if (sData == '5') rData = 218;
  if (sData == '6') rData = 250;
  if (sData == '7') rData = 14;
  if (sData == '8') rData = 254;
  if (sData == '9') rData = 222;
  if (sData == 'A') rData = 238;
  if (sData == 'b') rData = 248;
  if (sData == 'c') rData = 176;
  if (sData == 'E') rData = 242;
  if (sData == 'F') rData = 226;
  if (sData == 'g') rData = 222;
  if (sData == 'h') rData = 232;
  if (sData == 'L') rData = 112;
  if (sData == 'n') rData = 168;
  if (sData == 'o') rData = 184;
  if (sData == 'P') rData = 230;
  if (sData == 'r') rData = 160;
  if (sData == 'S') rData = 218;
  if (sData == 'U') rData = 124;
  if (sData == 'y') rData = 220;
  return rData;
}
void DispOut(String cData) {
byte bDig = 0;
  digitalWrite(pinRLK, LOW); //Latch
    
    for (int i=3; i >= 0; i--){
      OneChar = cData.charAt(i);
      bDig = CharMap(OneChar);
      Serial.println(bDig);
      shiftOut(pinDAT, pinSLK, MSBFIRST, bDig);
    }
    
  digitalWrite(pinRLK, HIGH); //Latch
}