周波数の測定

#include <16f648a.h>
#fuses INTRC_IO,NOWDT,NOLVP,NOMCLR//内部クロック、WDT,LVPなし
#use delay(CLOCK=4000000) //クロック4MHz
#byte port_a=5 //Aポート番地
#byte port_b=6 //Bポート番地
//b6 計測信号
//b0-b5,b7:7素子接続
//A2,A1,A0:3,2,1桁点灯
//タイマー0割り込み:0.256mS
//nm:測定回数
//ns:休止回数
int mode;
//タイマー0をプリスケーラ、1/64で利用
long nm=61;//1秒 ,1000/(256*64)
long ns=76;//適当な表示間隔
long ins,inm;
int v3,v2,v1;
int digit;
long lcount;
long valt;
//int segment_data[]={0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0xE,0xFE,0xCE};
//intsegment_data[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67};
//b5-b0 f:a,b7:g を利用
int segment_data[]={0x3f,0x06,0x9B,0x8F,0xA6,0xAAD,0xBD,0x07,0xBF,0xA7};
#int_rtcc
void rtcc_isr(){//タイマー0割り込み処理
if(mode == 0){//display
ins--;
if(ins == 0){
inm = nm;
mode = 1;
set_timer1(0);
output_bit(PIN_A3,0);
}
}
else {//count
inm--;
if(inm == 0){
//getcount
lcount=get_timer1();
v3 = lcount/100;//3桁目
valt = lcount % 100;
v2 = valt / 10;//2桁目
v1 = valt % 10;//1桁目
mode=0;
output_bit(PIN_A3,1);
ins=ns;
}
}
}
void main(){
set_tris_a(0xf0);//Aポート4bit出力(桁指定)
set_tris_b(0x40);//Bポート下位7bit出力(7素子)
mode = 1;
inm = nm;
setup_counters(RTCC_INTERNAL , RTCC_DIV_64);//タイマー0設定
setup_timer_1(T1_EXTERNAL_SYNC | T1_DIV_BY_1);//タイマー1設定
enable_interrupts(INT_TIMER0);//タイマー0割り込み許可
enable_interrupts(GLOBAL);//割り込み機能許可
lcount = 0;//表示する値
v3=v2=v1=0;
digit = 1;//桁数
while(1){
if(digit== 3){//第3桁の表示
port_b = segment_data[v3];
output_bit(PIN_A2,1);//3桁表示開始
delay_ms (5); //表示期間(ミリ秒)
output_bit(PIN_A2,0);//表示を消す
delay_us(5);
}
if(digit== 2){
port_b = segment_data[v2];
output_bit(PIN_A1,1);
delay_ms (5);
output_bit(PIN_A1,0);
delay_us(5);
}
if(digit == 1){
port_b = segment_data[v1];
output_bit(PIN_A0,1);
delay_ms (5);
output_bit(PIN_A0,0);
delay_us(5);
}
digit ++;//表示桁を変更
if(digit ==4 ) digit=1;
}
}