#include <LiquidCrystal_I2C.h>
#include <Wire.h>

#define pinLed1 12
#define pinLed2 11
#define pinLed3 10
#define pinLed4 9
#define pinButton1 8
#define pinButton2 7
#define pinClock 6
#define pinData 5
#define pinLatch 4
#define pinClockLed 3
#define pinDataLed 2
#define pinLatchLed 13

//Fungsi Macro -----------------------------------------
#define led1(x) digitalWrite(pinLed1, x)
#define led2(x) digitalWrite(pinLed2, x)
#define led3(x) digitalWrite(pinLed3, x)
#define led4(x) digitalWrite(pinLed4, x)

#define clockSeg(x) digitalWrite(pinClock, x)
#define dataSeg(x) digitalWrite(pinData, x)
#define latchSeg(x) digitalWrite(pinLatch, x)

#define clockLed(x) digitalWrite(pinClockLed, x)
#define dataLed(x) digitalWrite(pinDataLed, x)
#define latchLed(x) digitalWrite(pinLatchLed, x)

#define button1 digitalRead(pinButton1)
#define button2 digitalRead(pinButton2)
//------------------------------------------------------

//Set alamat I2C dan ukuran LCD
LiquidCrystal_I2C lcd(0x27,16,2);

//variabel bilangan bulat
uint8_t dataButton1 = 0;
uint8_t dataButton2 = 0;
uint8_t k1 = 0;
uint8_t k2 = 0;
uint8_t menu = 0;
uint8_t counter = 0; //uint (unsigned integer) 0 -255
int8_t counter2 = 0; //
uint8_t dataDummy = 0; //int (interger) -127 - 127
uint8_t logicButton2 = 0;
//variabel array
uint8_t arraySegment[10] = {
  0b00000011, //0
  0b10011111, //1
  0b00100101, //2
  0b00001101, //3
  0b10011001, //4
  0b01001001, //5
  0b01000001, //6
  0b00011111, //7
  0b00000001, //8
  0b00001001 //9
};
int8_t counterDwn = 0;
int8_t counterUp = 0;
int8_t runningKr = 0;
int8_t runningKn = 0;

void setup(){
  pinMode(pinLed1, OUTPUT);
  pinMode(pinLed2, OUTPUT);
  pinMode(pinLed3, OUTPUT);
  pinMode(pinLed4, OUTPUT);
  pinMode(pinButton1, INPUT);
  pinMode(pinButton2, INPUT);
  pinMode(pinClock, OUTPUT);
  pinMode(pinData, OUTPUT);
  pinMode(pinLatch, OUTPUT);
  pinMode(pinClockLed, OUTPUT);
  pinMode(pinDataLed, OUTPUT);
  pinMode(pinLatchLed, OUTPUT);
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("LKS");
  lcd.setCursor(0,1);
  lcd.print("ELETRONICS");
  led1(1);
  delay(1000);
  led1(0);
  delay(3000);
  lcd.clear();
}

void loop(){
  dataButton1 = digitalRead(pinButton1);
  dataButton2 = digitalRead(pinButton2);
  //button 1
  if(dataButton1 == 1 && k1 == 0){
    k1 = 1;
  };
  if(dataButton1 == 0 && k1 == 1){
    menu++;
    if(menu > 4){
      menu = 1;
    }
    k1 =0;
  };
  //button 2
  if(dataButton2 == 0 && k2 == 0){
    k2 = 1;
  };
  if(dataButton2 == 1 && k2 == 1){
    logicButton2 = 1;
    k2 =0;
  };

  switch(menu){
    case 1:
      menu1();
    break;
    case 2:
      menu2();
    break;
    case 3:
      menu3();
    break;
    case 4:
      menu4();
    break;
    default:
      lcd.setCursor(0,0);
      lcd.print("Tekan Button 1  ");
      lcd.setCursor(0,1);
      lcd.print("Untuk Pilih Menu");
    break;
  };
}

void shiftRegSeg(uint8_t dataSeg){
  for(uint8_t i=0; i<8; i++){
    digitalWrite(pinData, (arraySegment[dataSeg] >> i)&1);
    digitalWrite(pinClock, 0);
    digitalWrite(pinClock, 1);
  }
  digitalWrite(pinLatch, 0);
  digitalWrite(pinLatch, 1);
}

void shiftRegLed(uint8_t dataLed){
  for(uint8_t i=0; i<8; i++){
    digitalWrite(pinDataLed, ((1 << (8 - dataLed)) >> i)&1);
    digitalWrite(pinClockLed, 0);
    digitalWrite(pinClockLed, 1);
  }
  digitalWrite(pinLatchLed, 0);
  digitalWrite(pinLatchLed, 1);
}

void menu1(){
      lcd.setCursor(0,0);
      lcd.print("Menu Selector : ");
      lcd.setCursor(0,1);
      lcd.print("Menu - 1        ");
      while(logicButton2 == 1){
        lcd.setCursor(0,0);
        lcd.print("Menu - 1        ");
        lcd.setCursor(0,1);
        lcd.print("Running LED Kn  ");
        digitalWrite(pinLed1, 1);
        runningKn++;
        if(runningKn > 8){
          runningKn = 1;
        };
        shiftRegLed(runningKn);
        shiftRegSeg(runningKn);
        delay(500);
      };
}

void menu2(){
      lcd.setCursor(0,0);
      lcd.print("Menu Selector : ");
      lcd.setCursor(0,1);
      lcd.print("Menu - 2        ");
      while(logicButton2 == 1){
        lcd.setCursor(0,0);
        lcd.print("Menu - 2        ");
        lcd.setCursor(0,1);
        lcd.print("Running LED Kr  ");
        digitalWrite(pinLed2, 1);
        runningKr--;
        if(runningKr < 1){
          runningKr = 8;
        };
        shiftRegLed(runningKr);
        shiftRegSeg(runningKr);
        delay(500);
      };
}

void menu3(){
      lcd.setCursor(0,0);
      lcd.print("Menu Selector : ");
      lcd.setCursor(0,1);
      lcd.print("Menu - 3        ");
      while(logicButton2 == 1){
        lcd.setCursor(0,0);
        lcd.print("Menu - 3        ");
        lcd.setCursor(0,1);
        lcd.print("Counter UP : ");
        dataButton1 = digitalRead(pinButton1);
        digitalWrite(pinLed3, 1);
        if(dataButton1 == 1 && k1 == 0){
          k1 = 1;
        };
        if(dataButton1 == 0 && k1 == 1){
          counterUp++;
          if(counterUp > 8){
            counterUp = 0;
          };
          k1 =0;
        };
        lcd.setCursor(13,1);
        lcd.print(counterUp);
        shiftRegLed(counterUp);
        shiftRegSeg(counterUp);
      };
}

void menu4(){
      lcd.setCursor(0,0);
      lcd.print("Menu Selector : ");
      lcd.setCursor(0,1);
      lcd.print("Menu - 4        ");
      while(logicButton2 == 1){
        lcd.setCursor(0,0);
        lcd.print("Menu - 4        ");
        lcd.setCursor(0,1);
        lcd.print("Counter Dwn : ");
        dataButton1 = digitalRead(pinButton1);
        digitalWrite(pinLed4, 1);
        if(dataButton1 == 1 && k1 == 0){
          k1 = 1;
        };
        if(dataButton1 == 0 && k1 == 1){
          counterDwn--;
          if(counterDwn < 1){
            counterDwn = 8;
          };
          k1 =0;
        };
        lcd.setCursor(14,1);
        lcd.print(counterDwn);
        shiftRegLed(counterDwn);
        shiftRegSeg(counterDwn);
      };
}
nano:12
nano:11
nano:10
nano:9
nano:8
nano:7
nano:6
nano:5
nano:4
nano:3
nano:2
nano:GND.2
nano:RESET.2
nano:0
nano:1
nano:13
nano:3.3V
nano:AREF
nano:A0
nano:A1
nano:A2
nano:A3
nano:A4
nano:A5
nano:A6
nano:A7
nano:5V
nano:RESET
nano:GND.1
nano:VIN
nano:12.2
nano:5V.2
nano:13.2
nano:11.2
nano:RESET.3
nano:GND.3
led1:A
led1:C
led2:A
led2:C
led3:A
led3:C
led4:A
led4:C
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
r1:1
r1:2
r2:1
r2:2
pot1:GND
pot1:SIG
pot1:VCC
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
74HC595
sr1:Q1
sr1:Q2
sr1:Q3
sr1:Q4
sr1:Q5
sr1:Q6
sr1:Q7
sr1:GND
sr1:Q7S
sr1:MR
sr1:SHCP
sr1:STCP
sr1:OE
sr1:DS
sr1:Q0
sr1:VCC
sevseg1:COM.1
sevseg1:COM.2
sevseg1:A
sevseg1:B
sevseg1:C
sevseg1:D
sevseg1:E
sevseg1:F
sevseg1:G
sevseg1:DP
74HC595
sr2:Q1
sr2:Q2
sr2:Q3
sr2:Q4
sr2:Q5
sr2:Q6
sr2:Q7
sr2:GND
sr2:Q7S
sr2:MR
sr2:SHCP
sr2:STCP
sr2:OE
sr2:DS
sr2:Q0
sr2:VCC
led5:A
led5:C
led6:A
led6:C
led7:A
led7:C
led8:A
led8:C
led9:A
led9:C
led10:A
led10:C
led11:A
led11:C
led12:A
led12:C