#include #include __CONFIG(WDTDIS&PWRTEN&LVPDIS&XT); unsigned char kontrol; //--------------------------------------------- // CCP1 kesme alt programı //--------------------------------------------- void interrupt kesme(void){ TMR1H=0; TMR1L=0; // TMR1 içeriğini sıfırla GIE=0; // yeni kesme gelmesini engelle kontrol=1; CCP1IF=0; // yeni kesmeler için bayrağı sıfırla GIE=1; // bütün kesmelere izin ver } //--------------------------------------------- // ANA PROGRAM //--------------------------------------------- main(void) { unsigned const char rakam[10]={0x3F,0x06,0x5B, 0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; unsigned char secme[4]={1,2,4,8}; unsigned int sayac,deger,kalan1,kalan2; float frekans; unsigned char a,i,display[5],veri; TRISA=0x00; // PORTA'nın hepsi çıkış TRISB=0x08; // RB3/CCP1 ucu giriş CMCON=0x07; // PORTA sayısal giriş kontrol=0; PORTA=0; PORTB=0; // başlangıç durumu ayarları CCP1IE=1; // CCP1 kesmesine izin ver (PIE1,2) // Her 4. yükselen kenarda yakalama modu CCP1CON=0b00000110; // TMR1 dahili saat fosc/4 ve ön bölücü 1:4 T1CON=0b00100001; // TMR1 çalışmaya başlar GIE=1; // bütün kesmelere izin ver PEIE=1; // çevresel kesmelere izin ver for(;;){ // 16 bitlik CCPR1 değerini hesapla sayac=256*CCPR1H+CCPR1L; // Kesme oluşmadıysa kontrol=0'dır. if(kontrol==1)frekans=100000000/sayac; if(kontrol==0)frekans=0; // 100Hz'in üzerini ölçme if(sayac<10000)frekans=0; kontrol=0; // 300ms boyunca aynı değeri göster for(a=0;a<25;a++){ deger=(int)frekans; display[1]=deger/1000; kalan1=deger-display[1]*1000; display[2]=kalan1/100; kalan2=kalan1-display[2]*100; display[3]=kalan2/10; display[4]=kalan2-display[3]*10; // 3ms arayla display'leri tara for(i=0;i<4;i++){ PORTB=0; PORTA=0; veri=rakam[display[i+1]]; PORTB=veri&0x07; veri=veri<<1; PORTB=PORTB|(veri&0xF0); PORTA=secme[i]; DelayMs(3); } } } // Sonsuz döngü } // Program sonu