// Define pin untuk seven segment display (a hingga g)
const int segmentPins[] = {2, 3, 4, 5, 6, 7, 8};
const int numSegments = 7;

// Define pin untuk mengendalikan digit pada seven segment display
const int digitPins[] = {11, 12, 13, 14};
const int numDigits = 4;

// Tabel segmen untuk menampilkan angka 0 hingga 9
const byte digitTable[] = {
  0b11000000, // 0
  0b11111001, // 1
  0b10100100, // 2
  0b10110000, // 3
  0b10011001, // 4
  0b10010010, // 5
  0b10000010, // 6
  0b11111000, // 7
  0b10000000, // 8
  0b10010000  // 9
};

int number = 0; // Variabel untuk menyimpan angka

const int buttonAPin = 9; // Pin untuk tombol A
const int buttonBPin = 10; // Pin untuk tombol B

void setup() {
  // Set pin untuk seven segment display sebagai output
  for (int i = 0; i < numSegments; i++) {
    pinMode(segmentPins[i], OUTPUT);
  }

  // Set pin untuk mengendalikan digit sebagai output
  for (int i = 0; i < numDigits; i++) {
    pinMode(digitPins[i], OUTPUT);
  }

  // Set pin untuk tombol A dan B sebagai input dengan pull-up resistor
  pinMode(buttonAPin, INPUT_PULLUP);
  pinMode(buttonBPin, INPUT_PULLUP);
}

void loop() {
  // Baca status tombol A dan lakukan aksi sesuai ketentuan
  if (digitalRead(buttonAPin) == LOW) { // Tombol A ditekan
    number++;
    delay(300); // Debounce untuk menghindari pembacaan ganda
  }
  
  // Baca status tombol B dan lakukan aksi sesuai ketentuan
  if (digitalRead(buttonBPin) == LOW) { // Tombol B ditekan
    number--;
    delay(300); // Debounce untuk menghindari pembacaan ganda
  }

  // Batasi angka ke rentang 0 hingga 9
  if (number < 0) {
    number = 0;
  } else if (number > 9) {
    number = 9;
  }

  // Tampilkan angka pada seven segment display
  displayNumber(number);
}

void displayNumber(int num) {
  // Matikan semua digit terlebih dahulu
  for (int i = 0; i < numDigits; i++) {
    digitalWrite(digitPins[i], HIGH);
  }

  // Aktifkan digit yang sesuai
  for (int i = 0; i < numSegments; i++) {
    byte bit = bitRead(digitTable[num], i);
    digitalWrite(segmentPins[i], bit);
  }
  digitalWrite(digitPins[numDigits - 1], LOW);
}