Jam digital dengan P16F84A MCU

  /* Program jam digital untuk MCU p16f84a
  Digital clock program for p16f84a MCU
  oleh : Hartono , www.gemar-elektronika.com
  April 2012
  Compiler Micro C for PIC
  by Mikroelektronika, www.mikroe.com
  please don't delete this comment
  jangan hapus komemtar ini */
 
 long int num;
 const long int menit = 60000000; //banyaknya siklus dalam 1 menit (xtal 4Mhz)
 const long int timer_ovr = 0x00010000; //banyaknya siklus timer
 char cacah;
 char h0 = 0; //satuan jam
 char h1 = 0; //puluhan jam
 char m0 = 0; //satuan menit
 char m1 = 0; //puluhan menit
 char over_flow;
 const char led[10] = {0x08, 0x3e, 0x11, 0x14, 0x26, 0x44, 0x40, 0x1e,

0x00, 0x04};

 //rutin untuk menunda waktu sebesar 5ms
 void tunda(void){
    Delay_ms(5);
 }

  //rutin untuk menambah menit
 void inc_minute(void){
   m0++ ; over_flow = 0;
   if (m0 == 10){
     m0 = 0;
     m1++ ;
     if (m1 == 6)
       {m1 = 0; over_flow = 1;}
   }
 }

  //rutin untuk menambah jam
  void inc_hour(void){
    h0++ ;
    if (h0==10){h0 = 0; h1++ ;}
    if (h0==4 && h1 == 2){h0 = 0; h1 = 0;}
  }

  //rutin untuk multiplex 7 segment
  void display(void){
    PORTA = 0b11111111;
    PORTB = led[m0];
    PORTA = 0b11111110;
    tunda();
 
    PORTA = 0b11111111;
    PORTB = led[m1];
    PORTA = 0b11111101;
    tunda();
 
    PORTA = 0b11111111;
    PORTB = led[h0];
    PORTA = 0b11111011;
    tunda();

    PORTA = 0b11111111;
    PORTB = led[h1];
    PORTA = 0b11110111;
    tunda();
  }

  // rutin layanan interrupt
   void interrupt(void){
     INTCON.T0IF = 0;
     num -= timer_ovr;
     if (num < 0){
       num += menit;
       inc_minute();
       if (over_flow) inc_hour();
     }
  }

  /* -----------ini adalah program utama---------------------- */
  void main(void) {
    //mengatur arah data pada port
    TRISB = 0b10000000;
    TRISA = 0b10000;
    //mengatur timer0
    OPTION_REG = 0b11010111;
 
    //memampukan interrupt timer
    INTCON.GIE = 1;
    INTCON.T0IE = 1;
 
    num = menit;
    while (1){
      for (cacah = 0; cacah < 25; cacah++){
         display();
      }

      if (PORTB.RB7 == 0)  //periksa apakah tombol menit ditekan
        {inc_minute(); num = menit;}
      if (PORTA.RA4 == 0) //periksa apalah tombol jam ditekan
        {inc_hour(); num = menit;}
    }
 }


Tidak ada komentar:

Posting Komentar