// Frequency meter source code // © Copyright 2006 Ibrahim Kamal. All Rights Reserved. // www.ikalogic.com #include #include unsigned int temp,calc_del; unsigned char a,b,c,d,e,dcnt; float sample[5]; unsigned char scale = 9; unsigned char dig[4],ord[4],pt[4]; unsigned long f,idl; unsigned char bcd[10]; bit sleep = 0; delay(y){ unsigned int i; for(i=0;i 3){ dcnt = 0; } } } void main (){ setup_interrupts(); P3_4 = 1; P3_7 = 0; P0 = 0; P1 = 1; bcd[0] = 136; bcd[1] = 190; bcd[2] = 196; bcd[3] = 148; bcd[4] = 178; bcd[5] = 145; bcd[6] = 129; bcd[7] = 184; bcd[8] = 128; bcd[9] = 144; ord[0] = 1; ord[1] = 2; ord[2] = 4; ord[3] = 8; dcnt = 0; while(1){ calc_del++; if (calc_del > ((2248/scale))){ // update data calc_del = 0; f = (TL0 + (TH0* 256)); sample[4] = sample[3]; sample[3] = sample[2]; sample[2] = sample[1]; sample[1] = sample[0]; sample[0] = f; TL0 = 0; TH0 = 0; if (TH0 < 10){ if (scale > 9){ scale--; } } // calculate F to display f = floor((sample[0] + sample[1] + sample[2]+ sample[3]+ sample[4])/5)*scale; if (f < 1000){ pt[0] = 128; pt[1] = 0; pt[2] = 0; pt[3] = 0; }else if ((f > 999) & (f < 10000)){ f = f / 1; pt[0] = 128; pt[1] = 0; pt[2] = 0; pt[3] = 0; }else if ((f > 9999) & (f < 100000)){ f = f / 10; pt[0] = 0; pt[1] = 128; pt[2] = 0; pt[3] = 0; }else if ((f > 99999) & (f < 1000000)){ f = f / 100; pt[0] = 0; pt[1] = 0; pt[2] = 128; pt[3] = 0; }else if ((f > 999999)){ f = f / 1000; pt[0] = 0; pt[1] = 0; pt[2] = 0; pt[3] = 128; } int_to_digits(f); //goto sleep or shutdown if (f == 0){ idl++; }else{ idl = 0; sleep = 0; } if (idl > 399){ sleep = 1; P0 = 127; P1 = ord[3-dcnt]; dcnt++; if(dcnt > 3){ dcnt = 0; } } if (idl > 999){ //power down P3_7 = 1; P1 = 0; P0 = 0; PCON = 1; } } } }