周波数カウンタをPIC16Fを用いて製作しました。周波数カウンタのゲート時間や、カウントなどは全て、PIC16Fの周辺機能であるTimerを利用してハードウエアだけで計測を行っていますので、正確な測定ができていると考えています。PICソフトウエアは、Timerなどの周辺機能の設定や表示などを行っています。
カウンタの機能として、1秒または10秒のゲートを有するダイレクトカウントと、低い周波数の計測で行われるレシプロカウント(入力波形の周期を測定し、その逆数から周波数を求める方式)方式で周波数を表示します。
最も基本的な周波数カウンタです。

本カウンタは、以前PLDを使用して、ハードウエアで構成していましたが、PICの高性能化に伴い、コントローラ部をPIC16Fで作り変えました(表示部はそのままです)

仕様

  • 測定周波数 0.0029802Hz ~ 16.666666MHz(min) 
  • 測定レベル 5Vop以下
  • 測定モード1 オートモード   周波数3kHz以上の時:測定モード2/周波数3kHz以下の時:測定モード4(表示が異なる)
  • 測定モード2 マニュアルモード ゲート時間1Sec ダイレクトカウント  
  • 測定モード3 マニュアルモード ゲート時間10Sec ダイレクトカウント         
  • 測定モード4 マニュアルモード レシプロカウント
  • 電源電圧   100V          
  • 外形寸法
  • 注1)オートモード/マニュアルモードの切り替えは上キースイッチ押下で行う
  • 注2)測定モード2/3/4の切り替えは下キースイッチ押下で行う 

操作

1)電源パワーON時 測定モードはオートモードでゲート時間1Sec ダイレクトカウントに設定される。

2)下の写真のように、周波数カウンタのの右上のキーを押すと、「AUTO(オートモード)」と「SELECT(マニュアルモード)」が交互に選択できる。
オートモードは、基本的なモードで 測定周波数が3kHzよりも高い場合は、測定モード2(ゲート時間1Sec ダイレクトカウント)、測定周波数が3kHzよりも低い場合は、測定モード4(レシプロカウント)で測定します。モードの切り替えは自動で行われます。

3)マニュアルモードは、周波数カウンタのの右下のキーを押すと、測定モード2の「ゲート時間1Sec ダイレクトカウント」と測定モード3の「ゲート時間10Sec ダイレクトカウント」と測定モード4の「レシプロカウント」が順繰りに選択できる。切り替えのタイミングは、測定時間が終了後切り替わります。これより「ゲート時間1Sec ダイレクトカウント」では1秒以内、「ゲート時間10Sec ダイレクトカウント」では10秒以内、「レシプロカウント」では高速に切り替わります。
各モードの測定時間を周波数カウンタの左上の緑丸で表します。
測定モード2の「ゲート時間1Sec ダイレクトカウント」は、高い周波数の測定に向いた測定モードです。周波数カウンタ右上の測定時間の緑丸は約0.5秒:点灯、約0.5秒:消灯します。
測定モード3の「ゲート時間10Sec ダイレクトカウント」は、高精度の周波数の測定に向いた測定モードで、測定に10秒かかります。周波数カウンタ右上の測定時間の緑丸は約5秒:点灯、約5秒:消灯します。
測定モード4の「レシプロカウント」は、低い周波数の測定に向いた測定モードです。3kHz以下が最適です。周波数カウンタ右上の測定時間の緑丸は測定周波数の周期で決定し、高い周波数では、連続点灯になり、低い周波数になるにつれ点灯/消灯が繰り返さる時間が長くなります。また、3kHz以上の周波数を測定すると、測定周波数の周期時間が短くなり、コントロールCPUの処理時間が不足し、測定がロックすることがあります。この時は、電源OFF-ONを行い、再起動をしてください。

上記 各モードのキースイッチによる変更は、押下するタイミングによって、上記表示が見えない場合があります。

上のにカウンタのブロック図を示します。
超高精度クリスタルモジュール(データーシート参照)の12.8MHzをPIC16F18857の周辺モジュールであるTimer0を使用し、入力をFosc/4(12.8MHz/4=3.2MHz)とし、プリスケーラで128分周される(3.2MHz/128=25kHz),次にTimer0で125分周する(25kHz/125=200Hz),ポストスケーラで1分周する(200Hz/1=200Hz),Timer0の出力TMR0(18ピン)に出力される際にDフリップフロップで2分周され100Hzが出力される。
この100HzをTimer4の入力T4IN(18ピン)に入力する。Timer4とPWM7を使用し100:1のPWMを構成し、100の部分がカウンタのケート信号となり100Hzの入力が100個で1Hz(1Sec)のゲート時間となります。1の部分100Hz(10mSec)は、表示のための時間として使用します。
ゲート時間10Secの場合は、Timer0のポストスケーラで10分周する(200Hz/10=20Hz),Timer0の出力TMR0(18ピン)に出力される際にDフリップフロップで2分周され10Hzが出力される。

ダイレクトカウント(1Secまたは10Secのケート時間にパルス数を計測する方法)の、入力信号はT1CKI(14ピン)に入力し、ゲート信号はPWM7が選択され1Secまたは10Secとなる。ゲートを通過した入力信号はTimer1とTimer3でカウントする。またゲート信号(PWM7出力信号)の立下り(ゲート信号の後端)で割り込みが発生するので、Timer1とTimer3の値が、入力信号の周波数を示す。

レシプロカウント(入力信号の周期時間をゲート信号として、12.8MHz水晶をクロックとして計測する方法)は、入力信号をゲート信号T1G(13ピン)とし、クロック信号は、12.8MHzの水晶発振器とする。12.8MHzのクロックは、入力信号の周期時間カウントし、周期の後端で割り込みが発生するので、Timer1とTimer3の値を読み、12.8MHzの周期78.125nSecから (78.125nSec)×(Timer1とTimer3のカウント値)=入力信号の周期となる。この周期の逆数をとると周波数が求まる。

最大測定周波数は、ダイレクトカウント ゲート時間1Secで、Timer1とTimer3がフルカウント(2^32=4294967296=4.29GHz)であるが、Timer1の最大入力周波数は、PIC16F18857のデーターシートから非同期での最小周期は60nSecから、最大入力周波数は1/60nSec=16.7MHzとなる。この値は、データーシートの最小値から実力はもう少し高い周波数まで測定可能と思われる。
最小測定周波数は、レシプロカウントでTimer1とTimer3がフルカウント時の周期(4294967296×78.125nSec=335.5Sec)の逆数から0.0029802Hzとなる。

回路図

Frequency_counter_LED

上記回路図で、BNCコネクタからの入力信号は、74HCU04を介してPIC16F18857のT1CKI(14pin) とT1G(13pin)に入力する。74HCU04で入力信号の増幅と、過大入力信号の保護を兼ねている。
PIC16F18857でカウントした入力信号の周波数は、8桁のLEDのダイナミック点灯方式で、周波数を表示する。
表示周波数に応じて、[MHz],[kHz],[Hz]の単位の表示と、ゲート時間の表示(1Sec,10Sec,入力信号の周期)を行う。

回路図の中のP6の6ピンコネクタは、PICのプログラムを書き込むPICkitを接続するコネクタです。JP1は、通常時はショートピンを接続し、PICkitでプログラムする際には、ショートピンを外してください。

データーシート

製作

ソフトウエア

下記に本周波数カウンタのソースコードをのせます。また、ソースリストの最後には、ソースリストを含むソフトウエア全体のダウンロードが可能ですので、興味ある方は、ご利用ください。ソフトウエアは「GPSを利用した高精度周波数カウンタ」と表示部分、水晶のキャリブレーションを除いて、同じですので「GPSを利用した高精度周波数カウンタ」も参照してください。本ソフトウエアは、品質を保証するものではありませんので、バグなどが含まれている可能性があります。

/* --- frequency_counter_LED ---
 * File:   main.c
 * Author: masan
 * PIC16F18857
 * Created on 2020/08/16, 16:19
 */


//********************* ハードウエア情報(PIC16F18857) ****************************
//  RA0(2)  OUTPUT  7segment_LED dp  
//  RA1(3)  OUTPUT  7segment_LED g   
//  RA2(4)  OUTPUT  7segment_LED f  
//  RA3(5)  OUTPUT  7segment_LED e
//  RA4(6)  OUTPUT  7segment_LED d
//  RA5(7)  OUTPUT  7segment_LED c
//  RA6(10) OUTPUT  7segment_LED b
//  RA7(9)  INPUT   外部クロック入力(12.8MHz)  
//  
//  RB0(21) OUTPUT  7segment_LED digit0 
//  RB1(22) OUTPUT  7segment_LED digit1
//  RB2(23) OUTPUT  7segment_LED digit2
//  RB3(24) INPUT   switch_up
//  RB4(25) INPUT   switch_down  
//  RB5(26) OUTPUT  未使用   
//  RB6(27) INPUT   ICPSCLK
//  RB7(28) INPUT   ICSPDAT
//
//  RC0(11) OUTPUT  7segment_LED a
//  RC1(12) OUTPUT  display MHz
//  RC2(13) INPUT   T3G(入力信号)
//  RC3(14) INPUT   T3CKI(入力信号) 
//  RC4(15) OUTPUT  display kHz   
//  RC5(16) OUTPUT  display Hz
//  RC6(17) OUTPUT  display OVER
//  RC7(18) OUTPUT  未使用
//
//  RE3(1)  INPUT   *MCLR
//
//  VDD(20) 5V
//  VSS(8,19) GND
//
//******************************************************************************

// PIC16F18857 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1
#pragma config FEXTOSC = ECH    // External Oscillator mode selection bits (EC above 8MHz; PFM set to high power)
#pragma config RSTOSC = EXT1X   // Power-up default value for COSC bits (EXTOSC operating per FEXTOSC bits)
#pragma config CLKOUTEN = OFF   // Clock Out Enable bit (CLKOUT function is disabled; i/o or oscillator function on OSC2)
#pragma config CSWEN = OFF      // Clock Switch Enable bit (The NOSC and NDIV bits cannot be changed by user software)
#pragma config FCMEN = OFF       // Fail-Safe Clock Monitor Disable bit (FSCM timer disabled)

// CONFIG2
#pragma config MCLRE = ON       // Master Clear Enable bit (MCLR pin is Master Clear function)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config LPBOREN = OFF    // Low-Power BOR enable bit (ULPBOR disabled)
#pragma config BOREN = OFF      // Brown-out reset enable bits (Brown-out reset disabled)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (VBOR) set to 1.9V on LF, and 2.45V on F Devices)
#pragma config ZCD = OFF        // Zero-cross detect disable (Zero-cross detect circuit is disabled at POR.)
#pragma config PPS1WAY = OFF    // Peripheral Pin Select one-way control (The PPSLOCK bit can be set and cleared repeatedly by software)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will cause a reset)

// CONFIG3
#pragma config WDTCPS = WDTCPS_31// WDT Period Select bits (Divider ratio 1:65536; software control of WDTPS)
#pragma config WDTE = OFF       // WDT operating mode (WDT Disabled, SWDTEN is ignored)
#pragma config WDTCWS = WDTCWS_7// WDT Window Select bits (window always open (100%); software control; keyed access not required)
#pragma config WDTCCS = SC      // WDT input clock selector (Software Control)

// CONFIG4
#pragma config WRT = OFF        // UserNVM self-write protection bits (Write protection off)
#pragma config SCANE = available// Scanner Enable bit (Scanner module is available for use)
#pragma config LVP = ON         // Low Voltage Programming Enable bit (Low Voltage programming enabled. MCLR/Vpp pin function is MCLR.)

// CONFIG5
#pragma config CP = OFF         // UserNVM Program memory code protection bit (Program Memory code protection disabled)
#pragma config CPD = OFF        // DataNVM code protection bit (Data EEPROM code protection disabled)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pic16f18857.h>

//------------------------ 関数定義 ------------------------
void switch_action(void);                       //スイッチ処理/全体制御
void init_TIMER2(void);                         //TIMER2を5msecに設定する(LEDダイナミック表示用)
void set_LED_port(unsigned char data);          //キャラクタLEDポート設定
void display_frequency_period(void);          //周波数をLEDに表示
void set_led_strings_to_auto(void);             //LED表示をAUTOにする
void set_led_strings_to_select(void);           //LED表示をSELECTにする
void set_led_strings_to_di_10SEC(void);         //LED表示を[di 10SEC]にする
void set_led_strings_to_dir_1SEC(void);         //LED表示を[dir 1SEC]にする
void set_led_strings_to_recipro(void);          //LED表示を[recipro ]にする

void process_action(void);                                  //全体制御処理
void convert_binaly_DEC(unsigned long binaly);              //バイナリデータを10進に変換する
unsigned char convert_to_DEC(unsigned long input_binaly);   //周波数/周期 10進変換

void set_CLKR(char n);                       //CLKRを設定する
void set_TIMER0(char postscaler);           //TIMER0を設定する
void init_TIMER4(void);                     //TIMER4設定
void init_PWM7(void);                        //PWM7設定
void set_TIMER1_direct(void);               //ダイレクトカウントのTIMER1を設定する
void set_TIMER3_direct(void);               //ダイレクトカウントのTIMER3を設定する
void set_TIMER1_reciprocal(void);           //レシプロカウントのTIMER1を設定する
void set_TIMER3_reciprocal(void);           //レシプロカウントのTIMER3を設定する

void set_F_D1(void);                            //周波数 ダイレクト表示  ゲート時間1Sec 設定
void set_F_D10(void);                           //周波数 ダイレクト表示  ゲート時間10Sec 設定
void set_F_R1(void);                            //周波数 レシプロカル表示 基準クロック 12.8MHz 設定

void display_F_D1(void);        //周波数 ダイレクト表示  ゲート時間1Sec
void display_F_D1_n10(void);    //周波数 ダイレクト表示 ゲート時間1Sec (n=10:MHz表示)
void display_F_D1_n9(void);     //周波数 ダイレクト表示 ゲート時間1Sec (n=9:MHz表示)
void display_F_D1_n8(void);     //周波数 ダイレクト表示 ゲート時間1Sec (n=8:MHz表示)
void display_F_D1_n7(void);     //周波数 ダイレクト表示 ゲート時間1Sec (n=7:MHz表示)
void display_F_D1_n6(void);     //周波数 ダイレクト表示 ゲート時間1Sec (n=6:kHz表示)
void display_F_D1_n5(void);     //周波数 ダイレクト表示 ゲート時間1Sec (n=5:kHz表示)
void display_F_D1_n4(void);     //周波数 ダイレクト表示 ゲート時間1Sec (n=4:kHz表示)
void display_F_D1_n3(void);     //周波数 ダイレクト表示 ゲート時間1Sec (n=3:Hz表示)
void display_F_D1_n2(void);     //周波数 ダイレクト表示 ゲート時間1Sec (n=2:Hz表示)
void display_F_D1_n1(void);     //周波数 ダイレクト表示 ゲート時間1Sec (n=1:Hz表示)
 
void display_F_D10(void);        //周波数 ダイレクト表示  ゲート時間10Sec
void display_F_D10_n10(void);    //周波数 ダイレクト表示 ゲート時間10Sec (n=10:MHz表示)
void display_F_D10_n9(void);     //周波数 ダイレクト表示 ゲート時間10Sec (n=9:MHz表示)
void display_F_D10_n8(void);     //周波数 ダイレクト表示 ゲート時間10Sec (n=8:MHz表示)
void display_F_D10_n7(void);     //周波数 ダイレクト表示 ゲート時間10Sec (n=7:kHz表示)
void display_F_D10_n6(void);     //周波数 ダイレクト表示 ゲート時間10Sec (n=6:kHz表示)
void display_F_D10_n5(void);     //周波数 ダイレクト表示 ゲート時間10Sec (n=5:kHz表示)
void display_F_D10_n4(void);     //周波数 ダイレクト表示 ゲート時間10Sec (n=4:Hz表示)
void display_F_D10_n3(void);     //周波数 ダイレクト表示 ゲート時間10Sec (n=3:Hz表示)
void display_F_D10_n2(void);     //周波数 ダイレクト表示 ゲート時間10Sec (n=2:Hz表示)
void display_F_D10_n1(void);     //周波数 ダイレクト表示 ゲート時間10Sec (n=1:0.1Hz表示)

void display_F_R1(void);        //周波数 レシプロカル表示 基準クロック 12.8MHz
void display_F_R1_n10(void);    //周波数 レシプロカル表示 基準クロック 12.8MHz (n=10:MHz表示)
void display_F_R1_n9(void);     //周波数 レシプロカル表示 基準クロック 12.8MHz (n=9:MHz表示)
void display_F_R1_n8(void);     //周波数 レシプロカル表示 基準クロック 12.8MHz (n=8:MHz表示)
void display_F_R1_n7(void);     //周波数 レシプロカル表示 基準クロック 12.8MHz (n=7:MHz表示)
void display_F_R1_n6(void);     //周波数 レシプロカル表示 基準クロック 12.8MHz (n=6:kHz表示)
void display_F_R1_n5(void);     //周波数 レシプロカル表示 基準クロック 12.8MHz (n=5:kHz表示)
void display_F_R1_n4(void);     //周波数 レシプロカル表示 基準クロック 12.8MHz (n=4:kHz表示)
void display_F_R1_n3(void);     //周波数 レシプロカル表示 基準クロック 12.8MHz (n=3:Hz表示)
void display_F_R1_n2(void);     //周波数 レシプロカル表示 基準クロック 12.8MHz (n=2:Hz表示)
void display_F_R1_n1(void);     //周波数 レシプロカル表示 基準クロック 12.8MHz (n=1:Hz表示)

void display_A_R1(void);        //周波数 オート レシプロカル表示 基準クロック 12.8MHz
void display_A_R1_n10(void);    //周波数 オート レシプロカル表示 基準クロック 12.8MHz (n=10:MHz表示)
void display_A_R1_n9(void);     //周波数 オート レシプロカル表示 基準クロック 12.8MHz (n=9:MHz表示)
void display_A_R1_n8(void);     //周波数 オート レシプロカル表示 基準クロック 12.8MHz (n=8:MHz表示)
void display_A_R1_n7(void);     //周波数 オート レシプロカル表示 基準クロック 12.8MHz (n=7:MHz表示)
void display_A_R1_n6(void);     //周波数 オート レシプロカル表示 基準クロック 12.8MHz (n=6:kHz表示)
void display_A_R1_n5(void);     //周波数 オート レシプロカル表示 基準クロック 12.8MHz (n=5:kHz表示)
void display_A_R1_n4(void);     //周波数 オート レシプロカル表示 基準クロック 12.8MHz (n=4:kHz表示)
void display_A_R1_n3(void);     //周波数 オート レシプロカル表示 基準クロック 12.8MHz (n=3:Hz表示)
void display_A_R1_n2(void);     //周波数 オート レシプロカル表示 基準クロック 12.8MHz (n=2:Hz表示)
void display_A_R1_n1(void);     //周波数 オート レシプロカル表示 基準クロック 12.8MHz (n=1:Hz表示)


//---------------------- グローバル変数 -----------------------
char display_frequency_period_flag = 0;                 //1で表示する
unsigned char d10,d9,d8,d7,d6,d5,d4,d3,d2,d1;           //各桁の10進コード
unsigned char digit_counter = 0;                        //0-7(表示桁数を表す、0:最上位~7:最下位)
unsigned long input_frequency =0;                       //入力した周波数(32bit)
unsigned long int_frequency;                            //測定周波数(整数)
char led_strings[9];                                    //LED 表示数字
short mode = 0;                                         //装置全体の現在の動作モードを示す 0:1Secダイレクトカウント, 1:10Secダイレクトカウント, 2:レシプロカルカウント
unsigned char f_auto_flag = 1;                          //0:マニュアル,1:auto
unsigned short SW_up_status = 1;                        //SW_upスイッチの状態を保持する
unsigned short SW_down_status = 1;                      //SW_downスイッチの状態を保持する
unsigned short gate_counter = 0;                        //ゲートLEDを消灯するタイミング生成

//---------------------- 変数定義 -----------------------
//------------ CPU speed ----------------
#define _XTAL_FREQ 12800000             //delay用に必要(クロック16MHzを指定)
//---------- 7Seg LED ----------------
#define LED_dp      PORTCbits.RC0
#define LED_g       PORTAbits.RA6
#define LED_f       PORTAbits.RA5
#define LED_e       PORTAbits.RA4
#define LED_d       PORTAbits.RA3
#define LED_c       PORTAbits.RA2
#define LED_b       PORTAbits.RA1
#define LED_a       PORTAbits.RA0
#define LED_digit0  PORTBbits.RB0
#define LED_digit1  PORTBbits.RB1
#define LED_digit2  PORTBbits.RB2
//---------- unit LED ----------------
#define Gate_time   PORTCbits.RC6
#define Unit_Hz     PORTCbits.RC5
#define Unit_kHz    PORTCbits.RC4
#define Unit_MHz    PORTCbits.RC1
//---------- up/down Switch ----------
#define SW_down     PORTBbits.RB3
#define SW_up       PORTBbits.RB4


/************************ LED portにデータを設定 ********************************
*	入力 data
*	処理 LEDデータを設定
*	出力 LED_a~LED_g
*******************************************************************************/
void set_LED_port(unsigned char data){
    switch(data){
        case 0:  LED_a=1; LED_b=1; LED_c=1; LED_d=1; LED_e=1; LED_f=1; LED_g=0; LED_dp=0;   break;   //0
        case 1:  LED_a=0; LED_b=1; LED_c=1; LED_d=0; LED_e=0; LED_f=0; LED_g=0; LED_dp=0;   break;   //1
        case 2:  LED_a=1; LED_b=1; LED_c=0; LED_d=1; LED_e=1; LED_f=0; LED_g=1; LED_dp=0;   break;   //2
        case 3:  LED_a=1; LED_b=1; LED_c=1; LED_d=1; LED_e=0; LED_f=0; LED_g=1; LED_dp=0;   break;   //3
        case 4:  LED_a=0; LED_b=1; LED_c=1; LED_d=0; LED_e=0; LED_f=1; LED_g=1; LED_dp=0;   break;   //4
        case 5:  LED_a=1; LED_b=0; LED_c=1; LED_d=1; LED_e=0; LED_f=1; LED_g=1; LED_dp=0;   break;   //5
        case 6:  LED_a=1; LED_b=0; LED_c=1; LED_d=1; LED_e=1; LED_f=1; LED_g=1; LED_dp=0;   break;   //6
        case 7:  LED_a=1; LED_b=1; LED_c=1; LED_d=0; LED_e=0; LED_f=0; LED_g=0; LED_dp=0;   break;   //7
        case 8:  LED_a=1; LED_b=1; LED_c=1; LED_d=1; LED_e=1; LED_f=1; LED_g=1; LED_dp=0;   break;   //8
        case 9:  LED_a=1; LED_b=1; LED_c=1; LED_d=1; LED_e=0; LED_f=1; LED_g=1; LED_dp=0;   break;   //9
        case 10: LED_a=1; LED_b=1; LED_c=1; LED_d=1; LED_e=1; LED_f=1; LED_g=0; LED_dp=1;   break;   //0.
        case 11: LED_a=0; LED_b=1; LED_c=1; LED_d=0; LED_e=0; LED_f=0; LED_g=0; LED_dp=1;   break;   //1.
        case 12: LED_a=1; LED_b=1; LED_c=0; LED_d=1; LED_e=1; LED_f=0; LED_g=1; LED_dp=1;   break;   //2.
        case 13: LED_a=1; LED_b=1; LED_c=1; LED_d=1; LED_e=0; LED_f=0; LED_g=1; LED_dp=1;   break;   //3.
        case 14: LED_a=0; LED_b=1; LED_c=1; LED_d=0; LED_e=0; LED_f=1; LED_g=1; LED_dp=1;   break;   //4.
        case 15: LED_a=1; LED_b=0; LED_c=1; LED_d=1; LED_e=0; LED_f=1; LED_g=1; LED_dp=1;   break;   //5.
        case 16: LED_a=1; LED_b=0; LED_c=1; LED_d=1; LED_e=1; LED_f=1; LED_g=1; LED_dp=1;   break;   //6.
        case 17: LED_a=1; LED_b=1; LED_c=1; LED_d=0; LED_e=0; LED_f=0; LED_g=0; LED_dp=1;   break;   //7.
        case 18: LED_a=1; LED_b=1; LED_c=1; LED_d=1; LED_e=1; LED_f=1; LED_g=1; LED_dp=1;   break;   //8.
        case 19: LED_a=1; LED_b=1; LED_c=1; LED_d=1; LED_e=0; LED_f=1; LED_g=1; LED_dp=1;   break;   //9.
        case 32: LED_a=0; LED_b=0; LED_c=0; LED_d=0; LED_e=0; LED_f=0; LED_g=0; LED_dp=0;  break;   //sp
        case 48:  LED_a=1; LED_b=1; LED_c=1; LED_d=1; LED_e=1; LED_f=1; LED_g=0; LED_dp=0;   break;   //0
        case 49:  LED_a=0; LED_b=1; LED_c=1; LED_d=0; LED_e=0; LED_f=0; LED_g=0; LED_dp=0;   break;   //1
        case 65:  LED_a=1; LED_b=1; LED_c=1; LED_d=0; LED_e=1; LED_f=1; LED_g=1; LED_dp=0;   break;   //A
        case 67:  LED_a=1; LED_b=0; LED_c=0; LED_d=1; LED_e=1; LED_f=1; LED_g=0; LED_dp=0;   break;   //C
        case 69:  LED_a=1; LED_b=0; LED_c=0; LED_d=1; LED_e=1; LED_f=1; LED_g=1; LED_dp=0;   break;   //E
        case 70:  LED_a=1; LED_b=0; LED_c=0; LED_d=0; LED_e=1; LED_f=1; LED_g=1; LED_dp=1;   break;   //F.
        case 76:  LED_a=0; LED_b=0; LED_c=0; LED_d=1; LED_e=1; LED_f=1; LED_g=0; LED_dp=0;   break;   //L
        case 79:  LED_a=1; LED_b=1; LED_c=1; LED_d=1; LED_e=1; LED_f=1; LED_g=0; LED_dp=0;   break;   //O
        case 83:  LED_a=1; LED_b=0; LED_c=1; LED_d=1; LED_e=0; LED_f=1; LED_g=1; LED_dp=0;   break;   //S
        case 84:  LED_a=1; LED_b=0; LED_c=0; LED_d=0; LED_e=1; LED_f=1; LED_g=0; LED_dp=0;   break;   //T
        case 85:  LED_a=0; LED_b=1; LED_c=1; LED_d=1; LED_e=1; LED_f=1; LED_g=0; LED_dp=0;   break;   //U
        case 99:  LED_a=0; LED_b=0; LED_c=0; LED_d=1; LED_e=1; LED_f=0; LED_g=1; LED_dp=0;   break;   //c
        case 100:  LED_a=0; LED_b=1; LED_c=1; LED_d=1; LED_e=1; LED_f=0; LED_g=1; LED_dp=0;   break;   //d
        case 101:  LED_a=1; LED_b=1; LED_c=0; LED_d=1; LED_e=1; LED_f=1; LED_g=1; LED_dp=0;   break;   //e
        case 105:  LED_a=0; LED_b=0; LED_c=1; LED_d=0; LED_e=0; LED_f=0; LED_g=0; LED_dp=0;   break;   //i
        case 110:  LED_a=0; LED_b=0; LED_c=1; LED_d=0; LED_e=1; LED_f=0; LED_g=1; LED_dp=0;   break;   //n
        case 111:  LED_a=0; LED_b=0; LED_c=1; LED_d=1; LED_e=1; LED_f=0; LED_g=1; LED_dp=0;   break;   //o
        case 112:  LED_a=1; LED_b=1; LED_c=0; LED_d=0; LED_e=1; LED_f=1; LED_g=1; LED_dp=0;   break;   //p
        case 114:  LED_a=0; LED_b=0; LED_c=0; LED_d=0; LED_e=1; LED_f=0; LED_g=1; LED_dp=0;   break;   //r
        case 116:  LED_a=0; LED_b=0; LED_c=0; LED_d=1; LED_e=1; LED_f=1; LED_g=1; LED_dp=0;   break;   //t
        case 117:  LED_a=0; LED_b=0; LED_c=1; LED_d=1; LED_e=1; LED_f=0; LED_g=0; LED_dp=0;   break;   //u
        case 255: LED_a=0; LED_b=0; LED_c=0; LED_d=0; LED_e=0; LED_f=0; LED_g=0; LED_dp=0;  break;   //ブランク
    }
}

/******************* バイナリデータを10進に変換する **********************
*	入力 0<= binaly <=2^32(32bit)=4,294,967,295
*	処理 バイナリ→10進変換
*	出力 d10,d9,d8,d7,d6,d5,d4,d3,d2,d1
**********************************************************************/
void convert_binaly_DEC(unsigned long binaly){
    unsigned long syou1,syou2,syou3,syou4,syou5,syou6,syou7,syou8,syou9;
                                    
    syou1 = binaly/10;      d1 = binaly%10;
    syou2 = syou1/10;       d2 = syou1%10;
    syou3 = syou2/10;       d3 = syou2%10;
    syou4 = syou3/10;       d4 = syou3%10;
    syou5 = syou4/10;       d5 = syou4%10;
    syou6 = syou5/10;       d6 = syou5%10;
    syou7 = syou6/10;       d7 = syou6%10;
    syou8 = syou7/10;       d8 = syou7%10;
    syou9 = syou8/10;       d9 = syou8%10;
                            d10 = syou9%10;    
}

//******************** CLKRを初期設定する ******************************
//  入力    n(n=0:12.8MHz, n=1:6.4MHz, n=2:3.2MHz, n=3:1.6MHz, n=4:800kHz, n=5:400kHz, n=6:200kHz, n=7:100kHz)                
//  処理    Fosc(12.8MHz)を分周する      
//  出力    TIMER1 CLK入力へ    
//******************************************************************************
void set_CLKR(char n){            //CLKRを設定する
    CLKRCONbits.CLKREN = 0;         //CLKR 停止
    CLKRCLKbits.CLKRCLK = 0;        //ソースはFOSC
    CLKRCONbits.CLKRDIV = n;        //n=7の時 1/128(100kHz)
    CLKRCONbits.CLKRDC = 2;         //duty 50%
    CLKRCONbits.CLKREN = 1;         //CLKR 有効
}

//******************** TIMER0を設定する *****************************************
//  入力    Fosc/4(3.2MHz),     postscaler=1でゲート時間1秒,10で10秒                   
//  処理    3.2MHz/128=25kHz,25kHz/125=200Hz 200Hz/1=200Hz,200Hz/2=100Hz                
//  出力    100Hz(postscaler=0) または 10Hz出力(postscaler=9):(TIMER1のゲート信号)          
//******************************************************************************
void set_TIMER0(char postscaler){     //TIMER0を設定する
    T0CON0bits.T0EN = 0;                //TIMER0 OFF
    T0CON1bits.T0CS = 2;                //入力クロックはFosc/4(12.8MHz/4=3.2MHz)
    T0CON1bits.T0CKPS = 7;              //プリスケーラ3.2MHz/128=25kHz
    T0CON1bits.T0ASYNC = 0;             //同期
    T0CON0bits.T016BIT = 0;             //8bit モード
    TMR0H = 124;                        //1/(124+1)分周 25kHz/125=200Hz
    T0CON0bits.T0OUTPS = postscaler;    //ポストスケーラ0の時1/1 200Hz/1=200Hz  F/Fで1/2 200/2=100Hz  
    T0CON0bits.T0EN = 1;                //TIMER0 ON    
}

//******************** TIMER4を設定する ****************************
//  入力    TMR0出力(RC7:18pin) ⇒ TMR4入力(RC6:17pin)              
//  処理    TMR0クロックを110分周する                
//  出力    PWM7へTIMER4カウンタ出力           
//******************************************************************************
void init_TIMER4(void){
    T4CLKCONbits.CS = 0;        //入力クロックはRC6:17pin
    T4HLTbits.MODE = 0;         //フリーランモード 
    T4CONbits.CKPS = 0;         //プリスケール1:1
    T4PR = 101;                 //周期設定(1がCPU割り込み処理時間)
    T4CONbits.ON = 1;           //TIMER4 動作開始 
}

//******************** PWM7を初期設定する ****************************
//  入力    TIMER4カウンタ出力(100Hzまたは10Hz)                   
//  処理    100分周                
//  出力    Timer1のゲート信号(1Hz,0.1Hz)を出力する           
//******************************************************************************
void init_PWM7(void){
    PWM7CONbits.EN = 0;             //PWM7動作停止
    CCPTMRS1bits.P7TSEL = 2;        //timer4選択
    PWM7CONbits.POL = 0;            //PWM7 OUTPUT Active High
    PWM7DCH  = 100;                 //DUTY(High 8bit)
    PWM7DCL  = 0;                   //DUTY(bit7,bit6) bit6:lsb
    PWM7CONbits.EN = 1;             //PWM7動作開始   
}

//******************** TIMER1(ダイレクト)を設定する ***************************
//  入力    TMR1クロック:RC3(14pin)、TMR1ゲート:PWM7                 
//  処理    ダイレクトカウントのTIMER1の設定を行う               
//  出力    TMR1overflow(to TMR3)          
//******************************************************************************
void set_TIMER1_direct(void){        //ダイレクトカウントのTIMER1を設定する
    T1CONbits.ON = 0;                   //TIMER1 OFF
    T1CLK = 0;                          //TMR1クロック入力:RC3(14pin)
    T1CONbits.CKPS = 0;                 //プレスケール1/1
    T1CONbits.nSYNC = 1;                //非同期
    T1GATE = 0x10;                      //ゲート信号:PWM7
    T1GCONbits.GTM = 0;                 //ゲートトグルモード無効
    T1GCONbits.GPOL = 1;                //ゲート極性:1(high)
    T1GCONbits.GSPM = 0;                //シングルパルスモード無効
    T1GCONbits.GE = 1;                  //ゲート制御有効
    T1CONbits.RD16 = 0;                 //8bitモード 
    TMR1H = 0;  TMR1L = 0;              //TMR1クリア
    T1CONbits.ON = 1;                   //TIMER1 有効
    //--- TIMER1GIF割込み設定 ---
    PIR5bits.TMR1GIF = 0;               //TMR1G 割込みフラグクリア
    PIE5bits.TMR1GIE = 1;               //TMR1G 割込み有効
}

//******************** TIMER3(ダイレクト)を設定する ***************************
//  入力    TMR3クロック:TMR1overflow、TMR3ゲート:PWM7                   
//  処理    ダイレクトカウントのTIMER3の設定を行う               
//  出力    TMR1G割込みで TMR3L、TMR3H出力            
//******************************************************************************
void set_TIMER3_direct(void){       //ダイレクトカウントのTIMER3を設定する
    T3CONbits.ON = 0;                   //TIMER3 OFF
    T3CLK = 9;                          //TMR3入力:TMR1overflow
    T3CONbits.CKPS = 0;                 //プレスケール1/1
    T3CONbits.nSYNC = 1;                //非同期
    T3GCONbits.GE = 0;                  //ゲート制御無効
    T3CONbits.RD16 = 0;                 //8bitモード
    TMR3H = 0;  TMR3L = 0;              //TMR3クリア
    T3CONbits.ON = 1;                   //TIMER3有効
    //--- TIMER3IF割込み設定 ---
    PIR4bits.TMR3IF = 0;                //TMR3 割込みフラグクリア
    PIE4bits.TMR3IE = 1;                //TMR3 割込み有効
}
 
//******************** TIMER1(レシプロ)を設定する ***************************
//  入力    TMR1クロック:CLKR、TMR1ゲート:RC2(13pin)                          
//  処理    レシプロカウントのTIMER1の設定を行う               
//  出力    TMR1overflow(to TMR3)          
//******************************************************************************
void set_TIMER1_reciprocal(void){   //レシプロカウントのTIMER1を設定する
    T1CONbits.ON = 0;                   //TIMER1 OFF
    T1CLK = 7;                          //TMR1入力:CLKR
    T1CONbits.CKPS = 0;                 //プレスケール1/1
    T1CONbits.nSYNC = 1;                //非同期
    
    T1GATE = 0;                         //To Do TMR1ゲート入力:RC2(13pin)
    T1GCONbits.GTM = 1;                 //T0Do トグルモード設定 
    T1GCONbits.GPOL = 1;                //ゲート極性:1
    T1GCONbits.GSPM = 0;                //シングルパルスモード無効
    T1GCONbits.GE = 1;                  //ゲート制御有効
    T1CONbits.RD16 = 0;                 //8bitモード
    TMR1H = 0;  TMR1L = 0;              //TMR1クリア
    T1CONbits.ON = 1;                   //TIMER1 有効
    //--- TIMER1GIF割込み設定 ---
    PIR5bits.TMR1GIF = 0;               //TMR1G 割込みフラグクリア
    PIE5bits.TMR1GIE = 1;               //TMR1G 割込み有効
}

//******************** TIMER3(レシプロ)を設定する ***************************
//  入力    TMR3クロック:TMR1overflow、TMR3ゲート:RC2(13pin)                     
//  処理    レシプロカウントのTIMER3の設定を行う               
//  出力    TMR1G割込みで TMR3L、TMR3H出力           
//******************************************************************************
void set_TIMER3_reciprocal(void){    //レシプロカウントのTIMER3を設定する
    T3CONbits.ON = 0;                   //TIMER3 OFF
    T3CLK = 9;                          //TMR3入力:TMR1overflow
    T3CONbits.CKPS = 0;                 //プレスケール1/1
    T3CONbits.nSYNC = 1;                //非同期             
    T3GCONbits.GE = 0;                  //ゲート制御無効
    T3CONbits.RD16 = 0;                 //8bitモード
    TMR3H = 0;  TMR3L = 0;              //TMR3クリア
    T3CONbits.ON = 1;                   //TIMER3 有効
}

//********************** 割り込み処理 *******************************************
//  入力    割り込み
//  処理    
//   出力   TMR1G割込み(周波数、周期入力):                      
//          TMR3IF割込み(オーバーフロー割込み):                           
//******************************************************************************
void __interrupt(high_priority) ISR(void){
    //========= TMR2IF割込み(2.5mSec LEDダイナミック点灯)=========
        if(PIR4bits.TMR2IF == 1){                           //LEDダイナミック点灯処理
        PIR4bits.TMR2IF = 0;                                //割込みフラグクリア
        
        set_LED_port(led_strings[digit_counter]);           //表示データセット
        PORTB = digit_counter;                              //表示デジット設定
        if (digit_counter < 7)  digit_counter++;    else    digit_counter = 0;
        
    //----------- ゲートLEDを消灯する ------------ 
        gate_counter++;
        switch(mode){
            case 0:  if(gate_counter > 202)    Gate_time = 1;  break;     //1Sec:ゲート時間LEDを消灯
            case 1:  if(gate_counter > 2020)   Gate_time = 1;  break;     //10Sec:ゲート時間LEDを消灯
            case 2:  if(gate_counter > 5)      Gate_time = 1;  break;     //レシプロ:ゲート時間LEDを消灯
        }                 
    }

    //========= TMR1G割込み(周波数、周期入力) ============
    if(PIR5bits.TMR1GIF == 1){                                  //周波数表示トリガー
        PIR5bits.TMR1GIF = 0;                                   //割込みフラグクリア
        
        input_frequency = TMR3H;
        input_frequency = (input_frequency << 8) + TMR3L;
        input_frequency = (input_frequency << 8) + TMR1H;
        input_frequency = (input_frequency << 8) + TMR1L;       //タイマーレジスタの値をコピー
        TMR1L = 0;  TMR1H = 0;  TMR3L = 0;  TMR3H = 0;          //タイマーレジスタ クリア
        display_frequency_period_flag = 1;                      //1で表示する
        
        Gate_time = 0;  gate_counter= 0;                       //ゲート時間LEDを点灯
    }
        
    //=========== 状態変化割り込み処理 ===========
    if(IOCBFbits.IOCBF4 == 1){                                  //RB4(SW_up)状態変化割り込み処理
        IOCBFbits.IOCBF4 = 0;                                   //RB4(SW_up)状態変化割り込みフラグクリア
        SW_up_status   = 0;                                     //SW_upが押下された
    } 
    if(IOCBFbits.IOCBF3 == 1){                                  //RB3(SW_down)状態変化割り込み処理 
        IOCBFbits.IOCBF3 = 0;                                   //RB3(SW_down)状態変化割り込みフラグクリア
        SW_down_status = 0;                                     //SW_downが押下された
    }
}

//********************** TIMER2を2.5msecに設定する *******************************
//  入力    なし
//  処理    LEDダイナミック表示タイミング発生(50Hz*8digit=400Hz=2.5mSec)        
//  出力    割込み発生                    
//******************************************************************************
void init_TIMER2(void){                                 //TIMER2を5msecに設定する
    T2HLTbits.MODE = 0;         //フリーランモード 
    T2CLKCONbits.CS = 1;        //入力クロックはFosc/4 12.8MHz/4=3.2MHz
    T2CONbits.CKPS = 6;         //プリスケール1/64 3.2MHz/64=50000Hz
    T2PR = 24;                  //周期設定25(24+1) 50000/25=2000Hz
    T2CONbits.OUTPS = 4;        //ポストスケーラ 1/5=2000/5=400Hz(2.5mSec)
    //---TMR2IF割込み設定 ---
    PIR4bits.TMR2IF = 0;        //TMR2IF 割込みフラグクリア
    PIE4bits.TMR2IE = 1;        //TMR2IF 割込み有効
    
    T2CONbits.ON = 1;           //TIMER2 動作開始
}

//******************** 全体制御処理 ********************************************
//  入力    mode(0,1,2)
//  処理    全体制御処理   
//  出力    modeの内容をLCDに表示する                                
//******************************************************************************
void process_action(void){                              //全体制御処理
    switch(mode){
        case 0:     set_F_D1();             break;      //周波数 ダイレクト表示  ゲート時間1Sec_P
        case 1:     set_F_D10();            break;      //周波数 ダイレクト表示  ゲート時間10Sec
        case 2:     set_F_R1();             break;      //周波数 レシプロカル表示 基準クロック 12.8MHz
    }              
}

//**************** 周波数 ダイレクト表示 ゲート時間1Sec(mode=0) ****************
//  入力    CLK:BNC, ゲート:1Sec    
//  処理    カウント値      
//  出力                                    
//******************************************************************************
void set_F_D1(void){                            //周波数 ダイレクト表示  ゲート時間1Sec 設定
    set_TIMER0(0);                              //ゲート時間1秒設定
    set_TIMER3_direct();                        //TIMER3をダイレクトカウントに設定する
    set_TIMER1_direct();                        //TIMER1をダイレクトカウントに設定する 
}

//**************** 周波数 ダイレクト表示 ゲート時間10Sec(mode=1) ***************
//  入力    CLK:BNC, ゲート:1Sec    
//  処理    カウント値      
//  出力                                    
//******************************************************************************
void set_F_D10(void){                            //周波数 ダイレクト表示  ゲート時間10Sec 設定
    set_TIMER0(9);                              //ゲート時間10秒設定
    set_TIMER3_direct();                        //TIMER3をダイレクトカウントに設定する
    set_TIMER1_direct();                        //TIMER1をダイレクトカウントに設定する 
}

//************* 周波数 レシプロカル表示 基準クロック 12.8MHz(mode=2) **********
//  入力    CLK:12.8MHz, ゲート:BNC    
//  処理    1/カウント値      
//  出力    周波数表示                                
//******************************************************************************
void set_F_R1(void){                            //周波数 レシプロカル表示 基準クロック 12.8MHz 設定
    set_CLKR(0);                                //CLKR:12.8MHz
    set_TIMER3_reciprocal();                    //TIMER3をレシプロカウントに設定する
    set_TIMER1_reciprocal();                    //TIMER1をレシプロカウントに設定する
}

//********************** 周波数/周期 表示 **************************************
//  入力    mode,display_frequency_period_flag,input_frequency,d10-d1
//  処理    周波数をLEDに表示    
//   出力                    
//******************************************************************************
void display_frequency_period(void){               //周波数をLCDに表示 
    if(display_frequency_period_flag == 1 ){               //1で表示する
        display_frequency_period_flag = 0;                 //フラグクリア
        
        switch(mode){
            case 0:     display_F_D1();         break;                 //周波数 ダイレクト表示  ゲート時間1Sec
            case 1:     display_F_D10();        break;                 //周波数 ダイレクト表示  ゲート時間10Sec
            case 2:     
                if(f_auto_flag == 1)    display_A_R1();
                else                    display_F_R1();         
                break;                                      //周波数 レシプロカル表示 基準クロック 12.8MHz
        }
        switch_action();                                    //########## スイッチ処理/全体制御 #############
    }  
}

//**************** 周波数 ダイレクト表示 ゲート時間1Sec(mode=0) *****************
//  入力    input_frequency    
//  処理    1Hz      
//  出力                                    
//******************************************************************************
void display_F_D1(void){                          //周波数 ダイレクト表示  ゲート時間1Sec
    if(input_frequency != 0){                           //0出ないとき周波数を表示 
        int_frequency = input_frequency;                //測定周波数(整数)
        unsigned char n;
        n = convert_to_DEC(input_frequency);            //バイナリから10進変換
        switch(n){
            case 10:    display_F_D1_n10();  break;      //MHz表示
            case 9:     display_F_D1_n9();   break;      //MHz表示      
            case 8:     display_F_D1_n8();   break;      //MHz表示
            case 7:     display_F_D1_n7();   break;      //MHz表示
            case 6:     display_F_D1_n6();   break;      //kHz表示
            case 5:     display_F_D1_n5();   break;      //kHz表示
            case 4:     display_F_D1_n4();   break;      //kHz表示
            case 3:     display_F_D1_n3();   break;      //Hz表示
            case 2:     display_F_D1_n2();   break;      //Hz表示
            case 1:     display_F_D1_n1();   break;      //Hz表示
        }            
    }
}    
//**************** 周波数 ダイレクト表示 ゲート時間1Sec (n=10:MHz表示) **********
void display_F_D1_n10(void){
    led_strings[7]=d10; led_strings[6]=d9;  led_strings[5]=d8;  led_strings[4]=d7+10;
    led_strings[3]=d6;  led_strings[2]=d5;  led_strings[1]=d4;  led_strings[0]=d3;
    Unit_MHz = 0;   Unit_kHz = 1;   Unit_Hz = 1;                //[MHz]単位表示     
}
//**************** 周波数 ダイレクト表示 ゲート時間1Sec (n=9:MHz表示) **********
void display_F_D1_n9(void){
    led_strings[7]=d9;  led_strings[6]=d8;  led_strings[5]=d7+10;  led_strings[4]=d6;
    led_strings[3]=d5;  led_strings[2]=d4;  led_strings[1]=d3;     led_strings[0]=d2;
    Unit_MHz = 0;   Unit_kHz = 1;   Unit_Hz = 1;                //[MHz]単位表示     
}
//**************** 周波数 ダイレクト表示 ゲート時間1Sec (n=8:MHz表示) **********
void display_F_D1_n8(void){
    led_strings[7]=d8;  led_strings[6]=d7+10;  led_strings[5]=d6;  led_strings[4]=d5;
    led_strings[3]=d4;  led_strings[2]=d3;     led_strings[1]=d2;  led_strings[0]=d1;
    Unit_MHz = 0;   Unit_kHz = 1;   Unit_Hz = 1;                //[MHz]単位表示     
}
//**************** 周波数 ダイレクト表示 ゲート時間1Sec (n=7:MHz表示) **********
void display_F_D1_n7(void){
    led_strings[7]=255;  led_strings[6]=d7+10;  led_strings[5]=d6;  led_strings[4]=d5;
    led_strings[3]=d4;   led_strings[2]=d3;     led_strings[1]=d2;  led_strings[0]=d1;
    Unit_MHz = 0;   Unit_kHz = 1;   Unit_Hz = 1;                //[MHz]単位表示     
}
//**************** 周波数 ダイレクト表示 ゲート時間1Sec (n=6:kHz表示) **********
void display_F_D1_n6(void){
    led_strings[7]=255;     led_strings[6]=255;  led_strings[5]=d6;  led_strings[4]=d5;
    led_strings[3]=d4+10;   led_strings[2]=d3;   led_strings[1]=d2;  led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 0;   Unit_Hz = 1;                //[kHz]単位表示     
}
//**************** 周波数 ダイレクト表示 ゲート時間1Sec (n=5:kHz表示) **********
void display_F_D1_n5(void){
    led_strings[7]=255;     led_strings[6]=255;  led_strings[5]=255;  led_strings[4]=d5;
    led_strings[3]=d4+10;   led_strings[2]=d3;   led_strings[1]=d2;   led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 0;   Unit_Hz = 1;                //[kHz]単位表示     
}
//**************** 周波数 ダイレクト表示 ゲート時間1Sec (n=4:kHz表示) **********
void display_F_D1_n4(void){
    led_strings[7]=255;     led_strings[6]=255;  led_strings[5]=255;  led_strings[4]=255;
    led_strings[3]=d4+10;   led_strings[2]=d3;   led_strings[1]=d2;   led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 0;   Unit_Hz = 1;                //[kHz]単位表示     
}
//**************** 周波数 ダイレクト表示 ゲート時間1Sec (n=3:Hz表示) **********
void display_F_D1_n3(void){
    led_strings[7]=255;   led_strings[6]=255;  led_strings[5]=255;  led_strings[4]=255;
    led_strings[3]=255;   led_strings[2]=d3;   led_strings[1]=d2;   led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[Hz]単位表示     
}
//**************** 周波数 ダイレクト表示 ゲート時間1Sec (n=2:Hz表示) **********
void display_F_D1_n2(void){
    led_strings[7]=255;   led_strings[6]=255;  led_strings[5]=255;  led_strings[4]=255;
    led_strings[3]=255;   led_strings[2]=255;  led_strings[1]=d2;   led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[Hz]単位表示     
}
//**************** 周波数 ダイレクト表示 ゲート時間1Sec (n=1:Hz表示) **********
void display_F_D1_n1(void){
    led_strings[7]=255;   led_strings[6]=255;  led_strings[5]=255;  led_strings[4]=255;
    led_strings[3]=255;   led_strings[2]=255;  led_strings[1]=255;  led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[Hz]単位表示     
}

//**************** 周波数 ダイレクト表示 ゲート時間10Sec(mode=1) *****************
//  入力    input_frequency    
//  処理    0.1Hz      
//  出力                                    
//******************************************************************************
void display_F_D10(void){                          //周波数 ダイレクト表示  ゲート時間10Sec
    if(input_frequency != 0){                                                       //0出ないとき周波数を表示    
        unsigned char n;
        n = convert_to_DEC(input_frequency);                                        //バイナリから10進変換
        switch(n){
            case 10:    display_F_D10_n10();  break;      //MHz表示
            case 9:     display_F_D10_n9();   break;      //MHz表示      
            case 8:     display_F_D10_n8();   break;      //MHz表示
            case 7:     display_F_D10_n7();   break;      //kHz表示
            case 6:     display_F_D10_n6();   break;      //kHz表示
            case 5:     display_F_D10_n5();   break;      //kHz表示
            case 4:     display_F_D10_n4();   break;      //Hz表示
            case 3:     display_F_D10_n3();   break;      //Hz表示
            case 2:     display_F_D10_n2();   break;      //Hz表示
            case 1:     display_F_D10_n1();   break;      //Hz表示(0.1Hz)
        }    
    }
}
//************* 周波数 ダイレクト表示 ゲート時間10Sec (n=10:MHz表示) **********  
void display_F_D10_n10(void){
    led_strings[7]=d10; led_strings[6]=d9;  led_strings[5]=d8+10;  led_strings[4]=d7;
    led_strings[3]=d6;  led_strings[2]=d5;  led_strings[1]=d4;     led_strings[0]=d3;
    Unit_MHz = 0;   Unit_kHz = 1;   Unit_Hz = 1;                //[MHz]単位表示     
}
//**************** 周波数 ダイレクト表示 ゲート時間10Sec (n=9:MHz表示) **********
void display_F_D10_n9(void){
    led_strings[7]=d9;  led_strings[6]=d8+10;  led_strings[5]=d7;  led_strings[4]=d6;
    led_strings[3]=d5;  led_strings[2]=d4;     led_strings[1]=d3;  led_strings[0]=d2;
    Unit_MHz = 0;   Unit_kHz = 1;   Unit_Hz = 1;                //[MHz]単位表示     
}
//**************** 周波数 ダイレクト表示 ゲート時間10Sec (n=8:MHz表示) **********
void display_F_D10_n8(void){
    led_strings[7]=d8+10;  led_strings[6]=d7;  led_strings[5]=d6;  led_strings[4]=d5;
    led_strings[3]=d4;     led_strings[2]=d3;  led_strings[1]=d2;  led_strings[0]=d1;
    Unit_MHz = 0;   Unit_kHz = 1;   Unit_Hz = 1;                //[MHz]単位表示     
}
//**************** 周波数 ダイレクト表示 ゲート時間10Sec (n=7:kHz表示) **********
void display_F_D10_n7(void){
    led_strings[7]=255;  led_strings[6]=d7;  led_strings[5]=d6;  led_strings[4]=d5+10;
    led_strings[3]=d4;   led_strings[2]=d3;  led_strings[1]=d2;  led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 0;   Unit_Hz = 1;                //[kHz]単位表示     
}
//**************** 周波数 ダイレクト表示 ゲート時間10Sec (n=6:kHz表示) **********
void display_F_D10_n6(void){
    led_strings[7]=255;  led_strings[6]=255;  led_strings[5]=d6;  led_strings[4]=d5+10;
    led_strings[3]=d4;   led_strings[2]=d3;   led_strings[1]=d2;  led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 0;   Unit_Hz = 1;                //[kHz]単位表示     
}
//**************** 周波数 ダイレクト表示 ゲート時間10Sec (n=5:kHz表示) **********
void display_F_D10_n5(void){
    led_strings[7]=255;  led_strings[6]=255;  led_strings[5]=255;  led_strings[4]=d5+10;
    led_strings[3]=d4;   led_strings[2]=d3;   led_strings[1]=d2;   led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 0;   Unit_Hz = 1;                //[kHz]単位表示     
}
//**************** 周波数 ダイレクト表示 ゲート時間10Sec (n=4:Hz表示) **********
void display_F_D10_n4(void){
    led_strings[7]=255;  led_strings[6]=255;  led_strings[5]=255;     led_strings[4]=255;
    led_strings[3]=d4;   led_strings[2]=d3;   led_strings[1]=d2+10;   led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[Hz]単位表示     
}
//**************** 周波数 ダイレクト表示 ゲート時間10Sec (n=3:Hz表示) **********
void display_F_D10_n3(void){
    led_strings[7]=255;   led_strings[6]=255;  led_strings[5]=255;     led_strings[4]=255;
    led_strings[3]=255;   led_strings[2]=d3;   led_strings[1]=d2+10;   led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[Hz]単位表示     
}
//**************** 周波数 ダイレクト表示 ゲート時間10Sec (n=2:Hz表示) **********
void display_F_D10_n2(void){
    led_strings[7]=255;   led_strings[6]=255;  led_strings[5]=255;     led_strings[4]=255;
    led_strings[3]=255;   led_strings[2]=255;  led_strings[1]=d2+10;   led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[Hz]単位表示     
}
//**************** 周波数 ダイレクト表示 ゲート時間10Sec (n=1:0.1Hz表示) **********
void display_F_D10_n1(void){
    led_strings[7]=255;   led_strings[6]=255;  led_strings[5]=255;  led_strings[4]=255;
    led_strings[3]=255;   led_strings[2]=255;  led_strings[1]=10;   led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[0.1Hz]単位表示     
}    

//************* 周波数 レシプロカル表示 基準クロック 12.8MHz(mode=2) ************
//  入力    input_frequency(周期),      
//  処理    マニュアル処理時の周波数を表示する      
//  出力                                    
//******************************************************************************
void display_F_R1(void){                        //周波数 レシプロカル表示 基準クロック 12.8MHz
    double frequency;
    frequency = 1.28E+13/input_frequency;          //周期から周波数変換
    int_frequency = (unsigned long)frequency;      //整数変換
       
    unsigned char n;
    n = convert_to_DEC(int_frequency);              //バイナリから10進(ASCIIコード)変換 
    switch(n){
        case 10:    display_F_R1_n10();  break;      //MHz表示
        case 9:     display_F_R1_n9();   break;      //MHz表示      
        case 8:     display_F_R1_n8();   break;      //MHz表示
        case 7:     display_F_R1_n7();   break;      //MHz表示
        case 6:     display_F_R1_n6();   break;      //kHz表示
        case 5:     display_F_R1_n5();   break;      //kHz表示
        case 4:     display_F_R1_n4();   break;      //kHz表示
        case 3:     display_F_R1_n3();   break;      //Hz表示
        case 2:     display_F_R1_n2();   break;      //Hz表示
        case 1:     display_F_R1_n1();   break;      //Hz表示
    }    
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=10:MHz表示) **********
void display_F_R1_n10(void){
    led_strings[7]=d10; led_strings[6]=d9;  led_strings[5]=d8;  led_strings[4]=d7+10;
    led_strings[3]=d6;  led_strings[2]=d5;  led_strings[1]=d4;  led_strings[0]=d3;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[MHz]単位表示     
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=9:MHz表示) **********
void display_F_R1_n9(void){
    led_strings[7]=d9;  led_strings[6]=d8;  led_strings[5]=d7+10;  led_strings[4]=d6;
    led_strings[3]=d5;  led_strings[2]=d4;  led_strings[1]=d3;     led_strings[0]=d2;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[MHz]単位表示     
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=8:MHz表示) **********
void display_F_R1_n8(void){
    led_strings[7]=d8;  led_strings[6]=d7+10;  led_strings[5]=d6;  led_strings[4]=d5;
    led_strings[3]=d4;  led_strings[2]=d3;     led_strings[1]=d2;  led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[MHz]単位表示     
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=7:MHz表示) **********
void display_F_R1_n7(void){
    led_strings[7]=255;  led_strings[6]=d7+10;  led_strings[5]=d6;  led_strings[4]=d5;
    led_strings[3]=d4;   led_strings[2]=d3;     led_strings[1]=d2;  led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[MHz]単位表示     
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=6:kHz表示) **********
void display_F_R1_n6(void){
    led_strings[7]=255;  led_strings[6]=0+10;  led_strings[5]=d6;  led_strings[4]=d5;
    led_strings[3]=d4;   led_strings[2]=d3;    led_strings[1]=d2;  led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[kHz]単位表示     
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=5:kHz表示) **********
void display_F_R1_n5(void){
    led_strings[7]=255;  led_strings[6]=0+10;  led_strings[5]=0;    led_strings[4]=d5;
    led_strings[3]=d4;   led_strings[2]=d3;    led_strings[1]=d2;   led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[kHz]単位表示     
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=4:kHz表示) **********
void display_F_R1_n4(void){
    led_strings[7]=255;  led_strings[6]=0+10;  led_strings[5]=0;    led_strings[4]=0;
    led_strings[3]=d4;   led_strings[2]=d3;    led_strings[1]=d2;   led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[kHz]単位表示     
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=3:Hz表示) **********
void display_F_R1_n3(void){
    led_strings[7]=255;   led_strings[6]=0+10;  led_strings[5]=0;    led_strings[4]=0;
    led_strings[3]=0;     led_strings[2]=d3;    led_strings[1]=d2;   led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[kHz]単位表示     
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=2:Hz表示) **********
void display_F_R1_n2(void){
    led_strings[7]=255;   led_strings[6]=0+10;  led_strings[5]=0;    led_strings[4]=0;
    led_strings[3]=0;     led_strings[2]=0;     led_strings[1]=d2;   led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[kHz]単位表示     
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=1:Hz表示) **********
void display_F_R1_n1(void){
    led_strings[7]=255;   led_strings[6]=0+10;  led_strings[5]=0;  led_strings[4]=0;
    led_strings[3]=0;     led_strings[2]=0;     led_strings[1]=0;  led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[kHz]単位表示     
}

//************* 周波数 レシプロカル表示 基準クロック 12.8MHz(mode=2) ************
//  入力    input_frequency(周期),      
//  処理    マニュアル処理時の周波数を表示する      
//  出力                                    
//******************************************************************************
void display_A_R1(void){                        //周波数 レシプロカル表示 基準クロック 12.8MHz
    double frequency;
    frequency = 1.28E+13/input_frequency;          //周期から周波数変換
    int_frequency = (unsigned long)frequency;      //整数変換    
    unsigned char n;
    n = convert_to_DEC(int_frequency);              //バイナリから10進(ASCIIコード)変換 
    switch(n){
        case 10:    display_A_R1_n10();  break;      //MHz表示
        case 9:     display_A_R1_n9();   break;      //MHz表示      
        case 8:     display_A_R1_n8();   break;      //MHz表示
        case 7:     display_A_R1_n7();   break;      //MHz表示
        case 6:     display_A_R1_n6();   break;      //kHz表示
        case 5:     display_A_R1_n5();   break;      //kHz表示
        case 4:     display_A_R1_n4();   break;      //kHz表示
        case 3:     display_A_R1_n3();   break;      //Hz表示
        case 2:     display_A_R1_n2();   break;      //Hz表示
        case 1:     display_A_R1_n1();   break;      //Hz表示
    }                
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=10:kHz4桁表示) **********
void display_A_R1_n10(void){
    led_strings[7]=' ';     led_strings[6]=' ';  led_strings[5]=' ';  led_strings[4]=' ';
    led_strings[3]=d10+10;  led_strings[2]=d9;   led_strings[1]=d8;   led_strings[0]=d7;
    Unit_MHz = 1;   Unit_kHz = 0;   Unit_Hz = 1;                //[kHz]単位表示     
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=9:Hz5桁表示) **********
void display_A_R1_n9(void){
    led_strings[7]=' ';  led_strings[6]=' ';    led_strings[5]=' ';    led_strings[4]=d9;
    led_strings[3]=d8;   led_strings[2]=d7+10;  led_strings[1]=d6;     led_strings[0]=d5;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[Hz]単位表示     
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=8:Hz6桁表示) **********
void display_A_R1_n8(void){
    led_strings[7]=' ';  led_strings[6]=' ';    led_strings[5]=d8;  led_strings[4]=d7+10;
    led_strings[3]=d6;   led_strings[2]=d5;     led_strings[1]=d3;  led_strings[0]=d2;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[MHz]単位表示     
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=7:Hz7桁表示) **********
void display_A_R1_n7(void){
    led_strings[7]=' ';  led_strings[6]=d7+10;  led_strings[5]=d6;  led_strings[4]=d5;
    led_strings[3]=d4;   led_strings[2]=d3;     led_strings[1]=d2;  led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[MHz]単位表示     
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=6:Hz6桁表示) **********
void display_A_R1_n6(void){
    led_strings[7]=' ';  led_strings[6]=0+10;  led_strings[5]=d6;  led_strings[4]=d5;
    led_strings[3]=d4;   led_strings[2]=d3;    led_strings[1]=d2;  led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[kHz]単位表示     
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=5:Hz5桁表示) **********
void display_A_R1_n5(void){
    led_strings[7]=' ';  led_strings[6]=0+10;  led_strings[5]=0;    led_strings[4]=d5;
    led_strings[3]=d4;   led_strings[2]=d3;    led_strings[1]=d2;   led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[kHz]単位表示     
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=4:Hz4桁表示) **********
void display_A_R1_n4(void){
    led_strings[7]=255;  led_strings[6]=0+10;  led_strings[5]=0;    led_strings[4]=0;
    led_strings[3]=d4;   led_strings[2]=d3;    led_strings[1]=d2;   led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[kHz]単位表示     
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=3:Hz3桁表示) **********
void display_A_R1_n3(void){
    led_strings[7]=255;   led_strings[6]=0+10;  led_strings[5]=0;    led_strings[4]=0;
    led_strings[3]=0;     led_strings[2]=d3;    led_strings[1]=d2;   led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[kHz]単位表示     
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=2:Hz2桁表示) **********
void display_A_R1_n2(void){
    led_strings[7]=255;   led_strings[6]=0+10;  led_strings[5]=0;    led_strings[4]=0;
    led_strings[3]=0;     led_strings[2]=0;     led_strings[1]=d2;   led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[kHz]単位表示     
}
//**************** 周波数 レシプロカル表示 基準クロック 12.8MHz (n=1:Hz1桁表示) **********
void display_A_R1_n1(void){
    led_strings[7]=255;   led_strings[6]=0+10;  led_strings[5]=0;  led_strings[4]=0;
    led_strings[3]=0;     led_strings[2]=0;     led_strings[1]=0;  led_strings[0]=d1;
    Unit_MHz = 1;   Unit_kHz = 1;   Unit_Hz = 0;                //[kHz]単位表示     
}

//********************** 周波数/周期 10進変換 **********************************
//  入力    input_binary,
//  処理    バイナリーから10進に変換。何桁目から数字(1-9)が入っているかを出力    
//  出力    d10-d1,                
//******************************************************************************
unsigned char convert_to_DEC(unsigned long input_binaly){     //周波数/周期 10進変換(ASCIIコード)         
    //--- 入力信号を10進(ASCII)に変換する ---        
    convert_binaly_DEC(input_binaly);                      //入力周波数をASCIIコードに変換
        
    //--- 何桁目から数字(1-9)が入っているのかを調べる ---
    char char_place = 1;                                    //<gateTIME:1Sec>   <gateTIME:10Sec>
    if(d1  != 0) char_place = 1;         //LED 1桁文字が1-9(9Hz-1Hz)         (0.9Hz-0.1Hz)
    if(d2  != 0) char_place = 2;         //LED 2桁文字が1-9(90Hz-10Hz)       (9.9Hz-1.0Hz)
    if(d3  != 0) char_place = 3;         //LED 3桁文字が1-9(999Hz-100Hz)     (99.9Hz-10.0Hz)
    if(d4  != 0) char_place = 4;         //LED 4桁文字が1-9(9kHz-1kHz)       (999.9Hz-100.0Hz)
    if(d5  != 0) char_place = 5;         //LED 5桁文字が1-9(99kHz-10kHz)     (9.99kHz-1.0kHz)
    if(d6  != 0) char_place = 6;         //LED 6桁文字が1-9(999kHz-100kHz)   (99.9kHz^10.0kHz)              
    if(d7  != 0) char_place = 7;         //LED 7桁文字が1-9(9MHz-1MHz)       (999.9kHz-100.0kHz)
    if(d8  != 0) char_place = 8;         //LED 8桁文字が1-9(99MHz-10MHz)     (9.99MHz-1.00MHz)
    if(d9  != 0) char_place = 9;         //LED 9桁文字が1-9(999MHz-100MHz)   (99.99MHz-10.00MHz)
    if(d10 != 0) char_place = 10;        //LED 10桁文字が1-9(9GHz-1GHz)      (999.9MHz-100.00MHz)
    return  char_place;
}

//********************** スイッチ処理/全体制御 **********************************
//  入力    mode,SW_up_status,SW_down_status    
//  処理    f_auto_flag=1の時、周波数が3kHz以上の時mode=0,以下の時mode=2で動作する       
//  出力    mode                
//******************************************************************************
void switch_action(void){                           //スイッチ処理/全体制御 
    //--------------------- upスイッチ押下 ----------------------------------------------------
    if(SW_up_status   == 0){    SW_up_status = 1;   //upスイッチ押下
        if(f_auto_flag == 0){                       //マニュアル設定の時 
            f_auto_flag = 1;                        //auto設定にする
            set_led_strings_to_auto();              //LED [AUTO] 表示
        }    
        else{                                       //auto設定の時
            f_auto_flag = 0;                        //マニュアル設定にする
            set_led_strings_to_select();            //LED [SELECT] 表示  
        }
    }
    //------------------ auto設定時の処理(常時動作)-------------------------------------------------------
    if(f_auto_flag == 1){                           //auto設定時の処理(常時動作)    
        if((mode == 2) && (int_frequency > 3000000000)){    //mode=2で 周波数3kHz以上の時 
            mode = 0;                                       //mode=0(1sec ダイレクトカウント)にする     
            process_action();                               //タイミング設定をする
        }
        if(mode == 1){                                      //mode=1の時、mode=0にする
            mode = 0;                                       //mode=0(1sec ダイレクトカウント)にする     
            process_action();                               //タイミング設定をする 
        }
        if((mode == 0) && (int_frequency <= 3000)){         //mode=0で 周波数3kHz以下の時 
            mode = 2;                                       //mode=2(レシプロカウント)にする         
            process_action();                               //タイミング設定をする
        }          
    }
    //--------------------- downスイッチ押下 ----------------------------------------------------
    if(SW_down_status == 0){    SW_down_status = 1;    //downスイッチ押下
        if( f_auto_flag == 0){                        //マニュアル設定時のみ下記の処理が有効
            switch(mode){                                       
                case 0: mode = 1;                           //ゲート時間10Secダイレクトカウントに設定
                    set_led_strings_to_di_10SEC();         //LED表示を[dir 1SEC]にする
                    process_action();
                    break;  
                case 1: mode = 2;                           //レシプロカルカウントに設定
                    set_led_strings_to_recipro();           //LED表示を[recipro ]にする 
                    process_action();
                    break;  
                case 2: mode = 0;                           //ゲート時間1Secダイレクトカウントに設定
                    set_led_strings_to_dir_1SEC();         //LED表示を[di 10SEC]にする
                    process_action();
                    break;
            }
        }
    }
}

//************************** LED表示をAUTOにする ***********************************
//  入力    なし
//  処理    LED表示を0にする
//  出力    led_strings[7] - led_strings[0]
//******************************************************************************
void set_led_strings_to_auto(void){
    led_strings[7]='A';   led_strings[6]='U';   led_strings[5]='T';   led_strings[4]='O';
    led_strings[3]=' ';   led_strings[2]=' ';   led_strings[1]=' ';   led_strings[0]=' ';     
}

//************************** LED表示をSELECTにする ***********************************
//  入力    なし
//  処理    LED表示を0にする
//  出力    led_strings[7] - led_strings[0]
//******************************************************************************
void set_led_strings_to_select(void){
    led_strings[7]='S';   led_strings[6]='E';   led_strings[5]='L';   led_strings[4]='E';
    led_strings[3]='C';   led_strings[2]='T';   led_strings[1]=' ';   led_strings[0]=' ';     
}

//************************** LED表示を[di 10SEC]にする ***********************************
//  入力    なし
//  処理    LED表示をにする
//  出力    led_strings[7] - led_strings[0]
//******************************************************************************
void set_led_strings_to_di_10SEC(void){
    led_strings[7]='d';   led_strings[6]='i';   led_strings[5]=' ';   led_strings[4]='1';
    led_strings[3]='0';   led_strings[2]='S';   led_strings[1]='E';   led_strings[0]='C';     
}

//************************** LED表示を[dir 1SEC]にする ***********************************
//  入力    なし
//  処理    LED表示をにする
//  出力    led_strings[7] - led_strings[0]
//******************************************************************************
void set_led_strings_to_dir_1SEC(void){
    led_strings[7]='d';   led_strings[6]='i';   led_strings[5]='r';   led_strings[4]=' ';
    led_strings[3]='1';   led_strings[2]='S';   led_strings[1]='E';   led_strings[0]='C';     
}

//************************** LED表示[recipro]をにする ***********************************
//  入力    なし
//  処理    LED表示をにする
//  出力    led_strings[7] - led_strings[0]
//******************************************************************************
void set_led_strings_to_recipro(void){
    led_strings[7]='r';   led_strings[6]='e';   led_strings[5]='c';   led_strings[4]='i';
    led_strings[3]='p';   led_strings[2]='r';   led_strings[1]='o';   led_strings[0]=' ';     
}

//******************************************************************************
//************************* MAIN ***********************************************
void main(void) {
    //-------- ポートの設定 ---------
    TRISA = 0x80;   ANSELA = 0;         //
    TRISB = 0xd8;   ANSELB = 0;         //
    TRISC = 0x0c;   ANSELC = 0;         //
    
    //--------- RB4(SW_up),RB3(SW_down)状態変化割込み設定 -----------------
    IOCBNbits.IOCBN4 = 1;               //RB4(SW_up)状態変化割り込み設定
    IOCBFbits.IOCBF4 = 0;               //RB4(SW_up)状態変化割り込みフラグクリア
    IOCBNbits.IOCBN3 = 1;               //RB3(SW_down)状態変化割り込み設定
    IOCBFbits.IOCBF3 = 0;               //RB3(SW_down)状態変化割り込みフラグクリア
    PIE0bits.IOCIE = 1;                 //状態変化割り込みイネーブル
    
    //-------- LED 消灯 --------------
    LED_a=0; LED_b=0; LED_c=0; LED_d=0; LED_e=0; LED_f=0; LED_g=0; LED_dp=0;
    Gate_time=1; Unit_Hz=1; Unit_kHz=1; Unit_MHz=1;
    
    //-------- ポート入力設定 ---------
    T1CKIPPS    = 0x13;                 //RC3(14pin) ⇒ TMR1クロック入力
    T1GPPS      = 0x12;                 //RC2(13pin) ⇒ TMR1ゲート入力
    T4AINPPS    = 0x17;                 //RC7(18pin) ⇒ TMR4クロック入力

    //-------- ポート出力設定 ---------
    RC7PPS      = 0x18;                 //TMR0out ⇒ RC7(18pin)に出力
    
    //-------- 1回だけ実行 --------
    init_TIMER2();                          //TIMER2を2.5msecに設定する
    
    //--- ゲート時間設定 ---
    set_TIMER0(0);                          //TIMER0初期設定(ゲート信号生成 100Hz出力)
    init_TIMER4();                           //TIMER4(ゲート信号発生PWM用カウンタ 101周期)設定
    init_PWM7();                             //PWM7(ゲート信号発生用PWM Duty100:1)設定
 
    mode = 0;                               //周波数 ダイレクト表示  ゲート時間1Sec
    set_led_strings_to_dir_1SEC();          //LED表示を[di 10SEC]にする
    process_action();                       //全体制御処理
    
    //--- 割込み許可 ---
    INTCONbits.PEIE = 1 ;                   // 周辺装置割り込みを許可する
    INTCONbits.GIE  = 1 ;                   // 全割り込み処理を許可する
    
    //---- 繰り返し実行 -----
    while(1){
        display_frequency_period();         //周波数をLEDに表示
    } 
} 

動作確認

以前作ったFREQUENCY SYNTHESIZERの1MHz設定時の周波数を測定した。1.0000166MHzであった。GPSを利用した高精度周波数カウンタでは1.0000182MHzを示していたので、今回の製作で使用した京セラの超高精度クリスタルモジュールの精度が高いことがわかる。