#define MAX7219_Data_IN 8
#define MAX7219_Chip_Select 10
#define MAX7219_Clock 9
#define OP_NOOP 0x00
#define OP_DIGIT0 0x01
#define OP_DIGIT1 0x02
#define OP_DIGIT2 0x03
#define OP_DIGIT3 0x04
#define OP_DIGIT4 0x05
#define OP_DIGIT5 0x06
#define OP_DIGIT6 0x07
#define OP_DIGIT7 0x08
#define OP_DECODEMODE 0x09
#define OP_INTENSITY 0x0a
#define OP_SCANLIMIT 0x0b
#define OP_SHUTDOWN 0x0c
#define OP_DISPLAYTEST 0x0f
const int buttonIncrementPin = 2; // Pin untuk tombol increment
const int buttonDecrementPin = 3; // Pin untuk tombol decrement
int count = 0; // Nilai yang akan ditampilkan
void shift(byte send_to_address, byte send_this_data) {
digitalWrite(MAX7219_Chip_Select, LOW);
shiftOut(MAX7219_Data_IN, MAX7219_Clock, MSBFIRST, send_to_address);
shiftOut(MAX7219_Data_IN, MAX7219_Clock, MSBFIRST, send_this_data);
digitalWrite(MAX7219_Chip_Select, HIGH);
}
void setup() {
Serial.begin(115200);
pinMode(MAX7219_Data_IN, OUTPUT);
pinMode(MAX7219_Chip_Select, OUTPUT);
pinMode(MAX7219_Clock, OUTPUT);
pinMode(buttonIncrementPin, INPUT_PULLUP); // Set button pin as input with pull-up
pinMode(buttonDecrementPin, INPUT_PULLUP); // Set button pin as input with pull-up
digitalWrite(MAX7219_Clock, HIGH);
delay(200);
// Setup of MAX7219 chip
shift(OP_DISPLAYTEST, 0x00); // Test mode off
shift(OP_SHUTDOWN, 0x01); // Normal operation
shift(OP_SCANLIMIT, 0x07); // Display digits 0 thru 7
shift(OP_INTENSITY, 0x0f); // Max brightness
shift(OP_DECODEMODE, 0xff); // Decode all digits
}
void loop() {
// Increment count setiap detik
count = (count + 1) % 100; // mengembalikan angka kembali (menghitung urut kembali jika angka berada di 100)
displayNumber(count); // menampilkan angka setelah increment
delay(10);
}
void displayNumber(int number) {
// MEMBAGI UNTUK menjadi ribuan, ratusan, puluhan, dan satuan
int ribuan = (number / 1000) % 10;
int ratusan = (number / 100) % 10;
int puluhan = (number / 10) % 10;
int satuan = number % 10;
shift(OP_DIGIT7, 0x0f);
shift(OP_DIGIT6, 0x0f);
shift(OP_DIGIT5, 0x0f); // 0x0f untuk tidak menampilkan angka ke sevensegment
shift(OP_DIGIT4, 0x0f); // berfungsi untuk mengirim digit ke MAX7219
shift(OP_DIGIT3, ribuan == 0 ? 0x0f : ribuan); // berfungsi menampilkan angka jika kita memasukan 0 maka, berarti tidak ditampilkan
shift(OP_DIGIT2, ribuan == 0 && ratusan == 0 ? 0x0f : ratusan); // menampilkan angka ratusan
shift(OP_DIGIT1, ribuan == 0 && ratusan == 0 && puluhan == 0 ? 0x0f : puluhan); // menampilkan angjka puluhan
shift(OP_DIGIT0, satuan); // menampilkan angka satuan
// berfungsi menampilkan angka tanpa nol di depan
}