//Pendefinisian Pin
#define A 18
#define B 23
#define C 25
#define D 27
#define E 14
#define F 19
#define G 33
#define DP 26
#define DIG1 5
#define DIG2 21
#define DIG3 22
#define DIG4 32
#define BTN 13
#define DIR 0
#define STEP 4
const uint8_t LEDS[] = {A,B,C,D,E,F,G};
const uint8_t DIGS[] = {DIG1,DIG2,DIG3,DIG4};
//Fungsi ini menyalakan atau mematikan segmen LED untuk menampilkan angka tertentu pada 7-segment display.
void Segment(uint8_t num) {
switch (num)
{
case 0 :
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, LOW);
break;
case 1 :
digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 2 :
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, LOW);
digitalWrite(G, HIGH);
break;
case 3 :
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, HIGH);
break;
case 4 :
digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
break;
case 5 :
digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
break;
case 6 :
digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
break;
case 7 :
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 8 :
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
break;
case 9 :
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
break;
case 10 : //OFF
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
}
}
//Fungsi ini mengontrol digit mana yang akan aktif pada 7-segment display.
void Digits(uint8_t scan){
switch (scan)
{
case 0:
digitalWrite(DIG1,HIGH);
digitalWrite(DIG2,HIGH);
digitalWrite(DIG3,HIGH);
digitalWrite(DIG4,HIGH);
break;
case 1:
digitalWrite(DIG1,LOW);
digitalWrite(DIG2,HIGH);
digitalWrite(DIG3,HIGH);
digitalWrite(DIG4,HIGH);
break;
case 2:
digitalWrite(DIG1,HIGH);
digitalWrite(DIG2,LOW);
digitalWrite(DIG3,HIGH);
digitalWrite(DIG4,HIGH);
break;
case 3:
digitalWrite(DIG1,HIGH);
digitalWrite(DIG2,HIGH);
digitalWrite(DIG3,LOW);
digitalWrite(DIG4,HIGH);
break;
case 4:
digitalWrite(DIG1,HIGH);
digitalWrite(DIG2,HIGH);
digitalWrite(DIG3,HIGH);
digitalWrite(DIG4,LOW);
break;
}
}
uint8_t Display_buffer[] = {0,0,0,0};
void Display(void) {
for (uint8_t n = 0; n < 4; n++) { // Iterasi untuk setiap digit
Segment(10); // Matikan semua segmen
digitalWrite(DP, LOW); // Matikan titik desimal
Digits(n + 1); // Pilih digit
Segment(Display_buffer[n]); // Tampilkan angka pada digit
if (n == 1) // Hidupkan titik desimal di digit kedua
digitalWrite(DP, HIGH);
delay(10); // Tunggu sebentar untuk stabilitas tampilan
}
}
void setup() {
for (uint8_t n = 0; n < 7; n++)
pinMode(LEDS[n], OUTPUT); // Segmen LED menjadi output
for (uint8_t n = 0; n < 4; n++)
pinMode(DIGS[n], OUTPUT); // Digit menjadi output
pinMode(DP, OUTPUT); // Titik desimal menjadi output
pinMode(BTN, INPUT); // Tombol sebagai input
pinMode(DIR, OUTPUT); // Arah motor stepper sebagai output
pinMode(STEP, OUTPUT); // Pulsa motor stepper sebagai output
digitalWrite(DIG1, LOW); // Matikan semua digit
digitalWrite(DIG2, LOW);
digitalWrite(DIG3, LOW);
digitalWrite(DIG4, LOW);
Segment(0); // Mulai dari angka 0
}
const uint16_t Max_step =500;
int16_t step = 500;
void loop() {
if (digitalRead(BTN) == LOW) { // Jika tombol ditekan
if (step > 0) { // Jika langkah masih tersisa
digitalWrite(STEP, HIGH); // Kirim pulsa untuk motor stepper
delay(10);
digitalWrite(STEP, LOW);
step--; // Kurangi langkah
}
} else {
step = Max_step; // Reset langkah ke nilai maksimum jika tombol dilepas
}
// Perbarui buffer untuk ditampilkan
Display_buffer[0] = step / 1000; // Ribuan
Display_buffer[1] = step / 100 % 10; // Ratusan
Display_buffer[2] = step / 10 % 10; // Puluhan
Display_buffer[3] = step % 10; // Satuan
Display(); // Perbarui tampilan
delay(10); // Penundaan untuk stabilitas
}