*****************************************************************
PIC16F877 ile Dahili EEPROM Uygulaması-1 (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
#use fast_io(e) //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
#use delay (clock=20000000)
//==============================================================================
int8 _10ms=0; // Tam sayı tipinde değişken tanımlanıyor
unsigned int8 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_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(0x0F); // RA0, RA1, RA2, RA3 pinleri giriş
set_tris_e(0x00);
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
lcd_gotoxy(1,1); // İmleç 1.sütun, 1. satırda
printf(lcd_putc,"Sure=%03u.%02d",saniye,_10ms); // Saniye ve milisaniye LCD'ye yazdırılıyor
lcd_gotoxy(1,2); // İmleç 1.sütun, 2. satırda
printf(lcd_putc,"Sonuc=%03u.%02d",read_eeprom(0),read_eeprom(1)); // EEPROM'da saklanan saniye ve milisaniye değerleri LCD'ye yazdırılıyor
while(1)
{
if(input(pin_a3)) // SIFIRLA butonuna basıldı ise
{
saniye=_10ms=0;
write_eeprom(0,saniye); // 0 (0x00) adresine saniye değerini yaz
write_eeprom(1,_10ms); // 1 (0x01) adresine milisaniye değerini yaz
lcd_gotoxy(1,1); // İmleç 1.sütun, 1. satırda
printf(lcd_putc,"Sure=%03u.%02d",saniye,_10ms); // Sıfırlanan süre LCD'ye yazdırılıyor
lcd_gotoxy(1,2); // İmleç 1.sütun, 2. satırda
printf(lcd_putc,"Sonuc=%03u.%02d",saniye,_10ms);// Sıfırlanan kayıtlı süre LCD'ye yazdırılıyor
while(input(pin_a3)); // Butondan el çekilene kadar bekle
}
if(input(pin_a0)) // BAŞLA butonuna basıldı ise
{
while(!input(pin_a2)) // DUR butonuna basılana kadar döngü dönsün
{
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.%02d",saniye,_10ms); // Süre LCD'ye yazdırılıyor
lcd_gotoxy(1,2); // İmleç 1.sütun, 2. satırda
printf(lcd_putc,"Sonuc=%03u.%02d",read_eeprom(0),read_eeprom(1)); // EEPROM'da saklanan saniye ve milisaniye değerleri LCD'ye yazdırılıyor
if (input(pin_a1)) // YAKALA butonuna basılmışsa
{
write_eeprom(0,saniye); // 0 (0x00) adresine saniye değerini yaz
write_eeprom(1,_10ms); // 1 (0x01) adresine milisaniye değerini yaz
lcd_gotoxy(7,2); // İmleç 7.sütun, 2. satırda
printf(lcd_putc,"%03u.%02d",read_eeprom(0),read_eeprom(1)); // LCD'de yakalanan zamanı göster
while(input(pin_a1)); // Butondan elimizi çekene kadar bekle
}
lcd_gotoxy(6,1); // İmleç 6.sütun, 1. satırda
printf(lcd_putc,"%03u.%02d",saniye,_10ms); // Geçen zamanı LCD'de göster
}
disable_interrupts(GLOBAL); // Tüm kesmeleri pasif yap.
}
}}