#include <8051.h>

xdata at 0x6000 unsigned char detik;
xdata at 0x6002 unsigned char menit;
xdata at 0x6004 unsigned char jam;
xdata at 0x600A unsigned char reg_A;
xdata at 0x600B unsigned char reg_B;
xdata at 0x600C unsigned char reg_C;
xdata at 0x600D unsigned char reg_D;
xdata at 0x8000 unsigned char analog[8];
CHAR_out (unsigned char i) {
    TI   = 0;
    SBUF = i;
    while (!TI);
}

BCD_out(unsigned char i, unsigned char j) {
    CHAR_out((i / 16)+0x30);
    CHAR_out((i % 16)+0x30);
    CHAR_out(j);
}

DisplayWaktu () {
    BCD_out(jam,':');     
    BCD_out(menit,':');   
    BCD_out(detik,0x0D);  
}

unsigned char Hex(unsigned char i) {
code char h[16] = "0123456789ABCDEF";
 return h[i];
}


DisplayTegangan (unsigned char i) {
    CHAR_out(':');
    CHAR_out(Hex(i / 16));
    CHAR_out(Hex(i % 16));
    CHAR_out(' ');
}

Init_Serial () {
    SCON = 0x52;    // Mode 1 Ren
    TMOD = 0x20;    // T0 Mode 2, T1 Mode 2
    TH1  = -3;      // 9600 Baudrate
    TR1  = 1;
}

main () {
   char i;
   
   Init_Serial ();

   reg_A = 0x20; // Aktifkan osilator
   reg_B = 0x12; // Update Interrupt aktif, Mode 24 Jam; Output BCD Data

   while (1)  {
      i = reg_C & 0x80;       // Periksa Flag IRQ

      if (i) {                // ada Update Interrupt
      reg_C = reg_C & 0x7F;   // non-aktipkan ada Update Interrupt
      DisplayWaktu();         // Displaykan waktu
}

   for (i=0; i!=8; i++)  {
       analog[i] = 0;
//       while (INT0);

       CHAR_out(i+0x30);
       DisplayTegangan(analog[i]);         // Displaykan
//   }

      }
   }
}

