double x = 12.3456;
#define DISPLAY_DATA 25
#define DISPLAY_CLK 26
#define DISPLAT_LATCH 27
#define DISPLAY_DIGIT 6
#define KARAKTER_POSITIF {95,18,47,58,114,120,125,19,255,123,223,146,175,186,242,248,253,147,511,251}
#define KARAKTER_NEGATIF {160,238,208,196,142,133,129,236,128,132,32,110,80,68,14,5,1,108,0,4,255}
int display_buffer1[DISPLAY_DIGIT] = {20,20,20,20,20,20};
int display_buffer2[DISPLAY_DIGIT] = {20,20,20,20,20,20};
int display_buffer3[DISPLAY_DIGIT] = {20,20,20,20,20,20};
int karakter[21]=KARAKTER_NEGATIF;
int p[8]={128,64,32,16,8,4,2,1};
long lastrun = 0;
int harga_total = 0;
double liter = 0;
int harga = 10500;
void write_display(double total_liter = 0, unsigned int total_harga = 0, unsigned int harga = 0){
// pecah total harga
int a = 0;
int pembagi = 1;
unsigned int prima = int(total_liter);
unsigned int koma = int(100*(total_liter - prima));
Serial.print("Bilangan prima = ");
Serial.println(prima);
Serial.print("Bilangan koma = ");
Serial.println(koma);
// display_buffer1[0] = total_harga % 10;
while((a < DISPLAY_DIGIT)&&(pembagi< pow(10,DISPLAY_DIGIT))){
// untuk memecah bilangan float menjadi array
if(a<2){
display_buffer2[a] = (koma / pembagi) % 10;
}
else if(a == 2){
// untuk bilangan yang pakai titik ditambah 10 untuk representasi titik
if(pembagi <= prima){
display_buffer2[a] = (((prima*100)/pembagi) % 10)+10;
}
}
else{
if(pembagi >= prima){
display_buffer2[a] = ((prima*100)/pembagi) % 10;
}
}
if(pembagi <= total_harga){
display_buffer1[a] = (total_harga / pembagi) % 10;
}
if(pembagi <= harga){
display_buffer3[a] = (harga / pembagi) % 10;
}
a++;
pembagi = pembagi * 10;
}
// print hasil untuk debug
Serial.print("Total harga = ");
for(int b = DISPLAY_DIGIT - 1; b >= 0 ; b --){
Serial.print(display_buffer1[b]);
Serial.print(" ");
}
Serial.println();
Serial.print("Total liter = ");
for(int b = DISPLAY_DIGIT - 1; b >= 0 ; b --){
Serial.print(display_buffer2[b]);
Serial.print(" ");
}
Serial.println();
Serial.print("Harga = ");
for(int b = DISPLAY_DIGIT - 1; b >= 0 ; b --){
Serial.print(display_buffer3[b]);
Serial.print(" ");
}
Serial.println();
}
void display_run(){
int i = 0;
int a = DISPLAY_DIGIT-1;
while(i < DISPLAY_DIGIT)
{
digitalWrite(DISPLAT_LATCH, LOW);
shiftOut(DISPLAY_DATA, DISPLAY_CLK, LSBFIRST,p[i]);//first digit
shiftOut(DISPLAY_DATA, DISPLAY_CLK, LSBFIRST,karakter[display_buffer3[i]]);
shiftOut(DISPLAY_DATA, DISPLAY_CLK, LSBFIRST,karakter[display_buffer2[i]]);
shiftOut(DISPLAY_DATA, DISPLAY_CLK, LSBFIRST,karakter[display_buffer1[i]]);
// shiftOut(DISPLAY_DATA, DISPLAY_CLK, LSBFIRST,254);
//
// shiftOut(DISPLAY_DATA, DISPLAY_CLK, LSBFIRST,254);
// shiftOut(DISPLAY_DATA, DISPLAY_CLK, LSBFIRST,254);
// shiftOut(DISPLAY_DATA, DISPLAY_CLK, LSBFIRST,0);
digitalWrite(DISPLAT_LATCH, HIGH);
i++;
a--;
}
}
// -----------------------------------------------------------------------------
void setup (void)
{
Serial.begin(115200);
pinMode(DISPLAY_DATA, OUTPUT);
pinMode(DISPLAY_CLK, OUTPUT);
pinMode(DISPLAT_LATCH, OUTPUT);
Serial.println("TESTING ");
Serial.println(DISPLAY_DIGIT);
}
// -----------------------------------------------------------------------------
void loop (void)
{
if(millis()-lastrun >= 100){
liter = liter + 0.001;
harga_total = liter * harga;
write_display(liter,harga_total, harga);
lastrun = millis();
}
display_run();
}