#include <MD_MAX72xx.h>
#include "font_16x16.h"
const int baris = 4;
const int kolom = 4;
#define MAX_DEVICES (baris * kolom)
const int maxX = kolom * 8;
const int maxY = 8;
#define CLK_PIN 13
#define DATA_PIN 11
#define CS_PIN 10
MD_MAX72XX mx = MD_MAX72XX(MD_MAX72XX::PAROLA_HW, CS_PIN, MAX_DEVICES);
void setup() {
Serial.begin(9600);
mx.begin();
mx.control(MD_MAX72XX::INTENSITY, MAX_INTENSITY / 2);
mx.clear();
}
void loop() {
tampilkanTeks(mx, "HSE@BOARD", 500, 0);
tampilkanTeks(mx, "BARIS@DUA", 500, 2);
delay(50);
}
void tampilkanTeks(MD_MAX72XX &mx, const char *teks, uint16_t interval, uint8_t teksI) {
int16_t offsetX = 0;
int16_t lastOffsetX=0;
bool tampil=true;
uint8_t lastKar = strlen(teks);
int HurufKe;
uint16_t buffer[9];
//mx.clear();
//Serial.print("39. tampil: "); Serial.println(tampil);
unsigned long previousMillis = millis();
while (tampil){
const char *ptr = teks;
lastOffsetX = offsetX;
//Serial.print("43. (w1) lastOffsetX: "); Serial.println(lastOffsetX);
int16_t currentOffsetX;
unsigned long currentMillis = millis(); // Membaca waktu saat ini
uint8_t karI = 0;
//Serial.println(currentMillis - previousMillis);
if (currentMillis - previousMillis > interval){
previousMillis = currentMillis;
mx.clear();
while (karI < lastKar){
HurufKe = ptr[karI]-64;
currentOffsetX = lastOffsetX;
//Serial.print("55. (w1w2) karI: "); Serial.println(karI);
//Serial.print("56. (w1w2) currentOffsetX: "); Serial.println(currentOffsetX);
int16_t posisiKol;
if (currentOffsetX < (maxX+LEBAR_TINGGI[HurufKe][1])) {
for (int i = 0; i < LEBAR_TINGGI[HurufKe][1]; i++) {
//Serial.print("60. (w1w2f1) baca Pola Huruf: "); Serial.println(i);
buffer[i] = pgm_read_word(&POLA_HURUF[HurufKe][i]);
}
uint8_t row = 0;
while (row <LEBAR_TINGGI[HurufKe][1]) {
uint8_t highByteX = (buffer[row] >> 8) & 0xFF; // Ambil 2 digit tinggi
uint8_t lowByteX = buffer[row] & 0xFF; // Ambil 2 digit rendah
int16_t posisiKol = lastOffsetX - row;
currentOffsetX = posisiKol;
//Serial.print("71. (w1w2w3) currentOffsetX: "); Serial.println(currentOffsetX);
if (posisiKol<0){
//Serial.print("73. (w1w2w3ifT) ");Serial.print(ptr[karI]); Serial.print(", LED Off <0 : "); Serial.println(posisiKol);
break;
} else if (posisiKol>=maxX){
//Serial.print("76. (w1w2w3ifEif Next Loop ");Serial.print(ptr[karI]); Serial.print(", LED Off > maxX: "); Serial.println(posisiKol);
// break; Lanjut baris berikutnya (next loop)
} else {
mx.setColumn(((posisiKol/8) + (kolom*teksI)), (posisiKol%8), lowByteX);
mx.setColumn(((posisiKol/8) + (kolom*(teksI+1))), (posisiKol%8), highByteX);
//Serial.print("Terakhir : ");Serial.println((karI==(lastKar-1))&&(row>=(LEBAR_TINGGI[HurufKe][1]-1)));
//Serial.print("82. (w1w2w3ifEifE) ");Serial.print(ptr[karI]);Serial.print(", LED On: "); Serial.println(posisiKol);
if ((karI>=(lastKar-1))&&(row>=LEBAR_TINGGI[HurufKe][1]-1)){
//Serial.print("84. (w1w2w3ifEifE) ");Serial.println("tampil = false");
tampil = false;
}
}
row++;
}
lastOffsetX = currentOffsetX-2;
//Serial.print("91. (w1w2) lastOffsetX: "); Serial.println(lastOffsetX);
if (lastOffsetX<0) {
//Serial.println("92. (w1w2) Break: ");
break;
}
} else {
lastOffsetX = currentOffsetX - LEBAR_TINGGI[HurufKe][1];
}
karI++;
}
offsetX = offsetX+1;
mx.update();
//delay(100);
} else {
//Serial.println(currentMillis - previousMillis);
}
}
}