/*
program arduino simulasi proteus
project: arduino 7 segment sore board
board: arduino uno/nano, 74HC595 shift register, 7 segment CA
*/
#include "Wire.h"
#define DATA 11
#define CLK 12
#define LATCH 8
#define S1_UP 5
#define S1_DOWN 6
#define S2_UP 7
#define S2_DOWN 4
#define S_SHIFT 9
#define S_RESET 10
#define LED 13
//konfigurasi segment dengan hex / biner 8 bit = https://www.electrical4u.com/images/march16/1460385570.PNG
byte segment[10]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x7, 0x7F, 0x6F};
byte ani_char[8]= {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x01,0x40};
int skor1_d1=0; //satuan
int skor1_d2=0; //puluhan
int skor2_d1=0; //satuan
int skor2_d2=0; //puluhan
int stat_blink=0;
void setup(){
pinMode(S1_UP, INPUT);
pinMode(S1_DOWN, INPUT);
pinMode(S2_UP, INPUT);
pinMode(S2_DOWN, INPUT);
pinMode(S_SHIFT, INPUT);
pinMode(S_RESET, INPUT);
pinMode(LATCH, OUTPUT);
pinMode(CLK, OUTPUT);
pinMode(DATA, OUTPUT);
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
// opening animation
int i = 0;
while(i<8){
i++;
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLK, MSBFIRST, ~ani_char[i]);
shiftOut(DATA, CLK, MSBFIRST, ~ani_char[i]);
shiftOut(DATA, CLK, MSBFIRST, ~ani_char[i]);
shiftOut(DATA, CLK, MSBFIRST, ~ani_char[i]);
digitalWrite(LATCH, HIGH);
delay(200);
}
digitalWrite(LED, HIGH);delay(200);digitalWrite(LED, LOW);delay(200);
digitalWrite(LED, HIGH);delay(200);digitalWrite(LED, LOW);delay(200);
digitalWrite(LED, HIGH);delay(200);digitalWrite(LED, LOW);delay(200);
digitalWrite(LED, HIGH);
}
void loop(){
//display 1 counter UP
if(digitalRead(S1_UP)== HIGH){
skor1_d1++;
if(skor1_d1>9){
skor1_d1 = 0;
skor1_d2++;
if(skor1_d2>9){
skor1_d2 = 0;
}
}
}
//display 1 counter DOWN
else if(digitalRead(S1_DOWN)== HIGH){
skor1_d1--;
if(skor1_d1<0){
skor1_d1 = 9;
skor1_d2--;
if(skor1_d2<0){
skor1_d2 = 9;
}
}
}
//display 2 counter UP
else if(digitalRead(S2_UP)== HIGH){
skor2_d1++;
if(skor2_d1>9){
skor2_d1 = 0;
skor2_d2++;
if(skor2_d2>9){
skor2_d2 = 0;
}
}
}
//display 2 counter UP
else if(digitalRead(S2_DOWN)== HIGH){
skor2_d1--;
if(skor2_d1<0){
skor2_d1 = 9;
skor2_d2--;
if(skor2_d2<0){
skor2_d2 = 9;
}
}
}
else if(digitalRead(S_SHIFT)== HIGH){
stat_blink =1;
int tmp_skor1, tmp_skor2;
tmp_skor1 = skor1_d1;
tmp_skor2 = skor1_d2;
skor1_d1 = skor2_d1;
skor1_d2 = skor2_d2;
skor2_d1 = tmp_skor1;
skor2_d2 = tmp_skor2;
}
else if(digitalRead(S_RESET)== HIGH){
stat_blink =1;
skor1_d1 = 0;
skor1_d2 = 0;
skor2_d1 = 0;
skor2_d2 = 0;
}
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLK, MSBFIRST, ~segment[skor1_d1]); // display 1 digit satuan
shiftOut(DATA, CLK, MSBFIRST, ~segment[skor1_d2]); // display 1 digit puluhan
shiftOut(DATA, CLK, MSBFIRST, ~segment[skor2_d1]); // display 2 digit satuan
shiftOut(DATA, CLK, MSBFIRST, ~segment[skor2_d2]); // display 2 digit puluhan
digitalWrite(LATCH, HIGH);
if(stat_blink == 1){
led_blink(2); //led blink 2 kali
stat_blink =0;
}
delay(50); //delay dalam simulasi-sesuaikan apabila terlalu tombol responsive
}
void led_blink(int blink_times){
int x = 0;
while (x <= blink_times){
x++;
digitalWrite(LED, HIGH);delay(200);digitalWrite(LED, LOW);delay(200);
}
digitalWrite(LED, HIGH);
}