﻿/*****************************************************************
      PIC16F877 ile Dahili EEPROM Uygulaması (Hafızalı Kronometre)
PIC PROG/DEKA     : Port B jumper'ı LCD konumunda olmalı
******************************************************************/

#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(a) //Port yönlendirme komutları A portu için geçerli

#define use_portb_lcd TRUE   // LCD B portuna bağlı

#include <lcd.c> // LCD.c dosyası programa ekleniyor

int _10ms=0;           // Tam sayı tipinde değişken tanımlanıyor
unsigned int saniye=0; // İşaretsiz tam sayı tipinde değişken tanımlanıyor

//****************** Timer0 Kesmesi *****************************
#int_timer0  // Timer0 kesmesi. Her 10 msn'de bir kesme oluşur.
void  timer0_kesme ()   // Kesme fonksiyonu ismi
{
    set_timer0(217); // TMR0 değeri belirleniyor

    _10ms++;        // _10ms değişkeni değerini 1 arttır
    if (_10ms==100) // _10ms değeri 100 olunca (Geçen süre 1 saniye olunca)
    {
       _10ms=0;    // _10ms değişkenini sıfırla
       saniye++;   // saniye değişkenini bir arttır
       if (saniye==255) // Eğer saniye değişkeni 999 olursa sıfırla
          saniye=0; // saniye değişkenini sıfırla
    }
}

/********* ANA PROGRAM FONKSİYONU********/
void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_a(0x01);   // RA1 pini giriş

   lcd_init();         // LCD kurulumu yapılıyor

   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); // Timer0 ayarları yapılıyor
   set_timer0(217);   // TMR0 değeri belirleniyor

   enable_interrupts(INT_timer0); // int_timer0 kesmesini aktif yapar
   enable_interrupts(GLOBAL);     // Aktif edilen kesmelere izin ver

   lcd_gotoxy(1,1); // İmleç 1.sütun, 1. satırda
   printf(lcd_putc,"Sure=%03u",saniye); // Süre LCD'ye yazdırılıyor
   lcd_gotoxy(1,2); // İmleç 1.sütun, 2. satırda
   printf(lcd_putc,"Sonuc=%03u",read_eeprom(0)); // EEPROM'da saklanan süre LCD'ye yazdırılıyor

   while(1)      // Sonsuz döngü
   {
      if (input(pin_a0))  // RA0 girişindeki butona basılmışsa
      {
         delay_ms(20); // Buton arkını önlemek için
             write_eeprom(0,saniye);  // 0 (0x00) adresine saniye değerini yaz
             lcd_gotoxy(7,2);         // İmleç 7.sütun, 2. satırda
             printf(lcd_putc,"%03u",saniye);  // LCD'ye y değerini gönder
      }

      lcd_gotoxy(6,1);               // İmleç 6.sütun, 1. satırda
      printf(lcd_putc,"%03u",saniye); // Süre LCD'ye yazdırılıyor
      lcd_gotoxy(9,1);               // İmleç 9.sütun, 1. satırda
      printf(lcd_putc,".%02d",_10ms); // msn değerleri LCD'ye yazdırılıyor
   }
}

