ILF / Mbed 2 deprecated mbed_ILF

Dependencies:   mbed SDFileSystem

Revision:
0:1977c2310ef7
Child:
1:f6a9410c46d2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ILF.cpp	Tue Jan 18 07:54:54 2022 +0000
@@ -0,0 +1,4641 @@
+#include "mbed.h"
+#include "SDFileSystem.h"
+//#include "MODSERIAL.h"
+
+//difine_mbed_LPC1768
+
+/*******************************************************************************
+
+2018.8.31
+ILF Iop汎用器
+
+仕様
+電圧/抵抗測定:12bit
+電流測定:14bit
+
+割込みはP0~P2で可能
+シーケンサスタート信号は、回路図「seq_yobi]で対応
+
+ver1.2.3
+EEPROM通信のコードを修正。
+debug mode の追加
+
+ver1.2.2
+過充電防止検査の上限規格の判定追加
+CAL情報登録画面において、登録項目の順序入替え(過充電防止上限規格の挿入)
+過充電防止上限規格ゼロの場合、判定しない
+
+ver1.2.1
+過充電防止検査の上限規格を新たに設置。
+それに伴い、規格値のメモリ割り当てと、上限規格設定画面を追加。
+
+ver1.2.0
+
+2021.9.7
+
+CAL.LJ21(A1098A05)専用
+発電検出時、高照度条件下でVSS電圧がIC耐圧超える為、VHD-VDD短絡する仕様へ変更(A05)
+200lx下でもVHD-VDD短絡の電圧条件を満たす為、ILFも対応。
+VSS端子でVOC測定をする。その為、VOC測定時以外はVSS端子と測定器を切り離すリレーを
+サブ基板へ取り付け、制御プログラムを追加した。
+CH1:P1_23(LPC1768) (led3_on)
+CH2:P1_22(LPC1768) (led3_off)
+
+アンテナ測定時にアンテナ測定端子切り離し用リレーのON/OFF制御を追加
+(led4_on)
+(led4_off)
+
+ver1.1.0
+1)VFD_SW23 SW31がタッチ感度故障の為、配置替え
+CAL登録画面とMANUAL測定画面
+2)DELETE EEPROM ボタンの配置変更
+3)シーケンサ判定IOの変更
+
+ver1.1.1
+void auto_meas において初期 R[i]の値をクリアすることを追加
+自動測定時、タッチパネルでスタートをやめる(外部IO入力のみ)
+
+ver1.1.2
+過充電防止検査時の電源電圧:VOC検査時の電圧となっていたのを修正。
+
+ver1.1.3
+1)SDカード未挿入の表示を削除
+
+2)R=Hの時間を0.2sから1sへ変更
+
+R5186 ver2.0.3の内容を反映。
+
+未)フラグでR5186系と切替え
+未)測定部ごとにクラス分け(過充電防止のところだけでも)
+
+*******************************************************************************/
+//
+//各種定数
+#define DEB_EN          1       //デバッグイネーブル
+#define RL_EN           1       //1:io[]を外付けのリードリレー制御用に使用する場合は1.以外は0. ver1.2.3
+#define SEQ_EN          0       //1:シーケンサ接続仕様 0:シーケンサ未接続仕様
+#define period_pwm      200     //*us
+#define COP             0.005   //pwm_duty(%) = COP * DATA(0~255)
+#define rsense          1000    //抵抗測定回路のプルアップ抵抗値 1kΩ
+#define res_vref        0x800   //抵抗測定回路のリファレンス電圧 2.048V
+#define dac_vref        2500    //DACのリファレンス電圧 単位[mV]
+#define number_of_channels   2  //測定チャンネル数(MAX 4)
+#define time_discharge  0.5     //discharging time(s)
+#define time_integral   2       //integral time(s)
+#define touch           5       //GU-D タッチパネル感度 0~7で設定。低いほど敏感。
+#define wait_voc        0.5     //[s]VOC測定電圧設定後からリセットまでの時間
+#define wait_reset      0.3     //[s]リセット解除からVOC測定までの時間
+#define wait_poweron    4       //[s]電源投入からリセットまでの時間
+#define time_reset      0.5     //reset Hの時間 ver1.1.3
+#define TIME_RELAY_ON   0.5     //外付けリードリレー用 Ton[s]
+#define TIME_RELAY_OFF  0.2     //外付けリードリレー用 Toff[s]
+
+/***************************************
+RESOLUTION SETTINGS VS. LSB
+ -----------------------------------
+|Resolution Setting  |   LSB        |
+ -----------------------------------
+|    12bits(00)      |   1mv        |
+|    14bits(01)      |   250uV      |
+|    16bits(10)      |   62.5uV     |
+|    18bits(11)      |   15.625uV   |
+ -----------------------------------
+****************************************/
+//ver1.2.0
+const int version_major = 1;    //ソフトバージョン
+const int version_minor = 2;    //ソフトバージョン
+const int version_build = 3;    //ソフトバージョン
+
+//
+//繰り返しタイマー割り込み
+Ticker flipper; /* 初期化 */
+//one shot timer
+Timeout oneshot1;
+Timeout oneshot2;
+Timeout oneshot3;
+Timeout oneshot4;
+//
+//SD-CARD
+SDFileSystem sd(P0_9, P0_8, P0_7, P0_6, "sd"); //SDFileSystem name(mosi, miso, sck, cs, mount);
+//
+//interruput
+InterruptIn seq_yobi(P0_19);
+//
+//start sw
+DigitalIn sw_start(P0_4);
+//
+//DigitalOut
+DigitalOut  houden[]  = {  //  配列を用意します
+    DigitalOut( P2_1 ),  //houden1 配列の1番目の要素を**で初期化したDigitalOutに
+    DigitalOut( P2_0 ),  //houden2
+    DigitalOut( P1_28 ), //houden3
+    DigitalOut( P1_29 )  //houden4
+};
+
+DigitalOut  io[]  = {  //  配列を用意します
+    DigitalOut( P0_25 ),  //io1 配列の1番目の要素をP0_25で初期化したDigitalOutに
+    DigitalOut( P0_26 ),  //io2
+    DigitalOut( P0_23 ),  //io3
+    DigitalOut( P0_24 ),  //io4
+    DigitalOut( P1_22 ),  //io5
+    DigitalOut( P1_23 ),  //io6
+    DigitalOut( P1_24 ),  //io7
+    DigitalOut( P1_25 )   //io8
+};
+
+DigitalOut  range[] = {  //  配列を用意します
+    DigitalOut( P2_3 ),  //range1 配列の1番目の要素を**で初期化したDigitalOutに
+    DigitalOut( P2_2 ),  //range2
+    DigitalOut( P1_26 ), //range3
+    DigitalOut( P1_27 )  //range4
+};
+
+/*
+DigitalOut  led1_green(P0_17);
+DigitalOut  led2_green(P1_31);
+DigitalOut  led1_red(P0_18);
+DigitalOut  led2_red(P1_30);
+*/
+
+DigitalOut  led_green[] = {
+    DigitalOut( P0_17 ),
+    DigitalOut( P1_31 ),
+    DigitalOut( P2_11 ),
+    DigitalOut( P1_18 )
+};
+
+DigitalOut  led_red[] = {
+    DigitalOut( P0_18 ),
+    DigitalOut( P1_30 ),
+    DigitalOut( P2_12 ),
+    DigitalOut( P1_19 )
+};
+//ver1.1.0
+DigitalOut  seq_hantei[] = {
+    DigitalOut( P0_21 ),
+    DigitalOut( P0_22 ),
+    DigitalOut( P3_25 ),
+    DigitalOut( P3_26 )
+};
+
+DigitalOut  seq_busy(P0_20);
+//DigitalIn
+DigitalIn   seq_start(P4_28);
+DigitalIn   seq_cal_a(P2_6);
+DigitalIn   seq_cal_b(P2_7);
+DigitalIn   seq_cal_c(P2_8);
+DigitalIn   seq_kosuu_a(P2_13);
+DigitalIn   seq_kosuu_b(P2_9);
+//DigitalIn   seq_yobi(P0_19);
+
+//
+//PWM
+PwmOut leds[] = {   //配列を用意
+    PwmOut(P2_5),  //LED1
+    PwmOut(P2_4),  //LED2
+    PwmOut(P1_21), //LED3
+    PwmOut(P1_20)  //LED4
+};
+
+//
+//I2C
+I2C i2c(P0_10,P0_11); //(PinName sda, PinName scl) I2Cを定義
+//
+/******************:
+ SD Card
+*******************/
+void sd_writetext(char* text);
+/******************:
+gu-D(表示器) addr:50H
+*******************/
+//parameter_gu256X128C-D903M
+const   int addr_gu = 0x50 << 1; // Address of gu256X128C-D903M
+//
+//prototype
+const int Proportional1 = 0x02;
+//const int Proportional2 = 0x03;
+//const int Proportional3 = 0x04;
+//
+void gu_cls();
+void gu_drawButton(int x, int y, int w, int h, const char *data);
+void gu_cursor(int x, int y);
+void gu_fontsize(const char code);
+void gu_print_dot(int x, int y, const char *ptext);
+void gu_fontWidth(const char fontWidth);
+void gu_print(const char t[] );
+void gu_fontReverse(int code);
+void gu_RealTimeImage_dot(int x, int y, int w, int h, const char data[]);
+void gu_RealTimeImage(int w, int h, char data[]);
+void gu_magnify(int x, int y);
+//
+//オリジナルgu用関数
+void gu_print1(const char* ptext);
+void gu_luminance(const char* cl);
+void gu_touchPara(int x,int y);
+void gu_sendOneByte(char data);
+void utility(); //輝度調整サブルーチン
+void gu_CRLF();
+void gu_reverse(char x);
+void gu_drawbutton_cursor(char x,char y);
+void gu_onebyte(char data);
+//
+//Button Trig Function
+void adjust_illumination();//LED輝度調整サブ
+void gu_initial();//初期設定サブ
+void gu_set_button(char sw_num,char* text);//SWナンバーと表示テキストを指定
+void gu_set_button_font1(char sw_num,char* text);//fontsize = 1
+void gu_button_up(char sw_num); //upボタン表示
+void gu_button_down(char sw_num);//downボタン表示
+void gu_Button_up1();
+void gu_Button_up2();
+void gu_Button_up3();
+void gu_Button_up4();
+void gu_button_up_on(char sw_num);
+void gu_Button_up_on2();
+void gu_Button_down1();
+void gu_Button_down2();
+void gu_Button_down3();
+void gu_Button_down4();
+void gu_button_down_on(char sw_num);
+void gu_Button_down_on2();
+void gu_Button_power_on();
+void gu_Button_power_off();
+
+/***************************
+LCP1768(EEPROM) addr:15H
+***************************/
+//parameter_PCAS08A(EEPROM)
+//const   int addr_EEPROM = 0x15 << 3; // Address of PCAS08A(EEPROM) コメント化 ver1.2.1
+char    rdata[17]; //EEPROMからのリードデータ
+char    wdata[17]; //EEPROMへのライトデータ
+int     Jyushin; //受信成功時 Jyushin=0
+int     Soushin; //送信成功時 Soushin=0
+const   int fixed_adrs = 0x15 << 3; // Address of PCAS08A(EEPROM) 始めの5bit ver1.2.1
+int    adrs_eeprom; //slave address ver1.2.1
+/***************************
+MCP3424(ADC)
+***************************/
+//parameter_ADC(MCP3424)
+const   int addr_ADC1 = 0x6C <<1;//電圧抵抗測定No.1,No.2用ADC
+const   int addr_ADC2 = 0x6A <<1;//電圧抵抗測定No.3,No.4用ADC
+const   int addr_ADC3 = 0x68 <<1;//電流測定No.1,No.2
+const   int addr_ADC4 = 0x6E <<1;//電流測定No.3,No.4
+//
+char hd[] = "0123456789ABCDEF" ;
+//
+//関数
+void    general_call(char com); //power on reset
+char    adc_config(char ch, char rate);
+//
+/***************************
+AD5625RBUZ(DAC) addr:1F
+***************************/
+const   char addr_dac = 0x1F <<1;
+void    dac_out(short mvolt, char addr);
+void    dac_init();
+//
+/***************************
+表示
+関数
+***************************/
+void    select_cal();//CAL選択画面
+void    setup_cal_information(char cal_num);//CAL情報登録画面
+void    manual_int_hyouji();
+void    auto_int_hyouji();
+/***************************
+測定関係
+関数
+***************************/
+void    set_pullup();//シーケンサからの入力ピンのプルアップ設定
+void    trigger();//シーケンサからのスタート信号割込みサブ
+void    calibration();
+void    compute_adc(int adc_con, long *avg);//(ADCのCONFIG, 計算結果)
+void    gu_putdec(short* x);//2byteを10進で表示
+void    gu_putdeck(short* x);//2byteを10進で表示。1/1000.
+void    gu_putdeci(float* x);// ver1.1.4
+void    gu_putdeci_mA(float* x);// ver1.1.4
+void    meas_current_automode(char amount);//AutoMOdeの電流測定サブ iop ocp共通
+void    auto_run();//自動測定モード
+void    auto_meas(char noc);//一括測定。ch:測定する総チャンネル数
+void    meas_sub();//自動測定モード内の繰り返し処理
+void    manual();//手動測定モード
+void    hantei(char noc);//規格値比較エラーフラグ立てる
+void    select_ich(char ch);//電流測定chの選択と設定
+short   read_adc(char addr);//指定addressから2byte読込み
+short   meas_voltage(char ch);//測定チャンネルを指定して、測定値(2byte)を返す
+short   meas_resistor(char ch);//測定チャンネルを指定して、測定値(2byte)を返す
+void    display_resistor(short sdata);//測定値を表示する。
+void    led_off();//判定用LED全消灯
+void    read_syoudo(char* c);//EEPROMから照度データ(PwmDuty)を読み込んでセットする
+
+//
+/***************************
+測定関係
+変数
+***************************/
+char    io_voc; //VOC測定時のIO操作。ON(=VDD)の場合は”0x01"OFF(=OPEN)は"0x00"
+char    err_f[4];//ch1~4 規格外発生時のフラグ 0or1
+short   V[4];//ADC入力値を3倍した値 測定値[V] 16進数
+float   I[4];//電流測定値チャンネル毎の
+short   R[4];//抵抗測定値
+short   voc[4];//ADC入力値を3倍した値 測定値[mV] 16進数
+short   vocp[4];//過充電防止確認用電圧
+float   iop[4];//2byte 補数あり 測定値 1bit 0.01uA
+float   ocp[4];//2byte 補数あり 測定値
+char    ch_num ;//選択中の測定チャネル(0~3)
+
+/**********************
+暫定
+**********************/
+/*
+#define     vss_voc     3600
+#define     vss_iop     2800
+#define     vss_ocp     3600
+#define     wait_vss    4
+#define     wait_io     2
+#define     low_limit_voc   0xCE4//[mv] HEX
+#define     low_limit_iop   0x44C//11uA換算:1100*0.01
+#define     low_limit_ocp   0xFFE2//-0.3uA換算
+*/
+/******************************
+
+    CAL情報登録 -> EEPROM
+
+*******************************/
+#define     caliber_number  6       /* CAL登録数 */
+#define     addr_calnum     0x20    /* 起動時に選択するCALnumber */
+#define     addr_cal1       0x80    /* CAL.No1の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1 */
+#define     addr_cal2       0x90    /* CAL.No2の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
+#define     addr_cal3       0xA0    /* CAL.No3の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
+#define     addr_cal4       0xB0    /* CAL.No4の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
+#define     addr_cal5       0xC0    /* CAL.No5の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
+#define     addr_cal6       0xD0    /* CAL.No6の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
+//ver1.2.1
+//EEPROM BLOCK2へのアドレッシングは、別で初期8bitも制御する必要がある。
+#define     addr_cal1_2     0x00    /* CAL.No1の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
+#define     addr_cal2_2     0x10    /* CAL.No2の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
+#define     addr_cal3_2     0x20    /* CAL.No3の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
+#define     addr_cal4_2     0x30    /* CAL.No4の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
+#define     addr_cal5_2     0x40    /* CAL.No5の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
+#define     addr_cal6_2     0x50    /* CAL.No6の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
+//up to here
+
+//structure
+struct cal_info {
+    short   number;         /* CAL.No. */
+    short   vss_iop;        /* IOP測定時のVss電圧 1bit * 0.01uA*/
+    short   vss_ocp;        /* 過充電防止(over charge protection)測定時のVss電圧 */
+    short   vss_voc;        /* VOC測定時のVss電圧 */
+    short   low_limit_voc;  //1bit * 1mv
+    short   low_limit_iop;  //1bit * 0.01uA
+    short   low_limit_ocp;  //過充電防止検査の上限規格値(プラス側)
+    short   up_limit_ocp;  //過充電防止検査の上限規格値(マイナス側)ver1.2.1追加
+    float   wait_iop;       /* [s]Iop測定前の待機時間 1bit 1s 換算*/
+    float   wait_ocp;       /* [s]過充電防止時消電測定前の待機時間 1bit 1s換算*/
+    short   low_limit_resistor; /* アンテナ抵抗規格 1bit 10Ω*/
+    short   up_limit_resistor; /* アンテナ抵抗規格 1bit 10Ω*/
+} ;
+//parameter
+struct  cal_info calinfo;
+char    reg_num;    /* 選択中の登録CALナンバー */
+//function
+void erace_calinfo();
+void read_regnum();
+void read_caliber(cal_info *cal, int num);
+void write_caliber_information(cal_info *cal, int num);
+
+/*******************************
+
+ set mode interruptin/degitalin
+
+*******************************/
+void set_pullup()
+{
+    sw_start.mode(PullUp);
+    seq_start.mode(PullUp);//シーケンサからのスタート信号
+    seq_cal_a.mode(PullUp);
+    seq_cal_b.mode(PullUp);
+    seq_cal_c.mode(PullUp);
+    seq_kosuu_a.mode(PullUp);
+    seq_kosuu_b.mode(PullUp);
+}
+/*******************************
+
+    Sequence Mode main screen
+
+*******************************/
+void seq()
+{
+    gu_cls();//clear screen
+    gu_fontsize(2);
+    gu_print1("Sequenser Mode");
+
+    //seq_start.fall(&trigger);//スタート信号立下りで割込み
+
+    //シーケンサのトリガ以外は受け付けない
+    while(1) {
+
+        if( seq_start == 0 ) {
+
+            trigger();
+
+        }
+
+        wait(0.3);
+
+    }//while(1)
+}
+
+
+/*******************************
+
+    Strart Sequence
+
+*******************************/
+void trigger()
+{
+    char    meas_num;//測定個数
+    char    cal_num; //CAL選択ナンバー
+    //char    cmd_gu[2];
+
+    gu_cls();//clear screen
+    gu_fontsize(2);
+    gu_print1("Sequenser Mode");
+    gu_fontsize(1);
+    gu_cursor(0,3);
+    gu_print1("start  ");
+    gu_cursor(128,0);
+    gu_print1("CAL.");
+
+    //シーケンサからCAL選択bit読込と表示
+    cal_num = ( seq_cal_c << 2 ) + ( seq_cal_b << 1 ) +  seq_cal_a;
+
+    cal_num = ( ~ cal_num ) & 0x7 ; //3bit入力の負論理
+
+    //read caliber infomation from eeprom
+    if( cal_num >= 1 && cal_num <= 6 ) {
+        read_caliber(&calinfo, cal_num);
+        gu_onebyte( cal_num + 0x30 );//CAL.No.確認用
+    } else {
+        gu_cls();
+        gu_fontsize(1);
+        gu_print1("Cal number error");
+        wait(1);
+
+    }
+
+    meas_num = ( ~(( seq_kosuu_b << 1 ) + seq_kosuu_a )) & 0x3; //2bit負論理
+
+    gu_cursor(128,1);
+    gu_print1("n=");
+    gu_onebyte( meas_num + 0x30 );//測定個数確認用
+
+    seq_busy = 1;//DegitalOut busy
+
+    auto_meas( meas_num );
+
+    //判定結果をシーケンサへ出力
+    hantei( meas_num );
+
+    wait(0.1);
+
+    //測定終了
+    seq_busy = 0;//DegitalOut busy
+
+    //終了表示
+    gu_fontsize(1);
+    gu_cursor(0,3);
+    gu_print1("ready  ");
+
+}
+
+/*******************************
+
+    EEPROMへCAL情報(struct)を保存
+
+*******************************/
+void write_caliber_information(cal_info *cal, int num)
+{
+    char   cdata[17];//1byte
+
+    //EEPROM書込み 先頭アドレス
+    cdata[0] = addr_cal1 + 0x10 * ( num - 1 );
+
+    //データ分割 EEPROM_BYTE 0x00~0x0Bまで
+    cdata[1] = calinfo.vss_iop & 0xFF;//1byte分割
+    cdata[2] = ( calinfo.vss_iop >> 8 ) & 0xFF;//1byte分割
+
+    cdata[3] = calinfo.vss_ocp & 0xFF;//1byte分割
+    cdata[4] = ( calinfo.vss_ocp >> 8 ) & 0xFF;//1byte分割
+
+    cdata[5] = calinfo.vss_voc & 0xFF;//1byte分割
+    cdata[6] = ( calinfo.vss_voc >> 8 ) & 0xFF;//1byte分割
+
+    cdata[7] = calinfo.low_limit_voc & 0xFF;//1byte分割
+    cdata[8] = ( calinfo.low_limit_voc >> 8 ) & 0xFF;//1byte分割
+
+    cdata[9] = calinfo.low_limit_iop & 0xFF;//1byte分割
+    cdata[10] = ( calinfo.low_limit_iop >> 8 ) & 0xFF;//1byte分割
+
+    cdata[11] = calinfo.low_limit_ocp & 0xFF;//1byte分割
+    cdata[12] = ( calinfo.low_limit_ocp >> 8 ) & 0xFF;//1byte分割
+
+    //ver1.1.0
+    cdata[13] = calinfo.wait_iop; //1bitあたり 1s
+    cdata[14] = calinfo.wait_ocp; //1bitあたり 1s
+    /*ver1.1.0
+    cdata[13] = calinfo.wait_iop * 10; //1bitあたり0.1s
+    cdata[14] = calinfo.wait_ocp * 10; //1bitあたり0.1s
+    */
+
+    cdata[15] = calinfo.low_limit_resistor / 10; //1bitあたり10ohm
+    cdata[16] = calinfo.up_limit_resistor / 10;  //1bitあたり10ohm
+
+    Soushin = i2c.write (fixed_adrs, cdata, 17);
+
+    //ver1.2.1
+    wait(0.1);
+
+    char cdata_2[3];
+
+    adrs_eeprom = fixed_adrs + 0x2; //BLOCK2の選択
+
+    cdata_2[0] = addr_cal1_2 + 0x10 * ( num - 1 ); //PAGE選択
+    cdata_2[1] = calinfo.up_limit_ocp & 0xFF;//1byte分割
+    cdata_2[2] = ( calinfo.up_limit_ocp >> 8 ) & 0xFF;//1byte分割
+
+    Soushin = i2c.write (adrs_eeprom, cdata_2, 3);
+    //up to here
+
+}
+/*******************************
+
+    EEPROMからCAL情報を
+    読み出して構造体へ代入する
+
+*******************************/
+void read_caliber(cal_info *cal, int num)
+{
+    signed short    sdata[16];      //CAL設定条件
+    int             i;
+
+    //EEPROMからnumで指定したナンバーのCAL情報を読み出し
+    wdata[0] = addr_cal1 + 0x10 * ( num - 1 );
+    Soushin = i2c.write (fixed_adrs, wdata, 1,true);    //読込先頭アドレス指定 ReStart
+    Jyushin = i2c.read ((fixed_adrs + 0x01), rdata, 16);//read 1byte
+
+    //データ合成 EEPROM_BYTE 0x00~0x0Bまで2byte結合
+    for ( i = 0; i <= 5; i++ ) {
+        sdata[i] = rdata[i*2] | ( rdata[ i*2 + 1 ] << 8 );
+    }
+    sdata[6] = rdata[12];
+    sdata[7] = rdata[13];
+    sdata[8] = rdata[14];
+    sdata[9] = rdata[15];
+
+    cal -> number = num;
+    cal -> vss_iop = sdata[0];
+    cal -> vss_ocp = sdata[1];
+    cal -> vss_voc = sdata[2];
+    cal -> low_limit_voc = sdata[3];
+    cal -> low_limit_iop = sdata[4];
+    cal -> low_limit_ocp = sdata[5];
+    //ver1.1.0
+    cal -> wait_iop = sdata[6];
+    cal -> wait_ocp = sdata[7];
+    /*
+    cal -> wait_iop = sdata[6] / 10;
+    cal -> wait_ocp = sdata[7] / 10;
+    */
+    cal -> low_limit_resistor = sdata[8] * 10;
+    cal -> up_limit_resistor = sdata[9] * 10;
+
+    //ver1.2.3
+    //EEPROMからnumで指定したナンバーのCAL情報を読み出し
+    char            rdata2[2];
+
+    adrs_eeprom = fixed_adrs + 0x02; //BLOCK2
+
+    wdata[0] = addr_cal1_2 + 0x10 * ( num - 1 );
+    Soushin = i2c.write (adrs_eeprom, wdata, 1,true);    //読込先頭アドレス指定 ReStart
+    Jyushin = i2c.read ((adrs_eeprom + 0x01), rdata2, 2);//read 1byte
+
+    //BYTE0~1
+    i = 0;
+    sdata[10] = rdata2[i*2] | ( rdata2[ i*2 + 1 ] << 8 );
+
+    cal -> up_limit_ocp = sdata[10];
+    //ver1.2.1 up to here
+
+}
+/*******************************
+
+    EEPROMからCAL登録番号を読出し
+
+*******************************/
+void read_regnum()
+{
+    wdata[0] = addr_calnum;
+    Soushin = i2c.write (fixed_adrs, wdata, 1,true);   //読込先頭アドレス指定 ReStart
+    Jyushin = i2c.read ((fixed_adrs + 0x01), rdata, 1);//read 1byte
+
+    reg_num = rdata[0];
+}
+/*******************************
+
+    EEPROMからCAL登録情報全消去
+
+*******************************/
+void erace_calinfo()
+{
+    int i;
+
+    reg_num = 0x01;
+    wdata[0] = addr_calnum;    //word address 書込み先頭アドレス指定
+    wdata[1] = reg_num;
+    Soushin = i2c.write (fixed_adrs, wdata, 2);
+
+    wait(0.2);
+
+    wdata[0] = addr_cal1;
+    for( i = 1; i <= 16; i++) { //1page全消去
+        wdata[i] = 0x00;
+    }
+    Soushin = i2c.write (fixed_adrs, wdata, 17);
+
+    wait(0.2);
+
+    wdata[0] = addr_cal2;
+    for( i = 1; i <= 16; i++) { //1page全消去
+        wdata[i] = 0x00;
+    }
+    Soushin = i2c.write (fixed_adrs, wdata, 17);
+
+    wait(0.2);
+
+    wdata[0] = addr_cal3;
+    for( i = 1; i <= 16; i++) { //1page全消去
+        wdata[i] = 0x00;
+    }
+    Soushin = i2c.write (fixed_adrs, wdata, 17);
+
+    wait(0.2);
+
+    wdata[0] = addr_cal4;
+    for( i = 1; i <= 16; i++) { //1page全消去
+        wdata[i] = 0x00;
+    }
+    Soushin = i2c.write (fixed_adrs, wdata, 17);
+
+    wait(0.2);
+
+    wdata[0] = addr_cal5;
+    for( i = 1; i <= 16; i++) { //1page全消去
+        wdata[i] = 0x00;
+    }
+    Soushin = i2c.write (fixed_adrs, wdata, 17);
+
+    wait(0.2);
+
+    wdata[0] = addr_cal6;
+    for( i = 1; i <= 16; i++) { //1page全消去
+        wdata[i] = 0x00;
+    }
+    Soushin = i2c.write (fixed_adrs, wdata, 17);
+
+    //ver1.2.1
+    //BLOCK2の消去
+    wait(0.2);
+
+    adrs_eeprom = fixed_adrs + 0x02; //BLOCK2
+
+    wdata[0] = addr_cal1_2;
+    for( i = 1; i <= 16; i++) { //1page全消去
+        wdata[i] = 0x00;
+    }
+    Soushin = i2c.write (adrs_eeprom, wdata, 17);
+
+    wait(0.2);
+
+    wdata[0] = addr_cal2_2;
+    for( i = 1; i <= 16; i++) { //1page全消去
+        wdata[i] = 0x00;
+    }
+    Soushin = i2c.write (adrs_eeprom, wdata, 17);
+
+    wait(0.2);
+
+    wdata[0] = addr_cal3_2;
+    for( i = 1; i <= 16; i++) { //1page全消去
+        wdata[i] = 0x00;
+    }
+    Soushin = i2c.write (adrs_eeprom, wdata, 17);
+
+    wait(0.2);
+
+    wdata[0] = addr_cal4_2;
+    for( i = 1; i <= 16; i++) { //1page全消去
+        wdata[i] = 0x00;
+    }
+    Soushin = i2c.write (adrs_eeprom, wdata, 17);
+
+    wait(0.2);
+
+    wdata[0] = addr_cal5_2;
+    for( i = 1; i <= 16; i++) { //1page全消去
+        wdata[i] = 0x00;
+    }
+    Soushin = i2c.write (adrs_eeprom, wdata, 17);
+
+    wait(0.2);
+
+    wdata[0] = addr_cal6_2;
+    for( i = 1; i <= 16; i++) { //1page全消去
+        wdata[i] = 0x00;
+    }
+    Soushin = i2c.write (adrs_eeprom, wdata, 17);
+
+    wait(0.2);
+
+    //up to herever1.2.1
+
+}
+/******************************************
+
+    ADC(MCP3424) Configuration Register
+
+    ch : Channel Selection Bit
+        00 = Select Channel 1
+        01 = Select Channel 2
+        10 = Select Channel 3
+        11 = Select Channel 4
+
+    rate : Sample Rate Selection Bit
+        00 = 240 SPS(12bits)
+        01 = 60 SPS(14bits)
+        10 = 15 SPS(16bits)
+        11 = 3.75 SPS(18bits)
+
+******************************************/
+char adc_config(char ch, char rate)
+{
+    char confreg;   //Configuration Register 1byte
+
+    char rdy = 0;   //Ready Bit
+    char cm = 1;    //Conversion Mode Bit
+    char gain = 0;  //PGA Gain Selection Bits
+
+    confreg = (( rdy & 0x1 ) << 7 ) + (( ch & 0x3) << 5 ) + (( cm & 0x1 ) << 4) + (( rate  & 0x3 ) << 2) + ( gain & 0x3 ) ;
+
+    return( confreg );
+}
+/******************************************
+
+    ADC(MCP3424) Configuration Register
+    電流測定チャンネルの選択
+    char ch : 1~4ch
+
+******************************************/
+void select_ich(char ch)
+{
+    char    com;
+
+    switch ( ch ) {
+        case 0:
+            com =  adc_config( 0, 1 );//ADC3_ch1選択 14bits
+            i2c.write( addr_ADC3, &com, 1 );
+            break;
+        case 1:
+            com =  adc_config( 1, 1 );//ADC3_ch2選択 14bits
+            i2c.write( addr_ADC3, &com, 1 );
+            break;
+        case 2:
+            com =  adc_config( 0, 1 );//ADC4_ch1選択 14bits
+            i2c.write( addr_ADC4, &com, 1 );
+            break;
+        case 3:
+            com =  adc_config( 1, 1 );//ADC4_ch2選択 14bits
+            i2c.write( addr_ADC4, &com, 1 );
+            break;
+    }
+}
+/******************************************
+
+    ADC(MCP3424)
+    指定addressから2byte読込み
+
+******************************************/
+short read_adc(char addr)//指定addressから2byte読込み
+{
+    char cdata[2];//1byte
+    short sdata;//2byte
+
+    i2c.read( addr + 0x01, cdata, 2);
+
+    //connect 2byte
+    sdata = cdata[0] & 0xFF;
+    sdata = ( sdata << 8 ) | cdata[1];
+
+    return ( sdata );
+}
+/*****************************
+
+    AUTO/SEQ Mode
+
+    ワンショットタイマー発生イベント
+
+    For Current measurement
+     a recurring interrupt to repeatedly call a function at a specified rate.
+
+*****************************/
+void flip_ch1()
+{
+    short sdata;
+
+    sdata = read_adc( addr_ADC3 );
+
+    I[0] = sdata * 5 * 0.25;
+
+    //次の測定chへ切替
+    select_ich(1);
+}
+
+void flip_ch2()
+{
+    short sdata;
+
+    sdata = read_adc( addr_ADC3 );
+
+    I[1] = sdata * 5 * 0.25;
+
+    //次の測定chへ切替
+    select_ich(2);
+}
+
+void flip_ch3()
+{
+    short sdata;
+
+    sdata = read_adc( addr_ADC4 );
+
+    I[2] = sdata * 5 * 0.25;
+
+    //次の測定chへ切替
+    select_ich(3);
+}
+
+void flip_ch4()
+{
+    short sdata;
+
+    sdata = read_adc( addr_ADC4 );
+
+    I[3] = sdata * 5 * 0.25;
+
+    //次の測定chへ切替 無し
+}
+
+/*****************************
+
+    Manual Mode
+
+    繰り返しタイマー発生イベント
+
+    For Current measurement
+     a recurring interrupt to repeatedly call a function at a specified rate.
+
+*****************************/
+void flip()
+{
+    short   sdata; //_2byte reading data of ADC
+    float   fdata; // ver1.1.4
+
+    switch ( ch_num ) {
+        case 0:
+        case 1:
+            sdata = read_adc( addr_ADC3 );
+            break;
+        case 2:
+        case 3:
+            sdata = read_adc( addr_ADC4 );
+            break;
+    }
+
+    //sdata = sdata * 5 * 0.25;//プリアンプのGAINが1/5なのでここで5倍.ADC14bit分解能で、1bitあたり0.25mv
+    /*ver1.1.4*/
+    fdata = sdata * 5 * 0.25;//プリアンプのGAINが1/5なのでここで5倍.ADC14bit分解能で、1bitあたり0.25mv
+
+    gu_cursor(0,4);
+    gu_print1(" ");
+    /*ver1.1.4*/
+    gu_putdeci(&fdata);
+    //gu_putdeci(&sdata);
+
+    houden[ ch_num ] = 1; //Discharge
+
+    wait(time_discharge); //Discharge time
+
+    houden[ ch_num ] = 0; //charging
+
+}
+/*********************************
+    Manual Mode
+    initial screen
+*********************************/
+void manual_int_hyouji()
+{
+
+    /* 画面表示 */
+    gu_cls();
+    gu_fontsize(2); //change fontsize
+    gu_fontWidth(Proportional1);
+    gu_print1("Manual Mode");
+
+    gu_cursor(0, 2);
+    gu_print1("CH.");
+    gu_cursor(40, 14);
+    gu_print1("vss");
+    gu_cursor(192, 14);
+    gu_print1("ch.");
+    /*
+    gu_cursor(128, 14);
+    gu_print1("slct ch.");
+    */
+
+    //操作ボタン配置
+    gu_Button_power_on();//メニューへ戻る
+    gu_button_up(27);//印加電圧増加
+    gu_button_down(28);//印加電圧減少
+    gu_button_up(32);//ch切替
+    //gu_button_down(32);//ch切替
+
+    //Show Reset button(LEFT)
+    gu_set_button(25,"R");
+
+}
+/*********************************
+
+    Manual Mode (Main)
+
+*********************************/
+void manual()
+{
+
+    char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
+    char cswdata; // 0x00 or 0x01
+    char crdata[3];
+    char *pcswnum = &cswnum;
+    char *pcswdata = &cswdata;
+    int i;
+    int j;
+    float interval;//繰り返し測定間隔(s) <- 積分時間と、繰り返し割込みサブ中のwait(放電時間)も足す
+    short vss;
+    short sdata;
+    int r_flag;
+    float ima;
+    short ssdata;
+
+    ch_num = 0; //初期電流測定CH.
+
+    interval = time_integral + time_discharge ;//繰り返し割込みの間隔設定
+    flipper.attach(&flip, interval);
+
+    read_regnum();//CAL登録No.読込
+    read_caliber(&calinfo, reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入
+
+    /* 初期表示 */
+    manual_int_hyouji();
+    //選択測定チャンネルの表示
+    gu_fontsize(2); //change fontsize
+    gu_cursor(24, 2);
+    wdata[0] = ( ch_num + 1 ) + 0x30;
+    i2c.write( addr_gu, wdata, 1);
+
+    //初期測定設定
+    //set range
+    range[0] = 1;//ch.1 10uA測定レンジ
+    //select channel
+    wdata[0] =  adc_config( 0, 1 );//ADC3_ch1選択 14bits
+    i2c.write( addr_ADC3, wdata, 1 );
+
+    vss = calinfo.vss_iop;
+
+    //apply Vss to all channel
+    for ( i = 0; i <= (number_of_channels - 1); i++) {
+        dac_out( calinfo.vss_iop,i); //Vss設定 DAC
+    }
+
+    gu_cursor(0,8);
+    gu_print1("Vss ");
+
+    gu_cursor(64,8);
+    sdata = -1 * vss;
+    gu_putdeck( &sdata );
+    gu_print1("V");
+
+    while(1) {
+
+        crdata[0] = 0;
+        crdata[1] = 0;
+        crdata[2] = 0;
+
+        //タッチパネルスイッチ読込
+        Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+        if (crdata[0] == 0x11 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
+            *pcswnum = crdata[1]; //スイッチ番号
+            *pcswdata = crdata[2];//ON/OFF情報
+
+            if (cswdata == 0x01) { //タッチしたならば
+                switch( cswnum ) { //SWの番号(位置)
+
+                    case 26:
+                        //gu_reverse(0x01);                         //gu_リバース指定
+                        //gu_button_up(27);//印加電圧増加
+
+                        if ( vss < 4500 ) {
+                            vss = vss + 100;
+                        }
+
+                        //apply Vss to all channel
+                        for ( i = 0; i <= (number_of_channels - 1); i++) {
+                            dac_out( vss,i); //Vss設定 DAC
+                        }
+
+                        gu_reverse(0x00);
+                        gu_cursor(64,8);
+                        sdata = -1 * vss;
+                        gu_putdeck( &sdata );
+                        gu_print1("V");
+
+                        //gu_button_up(27);//印加電圧減少
+
+                        wait(0.1);
+
+                        break;
+
+                    case 27:
+                        //gu_reverse(0x01);                         //gu_リバース指定
+                        //gu_button_down(28);//印加電圧減少
+
+                        if ( vss >= 100 ) {
+                            vss = vss - 100;
+                        }
+
+                        //apply Vss to all channel
+                        for ( i = 0; i <= (number_of_channels - 1); i++) {
+                            dac_out( vss,i); //Vss設定 DAC
+                        }
+
+                        //gu_reverse(0x00);                         //gu_リバース指定
+                        gu_cursor(64,8);
+                        sdata = -1 * vss;
+                        gu_putdeck( &sdata );
+                        gu_print1("V");
+
+                        //gu_button_down(28);//印加電圧減少
+
+                        wait(0.1);
+
+                        break;
+
+                    case 0x07 ://Exit
+
+                        gu_Button_power_off();//電源ボタンイメージ反転表示
+
+                        //割り込み停止
+                        flipper.detach();
+
+                        for( i = 0; i <= 3; i++) {
+                            houden[i] = 1;//discharge
+                        }
+
+                        wait( time_discharge );
+                        //set measuring range
+                        for( i = 0; i <= 3; i++) {
+                            range[i] = 0;//range 1mA
+                            houden[i] = 0;//not discharge
+                        }
+
+                        wait(0.2);
+
+                        for ( i = 0; i <= 7; i++)
+                            io[i] = 0; //全てのio"L"
+
+                        return;//この関数を抜ける
+
+                    case 0x18 ://sw25 mv_reset
+
+                        //gu_リバース指定
+                        gu_reverse(0x01);
+                        //Show Reset button(Left)
+                        gu_set_button(25,"R");
+
+                        wait(0.1);
+
+                        gu_reverse(0x00); //gu_リバース解除
+                        gu_set_button(25,"R"); //Show Reset button(Left)
+
+                        io[ch_num] = 1;
+
+                        //set measuring range  ver1.1.0
+                        for( i = 0; i <= 3; i++)
+                            range[i] = 0;//range 1mA
+
+                        r_flag = 1;
+
+                        //割り込み停止
+                        flipper.detach();
+
+                        break;
+
+                    case 31 ://sw32 CH選択
+
+                        //gu_reverse(0x01);//gu_リバース指定
+                        //gu_button_up(32);
+                        //gu_reverse(0x00);//gu_リバース解除
+
+                        if ( ch_num < ( number_of_channels - 1 )) {
+                            ch_num = ch_num + 1;
+                        } else {
+                            ch_num = 0;
+                        } //ver1.1.0
+
+                        select_ich(ch_num);//ADC測定CHの変更
+
+                        //set measuring range
+                        for( i = 0; i <= 3; i++)
+                            range[i] = 0; //range 1mA
+
+                        range[ch_num] = 1; //range 10uA
+
+                        //選択測定チャンネルの表示
+                        gu_cursor(24, 2);
+                        wdata[0] = ( ch_num + 1 ) + 0x30;
+                        i2c.write( addr_gu, wdata, 1);
+
+                        //gu_button_up(32);
+
+                        wait(0.1);
+
+                        break;
+
+                        /*
+                        case 0x1F ://sw32 CH選択
+
+                            //gu_reverse(0x01);//gu_リバース指定
+                            //gu_button_down(32);
+                            //gu_reverse(0x00);//gu_リバース解除
+
+                            if ( ch_num >= 1 )
+                                ch_num = ch_num - 1;
+
+                            select_ich(ch_num);//ADC測定CHの変更
+
+                            //set measuring range
+                            for( i = 0; i <= 3; i++)
+                                range[i] = 0;
+
+                            range[ ch_num ] = 1; //range 10uA
+
+                            //選択測定チャンネルの表示
+                            gu_cursor(24, 2);
+                            wdata[0] =( ch_num + 1 ) + 0x30;
+                            i2c.write( addr_gu, wdata, 1);
+
+                            //gu_button_down(32);
+
+                            wait(0.1);
+
+                            break;
+                        */
+
+                } //switch
+                Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+            }//if
+        }//if
+
+        //ver1.1.0
+        if ( j >= 5 ) {
+            io[ch_num] = 0;
+            range[ ch_num ] = 1; //range 10uA
+            r_flag = 0;
+            j = 0;
+            flipper.attach(&flip, interval);//割込み開始
+        }
+
+        if ( r_flag == 1 ) {
+            j = j + 1;
+
+            //R=Hの時の電流測定(1ma renge)
+            select_ich( ch_num );
+            ssdata = read_adc( addr_ADC3 );
+            ima = ssdata * 5 * 0.25;
+
+            gu_cursor(0,4);
+            gu_fontsize(2);
+            gu_print1(" ");
+            gu_putdeci_mA(&ima);
+        }
+
+        //電圧測定
+        //ver1.2.0
+        if (RL_EN == 1) {
+            switch (ch_num) {
+                case 0:
+                    io[4] = 1; //外付けリレーON
+                    wait(TIME_RELAY_ON);
+                    break;
+                case 1:
+                    io[5] = 1; //外付けリレーON
+                    wait(TIME_RELAY_ON);
+                    break;
+            }
+        }
+        //up to here
+
+        sdata = meas_voltage( ch_num ) * -1 ;
+
+        //ver1.2.0
+        if (RL_EN == 1) {
+            io[4] = 0; //外付けリレーOFF
+            io[5] = 0; //外付けリレーOFF
+        }
+        //up to here
+
+        gu_fontsize(2);
+        gu_cursor(108,4);
+        gu_putdeck(&sdata);
+        gu_print1("V");
+
+        //抵抗測定
+        sdata = meas_resistor( ch_num );
+
+        gu_fontsize(2);
+        gu_cursor(192,4);
+
+        display_resistor( sdata ); //抵抗値表示サブ
+
+        wait( 0.1 );
+
+    }//While
+}
+
+/*****************************
+
+    I2C General Call
+
+*****************************/
+void general_call(char com)
+{
+    char    cmd[1];
+
+    cmd[0]= com;
+    i2c.write(0x00, cmd, 1); //General Call
+}
+/*******************************************************************************
+
+    MAIN
+
+*******************************************************************************/
+int main(void)
+{
+    while(1) {
+
+        wait(0.2);
+
+        set_pullup();
+
+        general_call(0x06); //ADC power on reset
+
+        dac_init(); //DAC 初期化
+
+        gu_initial();//初期画面へ
+        //utility();
+    }
+}                                                                               //main end
+
+void gu_initial()
+{
+    char cmd_gu[32] ;   //gu-DへのI2Cコマンド用配列 1byte0
+    //char *pcmd = cmd_gu;
+    char clumi; //輝度設定用変数 01h<=n<=08h
+    char* pclumi = &clumi; //ポインタの定義
+    char crdata[3];
+    char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
+    char cswdata; // 0x00 or 0x01
+    char *pcswnum = &cswnum;
+    char *pcswdata = &cswdata;
+    char csyoudo[4];
+    int i;
+    float duty_pwm;
+
+
+    for ( i = 0; i <= ( number_of_channels - 1 ); i++) {
+        leds[i].period_us(period_pwm); //Set tha PWM period(us)
+    }
+
+
+    duty_pwm = 0; //表示器立ち上がるまでLEDOFF
+
+    for( i = 0; i <= 3; i++) {
+        leds[i].write(duty_pwm);//Set Duty
+    }
+
+
+    i2c.frequency(100000); //gu_D I2Cクロックレート(HZ) 400khz以下
+
+    cmd_gu[0]= 0x1B;
+    cmd_gu[1]= 0x40;
+    i2c.write(addr_gu, cmd_gu, 2); //gu-D ESC 初期化
+    wait(0.2);
+
+    //メモリ00h番地(GU_D輝度設定データ)読み出し
+    wdata[0] = 0x00;
+    Soushin = i2c.write (fixed_adrs, wdata, 1,true);    //読込先頭アドレス指定 ReStart
+    Jyushin = i2c.read ((fixed_adrs + 0x01), rdata, 1);//read 1byte
+    *pclumi = rdata[0];
+    //輝度設定更新
+    if(*pclumi==0x00 || *pclumi > 0x08) *pclumi=0x05;
+    gu_luminance(pclumi);
+
+    gu_fontsize(2); //change fontsize
+    //ver1.2.3
+    //gu_print1("ILF Iop/Voc/O.C.P/R");
+    gu_print1("ILF mode selectiion");
+    //upto
+    //gu_CRLF();//CR+LF
+    //gu_print1("Settings");
+    gu_fontsize(1);
+    gu_cursor(192,1);
+    gu_print1("ver");
+    gu_onebyte( version_major + 0x30 );
+    gu_print1(".");
+    gu_onebyte( version_minor + 0x30 );
+    gu_print1(".");
+    gu_onebyte( version_build + 0x30 );
+
+    gu_touchPara(0,touch);//タッチ感度 00h~07h
+
+    //MODE選択用ボタンの表示
+    gu_set_button(9,"");
+    gu_set_button(17,"");
+    gu_set_button(25,"");
+    gu_set_button(13,"");
+    gu_set_button(21,"");
+    gu_set_button(29,"");
+    //LED Brighness
+    gu_fontsize(2);
+    gu_cursor(36,32/8);
+    gu_print1("CAL");
+    gu_cursor(36,64/8);
+    gu_print1("LUX");
+    //gu_cursor(36,80/8);
+    //gu_print1("illumi");
+    //Display Brightness
+    gu_cursor(36,96/8);
+    gu_print1("Utility");
+    //Auto MODE
+    gu_cursor(164,32/8);
+    gu_print1("Auto");
+    //Manual Mode
+    gu_cursor(164,64/8);
+    gu_print1("Manual");
+    //Sequenser Mode
+    gu_cursor(164,96/8);
+    gu_print1("SEQ");
+
+    /**********************
+     SDカードファイルオープン
+    **********************/
+
+    mkdir("/sd/mydir", 0777);
+
+    FILE *fp = fopen("/sd/mydir/iop.csv", "ab+");//ディレクトリとファイル名の指定
+
+    if(fp == NULL) {
+        /*ver1.1.3
+        gu_fontsize(1);
+        gu_cursor(0,2);
+        gu_print1("Could not open file for SD card");
+        */
+    } else {
+        fprintf(fp, "NewData  R IOP OCP VOC");
+        fprintf(fp, "\n");
+        fclose(fp);
+    }
+    /**********************
+        LED照度初期設定
+    **********************/
+    read_syoudo( csyoudo );
+
+    //gu-D タッチスイッチ読み出し動作設定 p49
+    cmd_gu[0]= 0x1F;
+    cmd_gu[1]= 0x4B;
+    cmd_gu[2]= 0x18;
+    cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2
+    i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+    while(1) {
+        //タッチスイッチ読み出し
+        i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+        if (crdata[0] == 0x11 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
+            *pcswnum = crdata[1]; //スイッチ番号
+            *pcswdata = crdata[2];//ON/OFF情報
+
+            if (cswdata == 0x01) { //タッチしたならば
+                switch( cswnum ) { //SWの番号(位置)
+
+                    case 0x08 ://SW9 CAL登録画面
+                        //gu_リバース指定
+                        gu_reverse(0x01);
+                        //Show Button
+                        gu_set_button(9,"");
+                        wait(0.1);
+                        //gu_リバース解除
+                        gu_reverse(0x00);
+
+                        select_cal();//CAL選択画面へ移動
+
+                        return;
+
+                    case 0x10 ://SW17
+                        //gu_リバース指定
+                        gu_reverse(0x01);
+                        //Show Button
+                        gu_set_button(17,"");
+                        wait(0.1);
+                        //gu_リバース解除
+                        gu_reverse(0x00);
+
+                        adjust_illumination();//LED照度調整へ移動
+
+                        return;
+
+                    case 0x18 ://SW25
+                        //gu_リバース指定
+                        gu_reverse(0x01);
+                        //Show Button
+                        gu_set_button(25,"");
+                        wait(0.1);
+                        //gu_リバース解除
+                        gu_reverse(0x00);
+
+                        utility();//画面輝度調整へ移動
+
+                        return;
+
+                    case 0x0C ://SW13 自動測定モード
+                        //gu_リバース指定
+                        gu_reverse(0x01);
+                        //Show Button
+                        gu_set_button(13,"");
+                        wait(0.1);
+                        //gu_リバース解除
+                        gu_reverse(0x00);
+
+                        auto_run();
+
+                        return;
+
+                    case 0x14 ://SW21 手動測定モード
+                        //gu_リバース指定
+                        gu_reverse(0x01);
+                        //Show Button
+                        gu_set_button(21,"");
+                        wait(0.1);
+                        //gu_リバース解除
+                        gu_reverse(0x00);
+
+                        manual();
+
+                        return;
+
+                    case 0x1C ://SW29 シーケンサ制御モード
+                        //gu_リバース指定
+                        gu_reverse(0x01);
+                        //Show Button
+                        gu_set_button(29,"");
+                        wait(0.1);
+                        //gu_リバース解除
+                        gu_reverse(0x00);
+
+                        seq();
+
+                        return;
+
+                } //switch
+
+            }//if(cswdata == 0x01) {
+        } //if(crdata[0] == 0x11 ) {
+
+        wait(0.1);//タッチスイッチ入力読み出し間隔
+
+    } //while(1) {
+
+}
+
+/*********************************
+
+    CAL選択画面 sub
+
+*********************************/
+void show_info(int n)
+{
+    short sdata[6];
+
+    read_caliber(&calinfo,n);
+
+    //読出したCAL情報の表示
+    gu_fontsize(1);
+    gu_cursor(0,2);
+    gu_print1("No.");
+    gu_putdec(&calinfo.number);
+    gu_cursor(0,3);
+    gu_print1("Vss(Iop) =");
+    sdata[0] = -1 * calinfo.vss_iop;
+    gu_putdeck(&sdata[0]);
+    gu_print1("V ");
+    gu_cursor(0,4);
+    gu_print1("Vss(ocp) =");
+    sdata[1] = -1 * calinfo.vss_ocp;
+    gu_putdeck(&sdata[1]);
+    gu_print1("V ");
+    gu_cursor(0,5);
+    gu_print1("Vss(Voc) =");
+    sdata[2] = -1 * calinfo.vss_voc;
+    gu_putdeck(&sdata[2]);
+    gu_print1("V ");
+}
+/*********************************
+
+    CAL選択画面 #CAL登録画面
+
+*********************************/
+void select_cal()
+{
+    char crdata[3];
+    char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
+    char cswdata; // 0x00 or 0x01
+    char *pcswnum = &cswnum;
+    char *pcswdata = &cswdata;
+    char calnum;    //選択したCALナンバー
+    //short sdata[3]; //印加電圧表示用wr
+
+    calnum = 0;//initial
+
+    gu_cls();
+
+    read_regnum();//EEPROMに保存した選択CAL_NO.の読み出し
+
+    show_info(reg_num);
+
+    /*
+    read_caliber(&calinfo,reg_num);
+
+    //読出したCAL情報の表示
+    gu_fontsize(1);
+    gu_cursor(0,2);
+    gu_print1("No.");
+    gu_putdec(&calinfo.number);
+    gu_cursor(0,3);
+    gu_print1("Vss(Iop) =");
+    sdata[0] = -1 * calinfo.vss_iop;
+    gu_putdeck(&sdata[0]);
+    gu_print1("V ");
+    gu_cursor(0,4);
+    gu_print1("Vss(ocp) =");
+    sdata[1] = -1 * calinfo.vss_ocp;
+    gu_putdeck(&sdata[1]);
+    gu_print1("V ");
+    gu_cursor(0,5);
+    gu_print1("Vss(Voc) =");
+    sdata[2] = -1 * calinfo.vss_voc;
+    gu_putdeck(&sdata[2]);
+    gu_print1("V ");
+    */
+
+    gu_fontsize(2); //change fontsize
+    gu_cursor(0,0);
+    gu_print1("Select CAL.");
+    //Set Button
+    gu_set_button(17,"1");
+    gu_set_button(19,"2");
+    gu_set_button(21,"3");
+    gu_set_button(25,"4");
+    gu_set_button(27,"5");
+    gu_set_button(29,"6");
+    gu_set_button_font1(7,"slct");
+    gu_set_button_font1(8,"reg");
+    //gu_set_button_font1(32,"del"); //ver1.1.0
+
+
+    while(1) {
+        //タッチスイッチ読み出し
+        i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+        if (crdata[0] == 0x11 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
+            *pcswnum = crdata[1]; //スイッチ番号
+            *pcswdata = crdata[2];//ON/OFF情報
+
+            if (cswdata == 0x01) { //タッチしたならば
+                switch( cswnum ) { //SWの番号(位置)
+
+                    case 0x10:  //SW17
+
+                        gu_reverse(0x01);   //gu_リバース指定
+                        gu_set_button(17,"1");
+                        gu_reverse(0x00);   //gu_リバース解除
+                        gu_set_button(19,"2");
+                        gu_set_button(21,"3");
+                        gu_set_button(25,"4");
+                        gu_set_button(27,"5");
+                        gu_set_button(29,"6");
+
+                        calnum = 1;
+
+                        show_info(calnum);
+
+                        break;
+
+                    case 0x12:  //SW19
+
+                        gu_reverse(0x01);   //gu_リバース指定
+                        gu_set_button(19,"2");
+                        gu_reverse(0x00);   //gu_リバース解除
+                        gu_set_button(17,"1");
+                        gu_set_button(21,"3");
+                        gu_set_button(25,"4");
+                        gu_set_button(27,"5");
+                        gu_set_button(29,"6");
+
+                        calnum = 2;
+
+                        show_info(calnum);
+
+                        break;
+
+                    case 0x14:  //SW21
+
+                        gu_reverse(0x01);   //gu_リバース指定
+                        gu_set_button(21,"3");
+                        gu_reverse(0x00);   //gu_リバース解除
+                        gu_set_button(17,"1");
+                        gu_set_button(19,"2");
+                        //gu_set_button(21,"3");
+                        gu_set_button(25,"4");
+                        gu_set_button(27,"5");
+                        gu_set_button(29,"6");
+
+                        calnum = 3;
+
+                        show_info(calnum);
+
+                        break;
+
+                    case 0x18:  //SW25
+
+                        gu_reverse(0x01);   //gu_リバース指定
+                        gu_set_button(25,"4");
+                        gu_reverse(0x00);   //gu_リバース解除
+                        gu_set_button(17,"1");
+                        gu_set_button(19,"2");
+                        gu_set_button(21,"3");
+                        //gu_set_button(25,"4");
+                        gu_set_button(27,"5");
+                        gu_set_button(29,"6");
+
+                        calnum = 4;
+
+                        show_info(calnum);
+
+                        break;
+
+                    case 0x1A:  //SW27
+
+                        gu_reverse(0x01);   //gu_リバース指定
+                        gu_set_button(27,"5");
+                        gu_reverse(0x00);   //gu_リバース解除
+                        gu_set_button(17,"1");
+                        gu_set_button(19,"2");
+                        gu_set_button(21,"3");
+                        gu_set_button(25,"4");
+                        //gu_set_button(27,"5");
+                        gu_set_button(29,"6");
+
+                        calnum = 5;
+
+                        show_info(calnum);
+
+                        break;
+
+                    case 0x1C:  //SW29
+
+                        gu_reverse(0x01);   //gu_リバース指定
+                        gu_set_button(29,"6");
+                        gu_reverse(0x00);   //gu_リバース解除
+                        gu_set_button(17,"1");
+                        gu_set_button(19,"2");
+                        gu_set_button(21,"3");
+                        gu_set_button(25,"4");
+                        gu_set_button(27,"5");
+                        //gu_set_button(29,"6");
+
+                        calnum = 6;
+
+                        show_info(calnum);
+
+                        break;
+
+                    case 0x06:  //SW7 CAL選択ボタン
+
+                        if ( calnum >= 1 && calnum <=6 ) {
+                            reg_num = calnum;
+
+                            //EEPROM書込み
+                            wdata[0] = addr_calnum;    //word address 書込み先頭アドレス指定
+                            wdata[1] = reg_num;
+                            Soushin = i2c.write (fixed_adrs, wdata, 2);
+
+                            gu_reverse(0x01);   //gu_リバース指定
+                            gu_set_button_font1(7,"slct");
+                            wait(0.2);
+                            gu_reverse(0x00);   //gu_リバース解除
+
+                            read_caliber(&calinfo,reg_num);
+                            return;
+
+                        } else if( calnum == 0 ) {
+                            //CALNo.選択しなければ、何もしないでこのサブを抜ける
+                            gu_reverse(0x01);   //gu_リバース指定
+                            gu_set_button_font1(7,"slct");
+                            wait(0.2);
+                            gu_reverse(0x00);   //gu_リバース解除
+                            return;
+                        }
+
+                        break;
+
+                    case 0x07:  //SW8
+
+                        if ( calnum >= 1 && calnum <= 6 ) {
+                            gu_reverse(0x01);   //gu_リバース指定
+                            gu_set_button_font1(8,"reg");
+                            wait(0.2);
+                            gu_reverse(0x00);   //gu_リバース解除
+
+                            setup_cal_information(calnum);//CAL情報登録画面へ
+                            return;
+                        }
+                        break;
+
+                        /*ver1.1.0
+                        case 0x1F:  //SW32
+
+                            gu_reverse(0x01);   //gu_リバース指定
+                            gu_set_button_font1(32,"del");
+                            gu_reverse(0x00);   //gu_リバース解除
+
+                            erace_calinfo();
+
+                            gu_set_button_font1(32,"del");
+
+                            break;
+                        */
+
+                } //switch
+
+            }//if(cswdata == 0x01) {
+        } //if(crdata[0] == 0x11 ) {
+        wait(0.1);//タッチスイッチ入力読み出し間隔
+    } //while(1)
+}
+
+/*********************************
+
+    CAL情報登録画面 サブルーチン
+    表示パラメータ
+    x=0 : vss_iop[V]
+    x=1 : vss_ocp[V]
+    x=2 : vss_voc[V]
+    x=3 : low_limit_voc[V]
+    x=4 : low_limit_iop[uA]
+    x=5 : low_limit_ocp[uA]
+    x=6 : wait_iop[s]
+    x=7 : wait_ocp[s]
+    x=8 : low_limit_resistor[Ω]
+    x=9 : up_limit_resistor[Ω]
+
+    ver1.2.2
+    up_limit_ocp[]の追加と
+    順序の入替え
+
+    x=6 : up_limit_ocp[]
+    x=7 : wait_iop[s]
+    x=8 : wait_ocp[s]
+    x=9 : low_limit_resistor[Ω]
+    x=10 : up_limit_resistor[Ω]
+
+*********************************/
+void hyouji_cal_param(char x)
+{
+    gu_fontsize(2);
+    gu_cursor(0,4);
+    gu_print1("                                ");
+
+    switch ( x ) {
+        case 0:
+            gu_cursor(0,4);
+            gu_print1("Vss(Iop)");
+            gu_cursor(208,4);
+            gu_print1("[V]");
+            break;
+        case 1:
+            gu_cursor(0,4);
+            gu_print1("Vss(O.C.P)");
+            gu_cursor(208,4);
+            gu_print1("[V]");
+            break;
+        case 2:
+            gu_cursor(0,4);
+            gu_print1("Vss(Voc)");
+            gu_cursor(208,4);
+            gu_print1("[V]");
+            break;
+        case 3:
+            gu_cursor(0,4);
+            gu_print1("low limit(Voc)");
+            gu_cursor(208,4);
+            gu_print1("[V]");
+            break;
+        case 4:
+            gu_cursor(0,4);
+            gu_print1("low limit(Iop)");
+            gu_cursor(208,4);
+            gu_print1("[uA]");
+            break;
+        case 5:
+            gu_cursor(0,4);
+            gu_print1("low limit(O.C.P)");
+            gu_cursor(208,4);
+            gu_print1("[uA]");
+            break;
+        //ver1.2.2
+        case 6:
+            gu_cursor(0,4);
+            gu_print1("up limit(O.C.P)");
+            gu_cursor(208,4);
+            gu_print1("[uA]");
+            break;
+        case 7:
+            gu_cursor(0,4);
+            gu_print1("Wait(Iop)");
+            gu_cursor(208,4);
+            gu_print1("[s]");
+            break;
+        case 8:
+            gu_cursor(0,4);
+            gu_print1("Wait(O.C.P)");
+            gu_cursor(208,4);
+            gu_print1("[s]");
+            break;
+        case 9:
+            gu_cursor(0,4);
+            gu_print1("low limit(ohm)");
+            gu_cursor(208,4);
+            wdata[0] = 0xEA; //Ω
+            i2c.write( addr_gu, wdata, 1);
+            break;
+        case 10:
+            gu_cursor(0,4);
+            gu_print1("up limit(ohm)");
+            gu_cursor(208,4);
+            wdata[0] = 0xEA; //Ω
+            i2c.write( addr_gu, wdata, 1);
+            break;
+            //ver1.2.2 up to here
+
+    }
+}
+
+/*********************************
+
+    CAL情報登録画面 sub
+    para    kind of parameter
+    idata   data value
+    inc     add number  ex)0x64 0x0A 0x01
+
+*********************************/
+void increase_param(char para, signed short *sdata, short inc)
+{
+    switch ( para ) { //パラメータの項目によって上限値異なる
+        case 0://vss_iop
+        case 1://vss_ocp
+        case 2://vss_voc
+        case 3://low_limit_voc
+            if(*sdata <= ( 4999 - inc )) {
+                *sdata = *sdata + inc ;
+            }
+            break;//switch ( param ){
+
+        case 4://low_limit_iop
+        case 5://low_limit_o.c.p
+            if(*sdata <= ( 2500 - inc / 10 )) {
+                *sdata = *sdata + inc /10 ;
+            }
+            break;//switch ( param )
+        case 7://wait_iop
+        case 8://wait_ocp
+
+            if(*sdata <= ( 2550 - inc / 10 )) {
+                *sdata = *sdata + inc / 10 ;
+            }
+            break;//switch ( param )
+
+        case 9:
+        case 10:
+            if(*sdata <= ( 2550 - inc )) {
+                *sdata = *sdata + inc;
+            }
+            break;
+
+        //ver1.2.2
+        case 6://up_limit_o.c.p
+            if(*sdata <= ( 2500 - inc / 10 )) {
+                *sdata = *sdata + inc /10 ;
+            }
+            break;//switch ( param )
+            //ver1.2.1 up to here
+
+    }//switch ( param ){
+}
+
+void decrease_param(char para, signed short *sdata, short dec)
+{
+    switch ( para ) { //パラメータの項目によって上限値異なる
+        case 0://vss_iop
+        case 1://vss_ocp
+        case 2://vss_voc
+        case 3://low_limit_voc
+
+            if(*sdata >= dec ) {
+                *sdata = *sdata - dec;
+            }
+            break;
+
+        case 4://low_limit_iop
+
+            if(*sdata >= dec / 10 ) {
+                *sdata = *sdata - dec / 10;
+            }
+            break;
+
+        case 5://low_limit_o.c.p
+
+            if(*sdata >= -2500 + dec / 10 ) {
+                *sdata = *sdata - dec / 10;
+            }
+            break;
+
+        case 7://wait_iop
+        case 8://wait_ocp
+
+            if(*sdata >= dec / 10 ) {
+                *sdata = *sdata - dec / 10 ;
+            }
+            break;//switch ( param )
+
+        case 9:
+        case 10:
+            if(*sdata >= dec ) {
+                *sdata = *sdata - dec;
+            }
+            break;
+
+        //ver1.2.1
+        case 6://up_limit_o.c.p
+
+            if(*sdata >= -2500 + dec / 10 ) {
+                *sdata = *sdata - dec / 10;
+            }
+            break;
+            //ver1.2.1 ここまで
+
+    }//switch ( param ){
+}
+/*********************************
+
+    CAL情報登録画面   MAIN
+    別途システム設計図,EEPROMのシートを参照
+    param:
+        0:vss_iop
+        1:vss_ocp
+        2:vss_voc
+        3:low_limit_voc
+        4:low_limit_iop
+        5:low_limit_ocp
+        6:up_limit_ocp ver1.2.2
+        7:wait_iop
+        8:wait_ocp
+        9:LowLimitResistor
+        10:UPLimitResistor
+
+*********************************/
+void setup_cal_information(char cal_num)   //xは登録ナンバー=EEPROMのPAGEナンバーex)登録No.1→BLOCK0x00 PAGE0x00
+{
+    char            param;              //設定するパラメータの選択 0~9まで ver1.2.1 0~10まで
+    char            crdata[3];
+    signed short    sdata_cal[16];      //CAL設定条件
+    signed short    hyouji_data;
+    int             param_sum;            //設定するパラメータの数 ver1.2.1
+    //int i;
+    //short           sdata_byte[16];     //EEPROM BYTEごとのDATA 1byte
+    //char          cmd_gu[32];         //gu-DへのI2Cコマンド用配列 1byte0
+    //char            adrs_cal;           //EEPROM CAL情報を保存しているアドレス 0x90~
+
+    param_sum = 11; //ver1.2.1
+
+    //画面表示
+    gu_cls();//画面のクリア
+    gu_fontsize(2);
+    gu_print1("Setup Cal No.");
+    wdata[0] = ( cal_num % 10 ) + 0x30;//CALナンバーの表示
+    i2c.write(addr_gu, wdata, 1);
+
+    //CAL情報読込
+    read_caliber(&calinfo,cal_num);
+
+    sdata_cal[0] = calinfo.vss_iop;
+    sdata_cal[1] = calinfo.vss_ocp;
+    sdata_cal[2] = calinfo.vss_voc;
+    sdata_cal[3] = calinfo.low_limit_voc;
+    sdata_cal[4] = calinfo.low_limit_iop;
+    sdata_cal[5] = calinfo.low_limit_ocp;
+    //ver1.2.2
+    sdata_cal[6] = calinfo.up_limit_ocp;
+    sdata_cal[7] = calinfo.wait_iop;
+    sdata_cal[8] = calinfo.wait_ocp;
+    sdata_cal[9] = calinfo.low_limit_resistor;
+    sdata_cal[10] = calinfo.up_limit_resistor;
+    /*
+    sdata_cal[6] = calinfo.wait_iop;
+    sdata_cal[7] = calinfo.wait_ocp;
+    sdata_cal[8] = calinfo.low_limit_resistor;
+    sdata_cal[9] = calinfo.up_limit_resistor;
+    */
+    //ver1.2.2 up to here
+
+    //ボタンの配置
+    gu_set_button_font1(8,"reg");
+    gu_button_up(17);
+    gu_button_down(25);
+
+    gu_button_up(20);
+    gu_button_up(22);
+    gu_button_up(24);
+    gu_button_down(28);
+    gu_button_down(30);
+    gu_button_down(32);
+
+    /*
+    gu_button_up(21);
+    gu_button_up(22);
+    gu_button_up(23);
+    gu_button_down(29);
+    gu_button_down(30);
+    gu_button_down(31);
+    */
+
+    //初期表示はVss_Iop
+    param = 0;
+    gu_cursor(0,4);
+    gu_fontsize(2);
+    gu_print1("Vss(Iop)");
+    gu_cursor(208,4);
+    gu_print1("V");
+
+    while(1) {
+        i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+        if (crdata[0] == 0x11 && crdata[2] == 0x01 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。&& タッチしたならば
+            //cswnum = crdata[1]; //スイッチ番号
+            //cswdata = crdata[2];//ON/OFF情報
+
+            switch( crdata[1] ) { //SWの番号(位置)
+
+                /* ver1.2.1
+                case 0x10 ://sw17 パラメータ変更スイッチ(上)
+
+                    if ( param <= 8 ) {
+                        param = param + 1;
+                    } else {
+                        param = 0;
+                    }
+
+                    hyouji_cal_param(param);//設定パラメータ表示
+                    break;
+
+                case 0x18 ://sw25 パラメータ変更スイッチ(下)
+
+                    if ( param >= 1 ) {
+                        param = param - 1;
+                    } else {
+                        param = 9;
+                    }
+
+                    hyouji_cal_param(param);//設定パラメータ表示
+                    break;
+                */
+
+                case 0x10 ://sw17 パラメータ変更スイッチ(上)
+
+                    if ( param <= param_sum -2 ) {
+                        param = param + 1;
+                    } else {
+                        param = 0;
+                    }
+
+                    hyouji_cal_param(param);//設定パラメータ表示
+                    break;
+
+                case 0x18 ://sw25 パラメータ変更スイッチ(下)
+
+                    if ( param >= 1 ) {
+                        param = param - 1;
+                    } else {
+                        param = param_sum - 1;
+                    }
+
+                    hyouji_cal_param(param);//設定パラメータ表示
+                    break;
+
+                //ver1.2.1 up to here
+
+                case 19 ://SW20 increase 0x3E8
+
+                    increase_param(param, &sdata_cal[param], 1000);
+                    break;
+
+                case 27 ://SW28 decrease 0x3E8
+
+                    decrease_param(param, &sdata_cal[param], 1000);
+                    break;
+
+                case 0x15 ://SW22 increase 0x64
+
+                    increase_param(param, &sdata_cal[param], 100);
+                    break;
+
+                case 0x1D ://SW30 decrease 0x64
+
+                    decrease_param(param, &sdata_cal[param], 100);
+                    break;
+
+                case 23 ://SW24 increase 0x0A
+
+                    increase_param(param, &sdata_cal[param], 10);
+                    break;
+
+                case 31 ://SW32 decrease 0x0A
+
+                    decrease_param(param, &sdata_cal[param], 10);
+                    break;
+
+
+                case 0x07 ://保存ボタン
+
+                    calinfo.vss_iop = sdata_cal[0];
+                    calinfo.vss_ocp = sdata_cal[1];
+                    calinfo.vss_voc = sdata_cal[2];
+                    calinfo.low_limit_voc = sdata_cal[3];
+                    calinfo.low_limit_iop = sdata_cal[4];
+                    calinfo.low_limit_ocp = sdata_cal[5];
+                    //ver1.2.2
+                    calinfo.up_limit_ocp = sdata_cal[6];
+                    calinfo.wait_iop = sdata_cal[7];
+                    calinfo.wait_ocp = sdata_cal[8];
+                    calinfo.low_limit_resistor = sdata_cal[9];
+                    calinfo.up_limit_resistor = sdata_cal[10];
+                    /*
+                    calinfo.wait_iop = sdata_cal[6];
+                    calinfo.wait_ocp = sdata_cal[7];
+                    calinfo.low_limit_resistor = sdata_cal[8];
+                    calinfo.up_limit_resistor = sdata_cal[9];
+                    */
+                    //ver1.2.2 up to here
+
+                    reg_num = cal_num;
+
+                    //CALNO.EEPROM書込み
+                    wdata[0] = addr_calnum;    //word address 書込み先頭アドレス指定
+                    wdata[1] = reg_num;
+                    Soushin = i2c.write (fixed_adrs, wdata, 2);
+
+                    wait(0.2);
+
+                    //CAL情報
+                    //送信完了ならば実行
+                    if(Soushin == 0) {
+
+                        write_caliber_information(&calinfo, cal_num);
+
+                        //ver1.2.3
+                    } else {
+                        gu_fontsize(1);
+                        gu_cursor(0,2);
+                        gu_print1("can not save cal no");
+                        wait(2);
+                        return;
+                    }
+
+                    //送信完了ならば実行
+                    if(Soushin == 0) {
+                        gu_reverse(1);
+                        gu_set_button_font1(8,"reg");
+                        wait(0.2);
+                        return;//CAL情報登録画面を抜ける
+
+                        //ver1.2.3
+                    } else {
+                        gu_fontsize(1);
+                        gu_cursor(0,2);
+                        gu_print1("can not save cal information");
+                        wait(2);
+                        return;
+                    }
+
+                    //break;
+
+            } //switch
+        } //if
+        //gu-D表示
+        gu_cursor(150,4);
+
+        switch ( param ) {
+            case 0://vss_iop
+            case 1://vss_ocp
+            case 2://vss_voc
+            case 3://low_limit_voc
+                hyouji_data = sdata_cal[param] * -1;
+                gu_putdeck ( &hyouji_data );
+                break;
+            case 4:
+            case 5:
+                hyouji_data = sdata_cal[param] * 10;
+                gu_putdeck ( &hyouji_data );
+                break;
+            //ver1.2.2
+            case 6:
+                hyouji_data = sdata_cal[param] * 10;
+                gu_putdeck ( &hyouji_data );
+                break;
+            case 7:
+            case 8:
+                //ver1.1.0
+                hyouji_data = sdata_cal[param];
+                gu_putdec ( &hyouji_data );
+                break;
+            case 9://low_limit_resistor
+            case 10://up_limit_resistor
+                hyouji_data = sdata_cal[param];
+                gu_putdec ( &hyouji_data );
+                break;
+                /*
+                case 6:
+                case 7:
+                    //ver1.1.0
+                    hyouji_data = sdata_cal[param];
+                    gu_putdec ( &hyouji_data );
+                    break;
+                case 8://low_limit_resistor
+                case 9://up_limit_resistor
+                    hyouji_data = sdata_cal[param];
+                    gu_putdec ( &hyouji_data );
+                    break;
+                */
+                //ver1.2.2 uptohere
+
+        }
+        wait(0.1);//gu-D 読込間隔の設定
+    }//while
+}
+
+/*********************************
+
+    Auto Mode (sub)
+    自動測定モード 初期画面
+
+*********************************/
+void auto_int_hyouji()
+{
+    //short st;
+    char cmd_gu[32] ;   //gu-DへのI2Cコマンド用配列 1byte
+
+    gu_cls();
+    gu_fontsize(1);
+    gu_print1("AUTO MODE CAL No.");
+    cmd_gu[0] = reg_num + 0x30;
+    i2c.write(addr_gu, cmd_gu, 1);
+    gu_Button_power_on();//show button
+
+}
+/*******************************************************
+
+    Auto Mode (Main)
+    自動測定モード 画面
+    ver1.04 パネルタッチ -> スタートスイッチで測定開始へ変更
+
+*******************************************************/
+void auto_run()
+{
+    char cmd_gu[32] ;   //gu-DへのI2Cコマンド用配列 1byte
+    char crdata[6];
+    //char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
+    //int     i;
+    //float   fdata[4][4];//ファイル出力用
+    //short   sdata[4];
+    //short   s;
+
+    read_regnum();//CAL登録No.読込
+    read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入
+
+    auto_int_hyouji();
+
+    //dac_init(); //DAC 初期化
+
+    //gu-D タッチスイッチ読み出し動作設定 p49
+    cmd_gu[0]= 0x1F;
+    cmd_gu[1]= 0x4B;
+    cmd_gu[2]= 0x18;
+    cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2
+    i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+    wait(0.1);
+
+    Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+    while(1) {
+
+        //スタートスイッチで測定開始
+        if ( sw_start == 0 ) {
+            meas_sub();
+        }
+
+        wait(0.1);
+
+        crdata[0] = 0;
+        crdata[1] = 0;
+        crdata[2] = 0;
+
+        i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+        if ( crdata[0] == 0x11 && crdata[2] == 1 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
+
+            //cswnum = crdata[1]; //スイッチ番号
+            //cswdata = crdata[2];//ON/OFF情報
+
+            //gu-D タッチスイッチ読み出し動作設定 p49
+            cmd_gu[0]= 0x1F;
+            cmd_gu[1]= 0x4B;
+            cmd_gu[2]= 0x18;
+            cmd_gu[3]= 0x00;//SW状態変化時自動送信モード2解除
+            i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+            if ( crdata[1] == 7 ) {
+
+                gu_Button_power_off();//電源ボタンイメージ反転表示
+                wait(0.5);
+
+                led_off();//LED全消灯
+
+                return;//この関数を抜ける
+
+            }   //end if
+
+            /* ver 1.1.1 タッチパネルで測定開始を削除
+            else {
+
+                meas_sub();//測定用サブ
+
+
+            } //else if
+            */
+
+            //gu-D タッチスイッチ読み出し動作設定 p49
+            cmd_gu[0]= 0x1F;
+            cmd_gu[1]= 0x4B;
+            cmd_gu[2]= 0x18;
+            cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2解除
+            i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+            wait(0.1);
+
+            i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+        }//if
+        wait(0.1);
+    }//While
+}
+
+/*
+    char cmd_gu[32] ;   //gu-DへのI2Cコマンド用配列 1byte
+    char crdata[6];
+    char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
+    //int     i;
+    //float   fdata[4][4];//ファイル出力用
+    //short   sdata[4];
+    //short   s;
+
+    read_regnum();//CAL登録No.読込
+    read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入
+
+    auto_int_hyouji();
+
+    //dac_init(); //DAC 初期化
+
+    //gu-D タッチスイッチ読み出し動作設定 p49
+    cmd_gu[0]= 0x1F;
+    cmd_gu[1]= 0x4B;
+    cmd_gu[2]= 0x18;
+    cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2
+    i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+    wait(0.1);
+
+    Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+    while(1) {
+
+        wait(0.1);
+
+        crdata[0] = 0;
+        crdata[1] = 0;
+        crdata[2] = 0;
+
+        i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+        if ( crdata[0] == 0x11 && crdata[2] == 1 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
+            cswnum = crdata[1]; //スイッチ番号
+            //cswdata = crdata[2];//ON/OFF情報
+
+            //gu-D タッチスイッチ読み出し動作設定 p49
+            cmd_gu[0]= 0x1F;
+            cmd_gu[1]= 0x4B;
+            cmd_gu[2]= 0x18;
+            cmd_gu[3]= 0x00;//SW状態変化時自動送信モード2解除
+            i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+            //SWの番号(位置)
+            if ( cswnum == 7 ) {
+
+                gu_Button_power_off();//電源ボタンイメージ反転表示
+                wait(0.5);
+
+                led_off();//LED全消灯
+
+                return;//この関数を抜ける
+
+            }
+
+            //gu-D タッチスイッチ読み出し動作設定 p49
+            cmd_gu[0]= 0x1F;
+            cmd_gu[1]= 0x4B;
+            cmd_gu[2]= 0x18;
+            cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2解除
+            i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+            wait(0.1);
+
+            i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+        } else if ( sw_start == 0 ) { //if
+
+            auto_int_hyouji();
+
+            gu_cursor(0,2);
+            gu_print1("Please Wait..");
+            gu_fontsize(2);
+
+            read_regnum();//CAL登録No.読込
+
+            read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入
+
+            auto_meas( number_of_channels );//2個測定
+
+            hantei( number_of_channels );//判定LED
+
+            wait(0.5);
+
+            gu_fontsize(1);
+            gu_cursor(0,2);
+            gu_print1("READY           ");
+
+        }
+        wait(0.1);
+    }//While
+}
+*/
+
+/*
+void auto_run()
+{
+    char cmd_gu[32] ;   //gu-DへのI2Cコマンド用配列 1byte
+    char crdata[6];
+    char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
+    //int     i;
+    //float   fdata[4][4];//ファイル出力用
+    //short   sdata[4];
+    //short   s;
+
+    read_regnum();//CAL登録No.読込
+    read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入
+
+    auto_int_hyouji();
+
+    //dac_init(); //DAC 初期化
+
+    //gu-D タッチスイッチ読み出し動作設定 p49
+    cmd_gu[0]= 0x1F;
+    cmd_gu[1]= 0x4B;
+    cmd_gu[2]= 0x18;
+    cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2
+    i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+    wait(0.1);
+
+    Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+    while(1) {
+
+        wait(0.1);
+
+        crdata[0] = 0;
+        crdata[1] = 0;
+        crdata[2] = 0;
+
+        i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+        if ( crdata[0] == 0x11 && crdata[2] == 1 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
+            cswnum = crdata[1]; //スイッチ番号
+            //cswdata = crdata[2];//ON/OFF情報
+
+            //gu-D タッチスイッチ読み出し動作設定 p49
+            cmd_gu[0]= 0x1F;
+            cmd_gu[1]= 0x4B;
+            cmd_gu[2]= 0x18;
+            cmd_gu[3]= 0x00;//SW状態変化時自動送信モード2解除
+            i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+            //SWの番号(位置)
+            if ( cswnum == 7 ) {
+
+                gu_Button_power_off();//電源ボタンイメージ反転表示
+                wait(0.5);
+
+                led_off();//LED全消灯
+
+                return;//この関数を抜ける
+
+            } else {
+
+                auto_int_hyouji();
+
+                gu_cursor(0,2);
+                gu_print1("Please Wait..");
+                gu_fontsize(2);
+
+                read_regnum();//CAL登録No.読込
+
+                read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入
+
+                auto_meas( number_of_channels );//2個測定
+
+                hantei( number_of_channels );//判定LED
+
+                wait(0.5);
+
+                gu_fontsize(1);
+                gu_cursor(0,2);
+                gu_print1("READY           ");
+
+            } //else if
+
+            //gu-D タッチスイッチ読み出し動作設定 p49
+            cmd_gu[0]= 0x1F;
+            cmd_gu[1]= 0x4B;
+            cmd_gu[2]= 0x18;
+            cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2解除
+            i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+            wait(0.1);
+
+            i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+        }//if
+
+        wait(0.1);
+
+    }//While
+
+}
+*/
+
+/*********************************
+
+    Auto Mode (Sub)
+
+*********************************/
+void meas_sub()
+{
+    auto_int_hyouji();
+
+    gu_cursor(0,2);
+    gu_print1("Please Wait..");
+    gu_fontsize(2);
+
+    read_regnum();//CAL登録No.読込
+
+    read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入
+
+    auto_meas( number_of_channels );//2個測定
+
+    hantei( number_of_channels );//判定LED
+
+    wait(0.5);
+
+    gu_fontsize(1);
+    gu_cursor(0,2);
+    gu_print1("READY           ");
+
+}
+
+/*********************************
+
+    Auto Mode/SEQ Mode (sub)
+    自動測定
+    char noc -> 総測定数 1~4
+
+*********************************/
+void auto_meas(char noc)
+{
+    int     x[4] = {0,0,128,128};   //GU_D x座標 4個測定時の表示スタート位置
+    int     y[4] = {5,11,5,11};     //GU_D y座標 4個測定時の表示スタート位置
+    int     iy  ;                   //GU_D y座標 2個測定時の表示スタート位置
+    int     i;
+    float   fdata[4][4];//ファイル出力用
+    short   sdata[4];
+
+    iy = 4;//GU_D 2個測定時の測定値の表示開始位置 y座標
+
+    if ( noc > 4 ) {
+        noc = 4;
+    }
+
+    //値の初期化
+    for ( i = 0; i <= 3; i++) {
+        I[i] = 0;
+        R[i] = 0;   //ver 1.1.1
+        iop[i] = 0;
+        voc[i] = 0;
+        ocp[i] = 0;
+    }
+
+    //判定用LED消灯
+    led_off();
+
+    //電源投入
+    for ( i = 0; i <= ( noc - 1 ); i++) {
+        dac_out( calinfo.vss_iop,i); //Vss設定 DAC_A~D
+    }
+
+    wait( wait_poweron );//パワーブレイク復帰待機?
+
+    //Reset CAL
+    for ( i = 0; i <= ( noc -1 ); i++) {
+        io[i] = 1; //io1 = "H"
+    }
+
+    wait(time_reset); //ver1.1.3
+    //wait(0.2);
+
+    for ( i = 0; i <= ( noc -1 ); i++) {
+        io[i] = 0; //io1 = "L"
+    }
+
+    //抵抗測定
+    for ( i = 0; i <= ( noc -1 ); i++ ) {
+        R[i] = meas_resistor(i);
+    }
+
+    //display GU_D
+    if ( number_of_channels <= 2 ) { //2個測定の時の表示
+        gu_fontsize(2);
+        gu_cursor(0,iy);
+        gu_print1("[ch.1]");
+        gu_cursor(128,iy);
+        gu_print1("[ch.2]");
+        //CH.1 表示
+        gu_cursor(0, iy + 2);
+        gu_print1("R     ");
+        display_resistor( R[0] );
+        //CH.2 表示
+        gu_cursor(128, iy + 2);
+        gu_print("R     ");
+        display_resistor( R[1] );
+    } else if( number_of_channels >= 3) { //3.4個測定の時の表示
+        gu_fontsize(1);
+        gu_cursor(x[0],y[0]);
+        gu_print1("ch.1");
+        gu_cursor(x[1],y[1] );
+        gu_print1("ch.2");
+        gu_cursor(x[2],y[2]);
+        gu_print1("ch.3");
+
+        if ( number_of_channels == 4 ) {
+            gu_cursor(x[3],y[3]);
+            gu_print1("ch.4");
+        }
+
+        //CH.1~4 表示
+        for ( i = 0; i <= ( number_of_channels - 1 ); i++) {
+            gu_cursor( x[i], y[i] + 1 );//x座標指定
+            gu_print1("R      ");
+            display_resistor( R[i] );
+        }
+    }
+
+    //iop測定
+    wait(calinfo.wait_iop);//Vss印加~リセット後からiop測定までの待機時間
+
+    meas_current_automode( noc );//電流測定サブ 測定値をI[]へ代入
+
+    for( i = 0; i <= ( noc - 1) ; i++) {
+        iop[i] = I[i];
+    }
+
+    //display GU_D
+    if ( number_of_channels <= 2 ) { //2個測定の時の表示
+        gu_cursor(0, iy + 4 );//IOP測定値表示位置指定
+        gu_print1("Iop   ");
+        gu_putdeci(&iop[0]);
+        gu_cursor(128, iy + 4 );
+        gu_print1("Iop   ");
+        gu_putdeci(&iop[1]);
+    } else {
+        //CH.1~4 表示
+        for ( i=0; i <= ( number_of_channels - 1 ); i++) {
+            gu_cursor( x[i], y[i] + 2 ); //x座標指定
+            gu_print1("Iop   ");
+            gu_putdeci(&iop[i]);
+        }
+    }
+
+    wait(0.01);
+
+    //過充電防止時電流測定
+    for ( i = 0; i <= ( noc - 1 ); i++) {
+        dac_out( calinfo.vss_ocp,i); //Vss設定 DAC_A~D //ver1.1.2
+    }
+
+    wait( calinfo.wait_ocp );
+
+    meas_current_automode( noc );
+
+    for( i = 0; i <= ( noc - 1) ; i++) {
+        ocp[i] = I[i];
+    }
+
+    //display GU_D
+    if ( number_of_channels <= 2 ) { //2個測定の時の表示
+        gu_cursor(0, iy + 6 );//IOP測定値表示位置指定
+        gu_print1("OCP   ");
+        gu_putdeci(&ocp[0]);
+        gu_cursor(128, iy + 6 );
+        gu_print1("OCP   ");
+        gu_putdeci(&ocp[1]);
+    } else {
+        //CH.1~4 表示
+        for ( i=0; i <= ( number_of_channels - 1 ); i++) {
+            gu_cursor( x[i], y[i] + 3 ); //x座標指定
+            gu_print1("OCP   ");
+            gu_putdeci(&ocp[i]);
+        }
+    }
+
+    //VOC測定
+    for ( i = 0; i <= ( noc - 1 ); i++) {
+        dac_out( calinfo.vss_voc,i); //Vss設定 DAC_A~D
+    }
+
+    wait( wait_voc );
+
+    for ( i = 0; i <= ( noc -1 ); i++) {
+        io[i] = 1; //io1 = "H"
+    }
+
+    wait( wait_reset );
+
+    for ( i = 0; i <= ( noc -1 ); i++ ) {
+
+        //ver1.2.0
+        if (RL_EN == 1) {
+            switch (i) {
+                case 0:
+                    io[4] = 1; //外付けリレーON
+                    wait(TIME_RELAY_ON);
+                case 1:
+                    io[5] = 1; //外付けリレーON
+                    wait(TIME_RELAY_ON);
+            }
+        }
+        //up to here ver1.2.0
+
+        voc[i] = meas_voltage(i);
+        sdata[i] = voc[i] * -1;
+
+        //ver1.2.0
+        if (RL_EN == 1) {
+            io[4] = 0; //外付けリレーOFF
+            io[5] = 0; //外付けリレーOFF
+            wait(TIME_RELAY_OFF);
+        }
+        //up to here
+    }
+
+
+    //display GU_D
+    if ( number_of_channels <= 2 ) { //2個測定の時の表示
+        gu_cursor(0, iy + 8 );//IOP測定値表示位置指定
+        gu_print1("Voc   ");
+        gu_putdeck(&sdata[0]);
+        gu_print1("V");
+        gu_cursor(128, iy + 8 );
+        gu_print1("Voc   ");
+        gu_putdeck(&sdata[1]);
+        gu_print1("V");
+    } else {
+        //CH.1~4 表示
+        for ( i=0; i <= ( number_of_channels - 1 ); i++) {
+            gu_cursor( x[i], y[i] + 4 );//x座標指定
+            gu_print1("Voc   ");
+            gu_putdeck(&sdata[i]);
+            gu_print1("V");
+        }
+    }
+
+    //R = "L"
+    for ( i = 0; i <= ( noc -1 ); i++) {
+        io[i] = 0; //io1 = "L"
+    }
+
+    wait(0.1);
+
+    //Vss=0V
+    for ( i = 0; i <= ( noc - 1 ); i++) {
+        dac_out( 0, i );//Vss設定 DAC_A~D
+    }
+
+    //ファイルオープン
+    mkdir("/sd/mydir", 0777);
+
+    FILE *fp = fopen("/sd/mydir/iop.csv", "ab+");//ディレクトリとファイル名の指定,追加モード
+
+    if(fp == NULL) {
+        /* ver1.1.3
+        gu_fontsize(1);
+        gu_cursor(0,2);
+        gu_print1("Could not open file for SD card");
+        */
+    } else {
+        for ( i = 0; i <= ( noc - 1 ); i++) {
+            fdata[i][0] = iop[i] * 0.01;    //1bitあたり0.01uA
+            fdata[i][1] = ocp[i] * 0.01;    //1bitあたり0.01uA
+            fdata[i][2] = voc[i] * 0.001;   //1bitあたり0.001V
+        }
+
+        for( i = 0; i <= ( noc - 1 ); i++) {
+
+            switch ( i ) {
+                case 0:
+                    fprintf(fp, "CH.1");
+                    break;
+                case 1:
+                    fprintf(fp, "CH.2");
+                    break;
+                case 2:
+                    fprintf(fp, "CH.3");
+                    break;
+                case 3:
+                    fprintf(fp, "CH.4");
+                    break;
+            }
+
+            fprintf(fp, " ");//excel 区切り位置
+            if ( R[i] < res_vref && R[0] >= 0 ) {
+                fprintf(fp, "%d", R[i]);
+            } else {
+                fprintf(fp,"OL");
+            }
+            fprintf(fp, " ");
+            fprintf(fp, "%f", fdata[i][0]);
+            fprintf(fp, " ");
+            fprintf(fp, "%f", fdata[i][1]);
+            fprintf(fp, " ");
+            fprintf(fp, "%f", fdata[i][2]);
+            fprintf(fp, " ");
+        }//for
+
+        //ファイルクローズ
+        fprintf(fp, "\n");
+        fclose(fp);
+    }
+
+}
+
+/*********************************
+
+    電流測定(iop/voc共通)
+    char amount;//測定数
+
+*********************************/
+void meas_current_automode(char amount)   //a quantity of measuring channel
+{
+    int i;
+
+    //amount = number_of_channels;
+
+    //set range
+    for ( i = 0; i <= ( amount - 1 ); i++)
+        range[i] = 1;   //range 10uA
+
+    wait(0.1);
+
+    //discharge condenser
+    for ( i = 0; i <= ( amount - 1 ); i++)
+        houden[i] = 1;  //discharge condenser
+
+    wait(time_discharge);//discharge time
+
+    ch_num = 0;
+    select_ich( ch_num ); //select channel that mesuring current
+    houden[0] = 0; //start integral
+
+    oneshot1.attach ( &flip_ch1, time_integral );
+
+    if ( amount >= 2 ) {
+        wait(0.1);
+        houden[1] = 0;
+        oneshot2.attach ( &flip_ch2, time_integral );
+    }
+
+    if ( amount >= 3 ) {
+        wait(0.1);
+        houden[2] = 0;
+        oneshot3.attach ( &flip_ch3, time_integral );
+    }
+
+    if ( amount == 4 ) {
+        wait(0.1);
+        houden[3] = 0;
+        oneshot4.attach ( &flip_ch4, time_integral );
+    }
+
+    wait( time_integral + 0.3 );//wait Timeout
+
+    //discharge condenser
+    for ( i = 0; i <= ( amount - 1 ); i++)
+        houden[i] = 1;  //discharge condenser
+
+    wait(time_discharge);//discharge time
+
+    //not discharge condenser
+    for ( i = 0; i <= ( amount - 1 ); i++)
+        houden[i] = 0;
+
+    //set range
+    for ( i = 0; i <= ( amount - 1 ); i++)
+        range[i] = 0;  //range 1mA
+
+    oneshot1.detach();
+    oneshot2.detach();
+    oneshot3.detach();
+    oneshot4.detach();
+
+}
+
+/*********************************
+    DAC 初期設定
+    LDACレジスタの設定
+    内部リファレンス電圧のセットアップ
+    入力シフトレジスタ:
+    0011 1000 0000 0000 0000 0001
+    (0x3F0001)
+*********************************/
+void dac_init()
+{
+
+    //内部リファレンス電圧のセットアップ
+    wdata[0] = 0x38;
+    wdata[1] = 0x00;
+    wdata[2] = 0x01;//
+
+    i2c.write ( addr_dac, wdata, 3);
+
+    wait(0.1);
+
+    //LDAC設定
+    wdata[0] = 0x30;
+    wdata[1] = 0x00;
+    wdata[2] = 0x0F;//
+
+    i2c.write ( addr_dac, wdata, 3);
+
+}
+
+/**************************************
+    DAC 電圧印加
+    Vout = 2 * Vref(2.5V) * ( D /2^2 )
+    mvolt[mV] 0~5000で設定
+    addrは、0x00~03.全チャネルは0x07で指定
+**************************************/
+void dac_out(short mvolt, char addr)   //addr DACA:0x00 DACB:0x01 DACC:0x02 DACD:0x03 allDACs:0x07
+{
+    char    command;//1byte
+    short   dacdata;//2byte
+
+    command = 0x02;//write to input register n 仕様書p25参照
+
+    dacdata = mvolt * 4095 / 2 / dac_vref ; //12bit mvolt[mV] 0~5000で設定する
+
+    dacdata = dacdata << 4; //後ろ4bitはdon't care bit
+
+    wdata[0] = command << 3 | addr; //1byte
+    wdata[1] = dacdata >> 8 ; //1byte
+    wdata[2] = dacdata & 0xFF;//1byte
+
+    i2c.write(addr_dac, wdata, 3);
+
+}
+/*********************************
+    ADC測定し、平均値を算出する
+
+    貰う値:平均値の分母
+    渡す値:平均値
+*********************************/
+void compute_adc(int adc_con, long *avg)   //(ADCのCONFIG, 計算結果)
+{
+
+    //short    sdata[10];//2byte
+    long    ldata[10];//4byte
+    long    nu;//平均値の分子 4byte
+    long    max;
+    long    min;
+    char    i;
+    char    x;
+    //int     n;
+
+    x = 10;
+
+    wdata[0] = adc_con; //ADC configuration data チャンネルの選択など
+    i2c.write( addr_ADC1, wdata, 1 );
+    wait(0.1);
+
+    //平均値の母数の数、測定を実施。
+    for( i=0; i<=(x-1); i++) {
+
+        i2c.read( addr_ADC1 + 0x01, rdata, 3);
+        //2byte結合
+        ldata[i] = rdata[0] & 0xFF;
+        ldata[i] = ( ldata[i] << 8 ) | rdata[1];
+
+        if ( ldata[i] >= 0x8000 ) {
+            ldata[i] = ldata[i] | 0xFFFF0000; //4byteの補数へ変換
+        }
+
+        wait(0.05);
+
+    }//for
+
+    //最大値を取得
+    max = ldata[0];
+    for ( i=0; i<=(x-2); i++) {
+        if ( ldata[i+1] > ldata[i]) {
+            max = ldata[i+1];
+        }
+    }
+    //最小値
+    min = ldata[0];
+    for ( i=0; i<=(x-2); i++) {
+        if ( ldata[i+1] < ldata[i]) {
+            min = ldata[i+1];
+        }
+    }
+
+    //平均値
+    nu = 0x00000000;    //4byte
+    for ( i=0; i<=(x-1); i++) {
+        nu = nu + ldata[i];
+    }
+
+    *avg = ( nu - max - min ) / ( x - 2 );
+
+}
+
+
+/**************************************
+    2バイトを10進数で表示する 0~65535
+    format *0.000
+    mV→uAへ変換(1/1000)
+    プリアンプ GAIN 1/5
+    ADC_LSB:0.25mV
+    積分時間 2s
+    容量 20uF
+**************************************/
+void gu_putdeci(float* idata)
+{
+
+    float uA; //ver1.1.4
+    long y; //ver1.1.4
+    long x; //ver1.1.4
+
+    //千分の一、四捨五入。
+    if ( *idata > 0 ) {
+        uA = *idata + 0.5;
+    } else {
+        uA = *idata - 0.5;
+    }
+
+    x = uA; //小数点以下切り捨て
+
+    //四捨五入 up to here
+
+    //プラスマイナスの表示
+    if( x >= 0 ) {
+        wdata[0] = 0x2B;//ascii "+"
+        i2c.write(addr_gu, wdata, 1);
+
+        y = x;
+
+    } else {
+        wdata[0] = 0x2D;//ascii "-"
+        i2c.write(addr_gu, wdata, 1);
+
+        y = ( ~x ) + 0x01;//2の補数
+    }
+
+    //y = y * 5 * 0.25;//プリアンプのGAINが1/5なのでここで5倍.ADC14bit分解能で、1bitあたり0.25mv
+
+    wdata[0] = (( y / 1000 ) % 10 ) + 0x30;
+
+    if( wdata[0] == 0x30 )//2桁目が零の場合、"0"を表示しない。
+        wdata[0] = 0x20;
+
+    wdata[1] = (( y / 100 ) % 10 ) + 0x30;
+    wdata[2] = 0x2E;//ASCII "."
+    wdata[3] = (( y / 10 ) % 10 ) + 0x30;
+    wdata[4] = ( y % 10 ) + 0x30;
+
+    i2c.write(addr_gu, wdata, 5);
+
+    gu_print1("uA");
+
+}
+
+/**************************************
+    2バイトを10進数で表示する 0~65535
+    format *0.000
+    mV→uAへ変換(1/1000)
+    プリアンプ GAIN 1/5
+    ADC_LSB:0.25mV
+    シャント抵抗1kΩ
+**************************************/
+void gu_putdeci_mA(float* idata)
+{
+    float uA; //ver1.1.4
+    long y; //ver1.1.4
+    long x; //ver1.1.4
+
+    //千分の一、四捨五入。
+    if ( *idata > 0 ) {
+        uA = *idata + 0.5;
+    } else {
+        uA = *idata - 0.5;
+    }
+
+    x = uA; //小数点以下切り捨て
+
+    //四捨五入 up to here
+
+    //プラスマイナスの表示
+    if( x >= 0 ) {
+        wdata[0] = 0x2B;//ascii "+"
+        i2c.write(addr_gu, wdata, 1);
+
+        y = x;
+
+    } else {
+        wdata[0] = 0x2D;//ascii "-"
+        i2c.write(addr_gu, wdata, 1);
+
+        y = ( ~x ) + 0x01;//2の補数
+    }
+
+    //y = y * 5 * 0.25;//プリアンプのGAINが1/5なのでここで5倍.ADC14bit分解能で、1bitあたり0.25mv
+
+    /*
+    wdata[0] = (( *y / 100000 ) % 10 ) + 0x30;
+
+    if( wdata[0] == 0x30 )//3桁目が零の場合、"0"を表示しない。
+        wdata[0] = 0x20;
+    */
+
+    wdata[0] = (( y / 1000 ) % 10 ) + 0x30;
+
+    if( wdata[0] == 0x30 )//2桁目が零の場合、"0"を表示しない。
+        wdata[0] = 0x20;
+
+    wdata[1] = (( y / 100 ) % 10 ) + 0x30;
+    wdata[2] = 0x2E;//ASCII "."
+    wdata[3] = (( y / 10 ) % 10 ) + 0x30;
+    wdata[4] = ( y % 10 ) + 0x30;
+
+    i2c.write(addr_gu, wdata, 5);
+
+    gu_print1("mA");
+
+}
+
+/**************************************
+    2バイトを10進数で表示する 0~65535
+    1/1000倍 format *0.000
+    mV→V Ω→kΩ
+**************************************/
+void gu_putdeck(short* x)
+{
+
+    short num;
+
+    //プラスマイナスの表示
+    if( *x >= 0 ) {
+        wdata[0] = 0x2B;//ascii "+"
+        i2c.write(addr_gu, wdata, 1);
+        num = *x;
+
+    } else {
+        wdata[0] = 0x2D;//ascii "-"
+        i2c.write(addr_gu, wdata, 1);
+
+        //*x = ( ~*x ) + 0x01;//2の補数
+        num = *x * -1;
+    }
+
+    wdata[0] = (( num / 10000 ) % 10 ) + 0x30;
+
+    if( wdata[0] == 0x30 )//2桁目が零の場合、"0"を表示しない。
+        wdata[0] = 0x20;
+
+    wdata[1] = (( num / 1000 ) % 10 ) + 0x30;
+    wdata[2] = 0x2E;//ASCII "."
+    wdata[3] = (( num / 100 ) % 10 ) + 0x30;
+    wdata[4] = (( num / 10 ) % 10 ) + 0x30;
+    //wdata[5] = ( num % 10 ) + 0x30;
+
+    i2c.write(addr_gu, wdata, 5);
+
+}
+
+/********************************
+
+    判定 LED点灯
+
+********************************/
+void hantei(char noc)
+{
+    int i;
+
+    //エラーフラグ
+    for ( i=0; i<= 3 ; i++) {
+        err_f[i] = 0;
+    }
+
+    //ver1.2
+    if (DEB_EN == 1) {
+        voc[0] = 3100;//[mV]
+        ocp[0] = -0.4*100;//[uA] 0.1uAのときocp[]の値は10
+        iop[0] = 16.5*100;//[uA] 0.1uAのときicp[]の値は10
+        voc[1] = 3100;//[V]
+        ocp[1] = 0.4*100;//[uA]
+        iop[1] = 16.5*100;//[uA]
+    }
+    //upto
+
+    for ( i = 0; i <= ( noc - 1 ); i++) {
+
+        /*ver1.1.3 規格設置値=0の場合は判定しない*/
+        if( voc[i] < calinfo.low_limit_voc && calinfo.low_limit_voc != 0) {
+            err_f[i] = 1;
+        }
+
+        if( iop[i] < calinfo.low_limit_iop ) {
+            err_f[i] = 1;
+        }
+
+        if( ocp[i] > calinfo.low_limit_ocp ) {
+            err_f[i] = 1;
+        }
+
+        //ver1.2.2
+        if( ocp[i] < calinfo.up_limit_ocp && calinfo.up_limit_ocp != 0) {
+            err_f[i] = 1;
+        }
+
+        if( R[i] < calinfo.low_limit_resistor && calinfo.low_limit_resistor != 0 ) {
+            err_f[i] = 1;
+        }
+
+        if( R[i] > calinfo.up_limit_resistor && calinfo.up_limit_resistor != 0 ) {
+            err_f[i] = 1;
+        }
+
+        if( err_f[i] == 1) {
+            led_red[i] = 1;
+        } else {
+            led_green[i] = 1;
+        }
+
+        if ( SEQ_EN == 1 && err_f[i] == 0 ) {
+            seq_hantei[i] = 1;
+        }
+
+        //ver1.2.3
+        char *print_text;
+
+        if(DEB_EN == 1) {
+
+        gu_fontsize(1);
+        gu_cursor(0,2);
+        gu_print1("                ");
+
+            if(err_f[i] == 1) {
+
+                switch(i){
+                    case 0: 
+                        print_text="FAIL DUT1";
+                        break;
+                    case 1: 
+                        print_text="FAIL DUT2";
+                        break;
+                }
+
+                gu_fontsize(1);
+                gu_cursor(0,2);
+                gu_print1(print_text);
+                wait(1);
+            }
+            if(err_f[i] == 0) {
+
+                
+                switch(i){
+                    case 0: 
+                        print_text="PASS DUT1";
+                        break;
+                    case 1: 
+                        print_text="PASS DUT2";
+                        break;
+                }
+
+                gu_fontsize(1);
+                gu_cursor(0,2);
+                gu_print1(print_text);
+
+                wait(1);
+            }
+        }
+        //upto
+
+    }//for
+
+
+}
+
+/*********************************
+
+    measure voltage
+    測定CHを指定して、電圧値Rを返す
+    char ch 0~3 -> 1ch ~ 4ch
+
+*********************************/
+short meas_voltage(char ch)//ch 0~3 -> 1ch ~ 4ch
+{
+    char    com;
+    short   sdata;
+
+    switch(ch) {
+        case 0:
+            com = adc_config(2,0);//ch1(adc),12bit
+            i2c.write( addr_ADC1, &com, 1);
+            wait(0.1);
+            sdata = read_adc(addr_ADC1);
+            break;
+        case 1:
+            com = adc_config(3,0);//ch2(adc),12bit
+            i2c.write( addr_ADC1, &com, 1);
+            wait(0.1);
+            sdata = read_adc(addr_ADC1);
+            break;
+        case 2:
+            com = adc_config(2,0);//ch1(adc),12bit
+            i2c.write( addr_ADC2, &com, 1);
+            wait(0.1);
+            sdata = read_adc(addr_ADC2);
+            break;
+        case 3:
+            com = adc_config(3,0);//ch2(adc),12bit
+            i2c.write( addr_ADC2, &com, 1);
+            wait(0.1);
+            sdata = read_adc(addr_ADC2);
+            break;
+    }// end switch
+
+    //プリアンプ倍率を代入して、電圧値を算出する(単位はmV)
+
+
+    sdata = sdata * 5;//プリアンプ倍率
+
+    return ( sdata );
+}
+
+
+/*********************************
+
+    measure resistor
+    測定CHを指定して、抵抗測定値Rを返す
+    char ch 0~3 -> 1ch ~ 4ch
+
+*********************************/
+short meas_resistor(char ch)//ch 0~3 -> 1ch ~ 4ch
+{
+    char    com;
+    short   sdata;
+
+    switch(ch) {
+        case 0:
+            //ver1.2.0
+            if (RL_EN == 1) {
+                io[6] = 1; //外付けリレーON
+                wait(TIME_RELAY_ON);
+            }
+            //up to here
+
+            com = adc_config(0,0);//ch1(adc),12bit
+            i2c.write( addr_ADC1, &com, 1);
+            wait(0.1);
+            sdata = read_adc(addr_ADC1);
+            //ver1.2.0
+            if (RL_EN == 1) {
+                io[6] = 0 ;
+            }
+
+            break;
+
+        case 1:
+            //ver1.2.0
+            if (RL_EN == 1) {
+                io[7] = 1; //外付けリレーON
+                wait(TIME_RELAY_ON);
+            }
+            //up to here
+
+            com = adc_config(1,0);//ch2(adc),12bit
+            i2c.write( addr_ADC1, &com, 1);
+            wait(0.1);
+            sdata = read_adc(addr_ADC1);
+            //ver1.2.0
+            if (RL_EN == 1) {
+                io[7] = 0;
+            }
+
+            break;
+
+        case 2:
+            com = adc_config(0,0);//ch1(adc),12bit
+            i2c.write( addr_ADC2, &com, 1);
+            wait(0.1);
+            sdata = read_adc(addr_ADC2);
+            break;
+        case 3:
+            com = adc_config(1,0);//ch2(adc),12bit
+            i2c.write( addr_ADC2, &com, 1);
+            wait(0.1);
+            sdata = read_adc(addr_ADC2);
+            break;
+    }// end switch
+
+    //検出用抵抗値を代入して、測定抵抗値を算出する(単位はmV,Ω)
+    if ( sdata < res_vref ) {
+        sdata =( rsense * sdata ) / ( res_vref - sdata);
+    } else {
+        sdata = res_vref;//overload
+    }
+
+
+    return ( sdata );
+}
+
+
+/*********************************
+
+    display resistor
+    測定抵抗値を表示する
+
+*********************************/
+void display_resistor(short sdata)//測定値を表示する。
+{
+    if ( sdata < res_vref && sdata >= 0 ) {
+        gu_putdec(&sdata);
+    } else {
+        gu_print1(" OL ");//overload
+    }
+    gu_onebyte(0xEA);//ohm
+}
+
+/**************************************
+    4バイトを10進数で表示する 0~9999
+**************************************/
+void gu_putdec(short* x)
+{
+
+    char cmd[4];
+
+    //cmd[0] = (( *x / 100000 ) % 10 ) + 0x30;
+    cmd[0] = (( *x / 1000 ) % 10 ) + 0x30;
+    cmd[1] = (( *x / 100 ) % 10 ) + 0x30;
+    cmd[2] = (( *x / 10 ) % 10 ) + 0x30;
+    cmd[3] = ( *x % 10 ) + 0x30;
+
+    i2c.write(addr_gu, cmd, 4);
+
+}
+/*********************************
+
+    LED 照度
+    設定読込~反映
+    //メモリから設定値を読み出して、LEDのPWMのDutyを設定する
+    //LED1設定値&LED2設定値の計2Byte読込
+
+*********************************/
+void read_syoudo(char* c)
+{
+    char cmd;       //gu-DへのI2Cコマンド用配列 1byte0
+    //char csyoudo[4];//led出力用pwm duty 設定比1バイト255段階
+    float duty_pwm; //pwm パーセンテージ
+    int i;
+
+    //
+    //メモリ10h番地(照度設定データ)読み出し
+    cmd = 0x10;
+    i2c.write (fixed_adrs, &cmd, 1,true);    //読込先頭アドレス指定 ReStart
+    i2c.read ((fixed_adrs + 0x01), rdata, 4);//read 1byte
+
+    for ( i = 0; i <=3; i++) {
+        c[i] = rdata[i];
+    }
+
+    //set pwm duty
+    for ( i = 0; i <= ( number_of_channels - 1 ); i++) {
+
+        if(c[i] == 0x00) {
+            c[i] = 0x32;
+        }
+
+        duty_pwm = COP * c[i];
+
+        leds[i].write (duty_pwm);//Set Duty
+    }
+}
+/*********************************
+
+    LED 照度調整 (Main)
+
+*********************************/
+void adjust_illumination()
+{
+    char cmd_gu[32] ;   //gu-DへのI2Cコマンド用配列 1byte0
+    //char *pcmd = cmd_gu;
+    //char msg;
+    //char *pmsg = &msg;
+    char crdata[3];
+    char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F gu-D スイッチNo.
+    char cswdata; // 0x00 or 0x01 ONかOFFか
+    char *pcswnum = &cswnum;
+    char *pcswdata = &cswdata;
+    char csyoudo[4];//led出力用pwm duty 設定比1バイト255段階
+    char ch;
+    float duty_pwm;//pwm パーセンテージ
+    int i;
+    int x[4] = {64,64,192,192}; //レベル値の表示位置 x座標
+    int y[4] = {2,4,2,4}; //レベル値の表示位置 y座標
+    //
+    //EEPROMから照度データ読込とPWMDUTYセット
+    read_syoudo( csyoudo );
+    //
+    //画面表示
+    gu_cls();//画面のクリア
+    gu_fontsize(2);
+    gu_print1("Adjust illumination ");
+    //照度レベルを256段階で表示
+    //LED1
+    gu_cursor(0,16/8);
+    gu_print1("LED1 Lv ");
+    //LED2
+    gu_cursor(0,32/8);
+    gu_print1("LED2 Lv ");
+    //LED3
+    if( number_of_channels >= 3 ) {
+        gu_cursor(128,2);
+        gu_print1("LED3 Lv ");
+    }
+    //LED4
+    if( number_of_channels >= 4 ) {
+        gu_cursor(128,4);
+        gu_print1("LED4 Lv ");
+    }
+    //
+    for ( i = 0; i <= ( number_of_channels - 1 ); i++) {
+
+        gu_cursor(x[i],y[i]);
+
+        cmd_gu[0] = ((csyoudo[i] / 100) & 0xFF) + 0x30;
+        cmd_gu[1] = (csyoudo[i] - (csyoudo[i] / 100) * 100) / 10 + 0x30;
+        cmd_gu[2] = ((csyoudo[i] % 10) & 0xFF) + 0x30;
+        i2c.write(addr_gu, cmd_gu, 3);
+    }
+
+    //
+    gu_fontsize(1);
+    gu_cursor(0,56/8);
+    gu_print1("LED1");
+    gu_cursor(32,56/8);
+    gu_print1("fine");
+    gu_cursor(64,56/8);
+    gu_print1("LED2");
+    gu_cursor(96,56/8);
+    gu_print1("fine");
+
+    if( number_of_channels >= 3) {
+        gu_cursor(128,56/8);
+        gu_print1("LED3");
+        gu_cursor(160,56/8);
+        gu_print1("fine");
+    }
+    if( number_of_channels >= 4) {
+        gu_cursor(192,56/8);
+        gu_print1("LED4");
+        gu_cursor(224,56/8);
+        gu_print1("fine");
+    }
+    //
+    //gu-D タッチスイッチ読み出し動作設定 p49
+    cmd_gu[0]= 0x1F;
+    cmd_gu[1]= 0x4B;
+    cmd_gu[2]= 0x18;
+    cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2
+    i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+    //
+    //ボタンイメージの表示
+    for ( i = 17; i < 17 + ( number_of_channels * 2 ); i++) {
+        gu_button_up(i);
+    }
+    for ( i = 25; i < 25 + ( number_of_channels * 2 ); i++) {
+        gu_button_down(i);
+    }
+    gu_Button_power_on();//show button
+    wait(0.2);
+
+    while(1) {
+
+        i2c.read ((addr_gu + 0x01), crdata, 3);
+
+        if (crdata[0] == 0x11 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
+            *pcswnum = crdata[1]; //スイッチ番号
+            *pcswdata = crdata[2];//ON/OFF情報
+
+            if (cswdata == 0x01) { //タッチしたならば
+
+                switch ( number_of_channels ) { //ver1.1.0
+
+                    case 1:
+                    case 2:
+                        if ( cswnum >= 20 && cswnum <= 23 )
+                            cswnum = 0;
+
+                        if ( cswnum >= 28 && cswnum <= 31 )
+                            cswnum = 0;
+
+                        break;
+
+                    case 3:
+                        if ( cswnum >= 22 && cswnum <= 23 )
+                            cswnum = 0;
+
+                        if ( cswnum >= 30 && cswnum <= 31 )
+                            cswnum = 0;
+
+                        break;
+
+                } //switch
+
+                switch( cswnum ) { //SWの番号(位置)
+
+                    case 22:
+                    case 20:
+                    case 16:
+                    case 18:
+
+                        ch = ( cswnum - 16 ) / 2; //SWnoから選択したLEDNoの算出
+
+                        gu_button_up_on( cswnum + 1 );
+                        wait(0.2);
+                        gu_button_up( cswnum + 1 );
+                        wait(0.1);
+
+                        if(csyoudo[ch] <= 0xEF ) {
+                            csyoudo[ch] = csyoudo[ch] + 0x0A;
+                        }
+
+                        break;
+
+                    case 23:
+                    case 21:
+                    case 17:
+                    case 19:
+
+                        ch = ( cswnum - 17 ) / 2; //SWnoから選択したLEDNoの算出
+
+                        gu_button_up_on( cswnum + 1 );
+                        wait(0.2);
+                        gu_button_up( cswnum + 1 );
+                        wait(0.1);
+
+                        if(csyoudo[ch] <= 0xFF ) {
+                            csyoudo[ch] = csyoudo[ch] + 0x01;
+                        }
+
+                        break;
+
+                    case 24:
+                    case 26:
+                    case 28:
+                    case 30:
+
+                        ch = ( cswnum - 24 ) / 2; //SWnoから選択したLEDNoの算出
+
+                        gu_button_down_on( cswnum + 1 );
+                        wait(0.2);
+                        gu_button_down( cswnum + 1 );
+                        wait(0.1);
+
+                        if(csyoudo[ch] >= 0x0A ) {
+                            csyoudo[ch] = csyoudo[ch] - 0x0A;
+                        }
+
+                        break;
+
+                    case 25:
+                    case 27:
+                    case 29:
+                    case 31:
+
+                        ch = ( cswnum - 24 ) / 2; //SWnoから選択したLEDNoの算出
+
+                        gu_button_down_on( cswnum + 1 );
+                        wait(0.2);
+                        gu_button_down( cswnum + 1 );
+                        wait(0.1);
+
+                        if(csyoudo[ch] >= 0x01 ) {
+                            csyoudo[ch] = csyoudo[ch] - 0x01;
+                        }
+
+                        break;
+
+                    case 7 ://SW.8 保存ボタンを押すと現在の輝度をEEPROMへ保存する
+
+                        wdata[0] = 0x10 ; //word address 書込み先頭アドレス指定
+
+                        for ( i = 0; i <= ( number_of_channels - 1 ); i++) {
+                            wdata[ i + 1 ] = csyoudo[i]; //DATA_LED i
+                        }
+
+                        Soushin = i2c.write (fixed_adrs, wdata,( number_of_channels + 1 ));
+
+                        if(Soushin == 0) {
+                            gu_Button_power_off();//電源ボタンイメージ反転表示
+                            wait(0.3);
+
+                            return;//照度調整ルーチンを抜ける
+                        }
+                } //switch
+
+
+
+                //PWMのDUTY設定
+
+                for( i = 0; i <= ( number_of_channels - 1 ); i++) {
+                    duty_pwm = COP * csyoudo[i];
+                    leds[i].write (duty_pwm);//Set Duty
+                }
+
+
+                //照度レベルを256段階で表示
+                //LED1
+                gu_fontsize(2);
+
+                for ( i = 0; i <= ( number_of_channels - 1 ); i++) {
+
+                    gu_cursor(x[i],y[i]);
+
+                    cmd_gu[0] = ((csyoudo[i] / 100) & 0xFF) + 0x30;
+                    cmd_gu[1] = (csyoudo[i] - (csyoudo[i] / 100) * 100) / 10 + 0x30;
+                    cmd_gu[2] = ((csyoudo[i] % 10) & 0xFF) + 0x30;
+                    i2c.write(addr_gu, cmd_gu, 3);
+                }
+            }
+        } //if
+
+        wait(0.1);//gu-D 読込間隔の設定
+
+    }
+}
+
+/*********************************
+
+    サブ基板LED(判定用)全消灯
+
+*********************************/
+void led_off()
+{
+    int i;
+
+    for( i = 0; i <= ( number_of_channels - 1 ); i++) {
+        led_green[ i ] = 0;
+        led_red[ i ] = 0;
+    }
+
+}
+/*********************************
+
+    Utility Main
+    gu_D 輝度調整 タッチ感度調整
+
+*********************************/
+void utility()   //輝度調整サブルーチン
+{
+
+    char cmd_gu[32] ;   //gu-DへのI2Cコマンド用配列 1byte0
+    //char *pcmd = cmd_gu;
+    char clumi; //輝度設定用変数 01h<=n<=08h
+    char* pclumi = &clumi; //ポインタの定義
+    char msg;
+    char *pmsg = &msg;
+    char crdata[3];
+    char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
+    char cswdata; // 0x00 or 0x01
+    char *pcswnum = &cswnum;
+    char *pcswdata = &cswdata;
+    //
+    //メモリ00h番地(輝度設定データ)読み出し
+    wdata[0] = 0x00;
+    Soushin = i2c.write (fixed_adrs, wdata, 1,true);    //読込先頭アドレス指定 ReStart
+    Jyushin = i2c.read ((fixed_adrs + 0x01), rdata, 1);//read 1byte
+    *pclumi = rdata[0];
+
+    //輝度設定更新
+    if(*pclumi==0x00 || *pclumi > 0x08) *pclumi=0x05;
+    gu_luminance(pclumi);
+
+    //画面表示
+    gu_cls();//画面のクリア
+    gu_print1("Set Display Brightness");
+    gu_cursor(0,16/8);
+    gu_print1("LEVEL ");
+    *pmsg = *pclumi + 0x30;
+    gu_print1(pmsg);
+
+    gu_cursor(0,96/8); //ver1.1.0
+    gu_print1("DELETE EEPROM_DATA");
+    gu_set_button_font1(30,"del");
+
+    //SW状態変化時自動送信モード2
+    cmd_gu[0]= 0x1F;
+    cmd_gu[1]= 0x4B;
+    cmd_gu[2]= 0x18;
+    cmd_gu[3]= 0x02;
+    i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+    //ボタンイメージの表示
+    gu_button_up(6);//show button
+    gu_button_down(14);//show button
+    gu_Button_power_on();//show button
+
+    while(1) {
+
+        i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+        if (crdata[0] == 0x11 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
+            *pcswnum = crdata[1]; //スイッチ番号
+            *pcswdata = crdata[2];//ON/OFF情報
+
+            if (cswdata == 0x01) { //タッチしたならば
+                switch( cswnum ) { //SWの番号(位置)
+                    case 5 ://SW6
+                        gu_button_up_on( 6 );
+                        wait(0.2);
+                        gu_button_up( 6 );
+                        wait(0.1);
+
+                        if(clumi < 8 ) *pclumi = *pclumi + 1;
+
+                        break;
+
+                    case 13 ://SW14
+                        gu_button_down_on( 14 );
+                        wait(0.2);
+                        gu_button_down( 14 );
+                        wait(0.1);
+
+                        if(clumi >= 1 ) *pclumi = *pclumi - 1;
+
+                        break;
+
+                    case 29:  //SW30
+
+                        gu_reverse(0x01);   //gu_リバース指定
+                        gu_set_button_font1(30,"del");
+                        gu_reverse(0x00);   //gu_リバース解除
+
+                        erace_calinfo();
+
+                        gu_set_button_font1(30,"del");
+
+                        break;
+
+                    case 0x07 ://保存ボタンを押すと現在の輝度をEEPROMへ保存する
+
+                        wdata[0] = 0x00 ; //word address 書込み先頭アドレス指定
+                        wdata[1] = *pclumi ; //DATA
+                        Soushin = i2c.write (fixed_adrs, wdata, 2);
+
+                        if(Soushin == 0) {
+                            gu_Button_power_off();//電源ボタンイメージ反転表示
+                            wait(0.5);
+                            return;//輝度調整ルーチンを抜ける
+                        }
+
+                } //switch
+
+                gu_luminance(pclumi);//輝度変更
+                gu_cursor(0,16/8);
+                gu_print1("LEVEL ");
+                *pmsg = *pclumi + 0x30;
+                gu_print1(pmsg);
+
+            }
+        } //if
+
+        wait(0.1);//gu-D 読込間隔の設定
+
+    }
+}
+
+/*********************************
+    gu_D グラフィックデータ
+*********************************/
+char gu_Button_MODE_data[] = {
+    0x7F,0xF0,0x80,0x08,0x80,0x0C,0x80,0x0A,0x80,0x0A,0x80,0x0A,0x80,0x0A,0x80,0x0A,
+    0x80,0x0A,0x80,0x0A,0x80,0x0A,0x80,0x0A,0x7F,0xF2,0x20,0x02,0x1F,0xFC,0x00,0x00,
+};
+
+void gu_set_button(char sw_num,char* text)
+{
+    char    x;
+    char    y;
+
+    //SW_NoからSWの座標を求める
+    x = ((sw_num - 1) % 8 ) * 32;
+    y = ((sw_num - 1) / 8 ) * 32;
+
+    gu_drawButton(x,y,32,32, gu_Button_MODE_data );
+
+    // Change Font Size
+    gu_fontsize(2);
+    // set font width
+    gu_fontWidth(Proportional1);
+    gu_print_dot( x + 8,y + 8,text);
+    // Change Font Size
+    gu_fontsize(1);
+    // set font width
+    gu_fontWidth(1);
+}
+
+void gu_set_button_font1(char sw_num,char* text)
+{
+    char    x;
+    char    y;
+
+    //SW_NoからSWの座標を求める
+    x = ((sw_num - 1) % 8 ) * 32;
+    y = ((sw_num - 1) / 8 ) * 32;
+
+    gu_drawButton(x,y,32,32, gu_Button_MODE_data );
+
+    // Change Font Size
+    gu_fontsize(1);
+    // set font width
+    gu_fontWidth(1);
+    gu_print_dot( x + 2,y + 10,text);
+
+}
+
+char gu_Button_up_data[] = {
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x10,0x00,0x00,0x08,
+    0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x18,0x04,
+    0x20,0x00,0x38,0x04,0x20,0x00,0x78,0x04,0x20,0x00,0xF8,0x04,0x20,0x01,0xF8,0x04,
+    0x20,0x03,0xF8,0x04,0x20,0x07,0xF8,0x04,0x20,0x0F,0xF8,0x04,0x20,0x1F,0xF8,0x04,
+    0x20,0x1F,0xF8,0x04,0x20,0x0F,0xF8,0x04,0x20,0x07,0xF8,0x04,0x20,0x03,0xF8,0x04,
+    0x20,0x01,0xF8,0x04,0x20,0x00,0xF8,0x04,0x20,0x00,0x78,0x04,0x20,0x00,0x38,0x04,
+    0x20,0x00,0x18,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,
+    0x10,0x00,0x00,0x08,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+
+void gu_button_up(char sw_num)
+{
+    char    x;
+    char    y;
+
+    //SW_NoからSWの座標を求める
+    x = ((sw_num - 1) % 8 ) * 32;
+    y = ((sw_num - 1) / 8 ) * 32;
+
+    gu_cursor( x, y/8 );
+    gu_RealTimeImage(32, 32, gu_Button_up_data);
+}
+
+void gu_Button_up1()
+{
+    gu_cursor(224,8);
+    gu_RealTimeImage(32, 32, gu_Button_up_data);
+}
+
+void gu_Button_up2()
+{
+    gu_cursor(192,8);
+    gu_RealTimeImage(32, 32, gu_Button_up_data);
+}
+
+void gu_Button_up3()
+{
+    gu_cursor(160,8);
+    gu_RealTimeImage(32, 32, gu_Button_up_data);
+}
+
+void gu_Button_up4()
+{
+    gu_cursor(128,8);
+    gu_RealTimeImage(32, 32, gu_Button_up_data);
+}
+
+char gu_Button_down_data[] = {
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x10,0x00,0x00,0x08,
+    0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x18,0x00,0x04,
+    0x20,0x1C,0x00,0x04,0x20,0x1E,0x00,0x04,0x20,0x1F,0x00,0x04,0x20,0x1F,0x80,0x04,
+    0x20,0x1F,0xC0,0x04,0x20,0x1F,0xE0,0x04,0x20,0x1F,0xF0,0x04,0x20,0x1F,0xF8,0x04,
+    0x20,0x1F,0xF8,0x04,0x20,0x1F,0xF0,0x04,0x20,0x1F,0xE0,0x04,0x20,0x1F,0xC0,0x04,
+    0x20,0x1F,0x80,0x04,0x20,0x1F,0x00,0x04,0x20,0x1E,0x00,0x04,0x20,0x1C,0x00,0x04,
+    0x20,0x18,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,
+    0x10,0x00,0x00,0x08,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+
+void gu_button_down(char sw_num)
+{
+    char    x;
+    char    y;
+
+    //SW_NoからSWの座標を求める
+    x = ((sw_num - 1) % 8 ) * 32;
+    y = ((sw_num - 1) / 8 ) * 32;
+
+    gu_cursor( x, y/8 );
+    gu_RealTimeImage(32, 32, gu_Button_down_data);
+}
+
+void gu_Button_down1()
+{
+    gu_cursor(224,12);
+    gu_RealTimeImage(32, 32, gu_Button_down_data);
+}
+
+void gu_Button_down2()
+{
+    gu_cursor(192,12);
+    gu_RealTimeImage(32, 32, gu_Button_down_data);
+}
+
+void gu_Button_down3()
+{
+    gu_cursor(160,12);
+    gu_RealTimeImage(32, 32, gu_Button_down_data);
+}
+
+void gu_Button_down4()
+{
+    gu_cursor(128,12);
+    gu_RealTimeImage(32, 32, gu_Button_down_data);
+}
+
+char gu_Button_up_on_data[] = {
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xF8,
+    0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xE7,0xFC,
+    0x3F,0xFF,0xC7,0xFC,0x3F,0xFF,0x87,0xFC,0x3F,0xFF,0x07,0xFC,0x3F,0xFE,0x07,0xFC,
+    0x3F,0xFC,0x07,0xFC,0x3F,0xF8,0x07,0xFC,0x3F,0xF0,0x07,0xFC,0x3F,0xE0,0x07,0xFC,
+    0x3F,0xE0,0x07,0xFC,0x3F,0xF0,0x07,0xFC,0x3F,0xF8,0x07,0xFC,0x3F,0xFC,0x07,0xFC,
+    0x3F,0xFE,0x07,0xFC,0x3F,0xFF,0x07,0xFC,0x3F,0xFF,0x87,0xFC,0x3F,0xFF,0xC7,0xFC,
+    0x3F,0xFF,0xE7,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,
+    0x1F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+
+void gu_button_up_on( char sw_num )
+{
+    char    x;
+    char    y;
+
+    //SW_NoからSWの座標を求める
+    x = ((sw_num - 1) % 8 ) * 32;
+    y = ((sw_num - 1) / 8 ) * 32;
+
+    gu_cursor( x, y/8 );
+
+    gu_RealTimeImage(32, 32, gu_Button_up_on_data);
+}
+
+void gu_Button_up_on2()
+{
+    gu_cursor(192,8);
+    gu_RealTimeImage(32, 32, gu_Button_up_on_data);
+}
+
+char gu_Button_down_on_data[] = {
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xF8,
+    0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xE7,0xFF,0xFC,
+    0x3F,0xE3,0xFF,0xFC,0x3F,0xE1,0xFF,0xFC,0x3F,0xE0,0xFF,0xFC,0x3F,0xE0,0x7F,0xFC,
+    0x3F,0xE0,0x3F,0xFC,0x3F,0xE0,0x1F,0xFC,0x3F,0xE0,0x0F,0xFC,0x3F,0xE0,0x07,0xFC,
+    0x3F,0xE0,0x07,0xFC,0x3F,0xE0,0x0F,0xFC,0x3F,0xE0,0x1F,0xFC,0x3F,0xE0,0x3F,0xFC,
+    0x3F,0xE0,0x7F,0xFC,0x3F,0xE0,0xFF,0xFC,0x3F,0xE1,0xFF,0xFC,0x3F,0xE3,0xFF,0xFC,
+    0x3F,0xE7,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,
+    0x1F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+
+void gu_button_down_on(char sw_num)
+{
+    char    x;
+    char    y;
+
+    //SW_NoからSWの座標を求める
+    x = ((sw_num - 1) % 8 ) * 32;
+    y = ((sw_num - 1) / 8 ) * 32;
+
+    gu_cursor( x, y/8 );
+
+    gu_RealTimeImage(32, 32, gu_Button_down_on_data);
+}
+
+void gu_Button_down_on2()
+{
+    gu_cursor(192,12);
+    gu_RealTimeImage(32, 32, gu_Button_down_on_data);
+}
+
+char gu_Button_power_on_data[] = {
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x10,0x00,0x00,0x08,
+    0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x03,0xF0,0x04,
+    0x20,0x0F,0xFC,0x04,0x20,0x1F,0xFE,0x04,0x20,0x3C,0x0F,0x04,0x20,0x38,0x07,0x84,
+    0x20,0x00,0x03,0x84,0x20,0x00,0x03,0xC4,0x20,0x00,0x01,0xC4,0x21,0xFF,0x01,0xC4,
+    0x21,0xFF,0x01,0xC4,0x20,0x00,0x01,0xC4,0x20,0x00,0x03,0xC4,0x20,0x00,0x03,0x84,
+    0x20,0x38,0x07,0x84,0x20,0x3C,0x0F,0x04,0x20,0x1F,0xFE,0x04,0x20,0x0F,0xFC,0x04,
+    0x20,0x03,0xF0,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,
+    0x10,0x00,0x00,0x08,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+
+void gu_Button_power_on()
+{
+    gu_cursor(224,0);
+    gu_RealTimeImage(32, 32, gu_Button_power_on_data);
+}
+
+
+char gu_Button_power_off_data[] = {
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xF8,
+    0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFC,0x0F,0xFC,
+    0x3F,0xF0,0x03,0xFC,0x3F,0xE0,0x01,0xFC,0x3F,0xC3,0xF0,0xFC,0x3F,0xC7,0xF8,0x7C,
+    0x3F,0xFF,0xFC,0x7C,0x3F,0xFF,0xFC,0x3C,0x3F,0xFF,0xFE,0x3C,0x3C,0x00,0x7E,0x3C,
+    0x3C,0x00,0x7E,0x3C,0x3F,0xFF,0xFE,0x3C,0x3F,0xFF,0xFC,0x3C,0x3F,0xFF,0xFC,0x7C,
+    0x3F,0xC7,0xF8,0x7C,0x3F,0xC1,0xE0,0xFC,0x3F,0xE0,0x01,0xFC,0x3F,0xF0,0x03,0xFC,
+    0x3F,0xFC,0x0F,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,
+    0x1F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+
+void gu_Button_power_off()
+{
+    gu_cursor(224,0);
+    gu_RealTimeImage(32, 32, gu_Button_power_off_data);
+}
+
+/*********************************
+    ノリタケ関数
+    ここから
+**********************************/
+//
+// Clear screen//
+void gu_cls()
+{
+
+    i2c.start();
+    i2c.write(addr_gu);
+    i2c.write(0x0c);
+    i2c.stop();
+
+}
+
+void gu_drawButton(int x, int y, int w, int h, const char data[])
+{
+    h = h >> 3;  // get height in byte
+    y = y >> 3;  // get Y location in byte
+
+    gu_cursor(x,y);
+    // Realtime Image draw header
+
+    i2c.start();
+    i2c.write(addr_gu);
+    gu_sendOneByte(0x1f);
+    gu_sendOneByte(0x28);
+    gu_sendOneByte(0x66);
+    gu_sendOneByte(0x11);
+    gu_sendOneByte( w & 0xff);
+    gu_sendOneByte( w >> 8);
+    gu_sendOneByte( h & 0xff);
+    gu_sendOneByte( h >> 8);
+    gu_sendOneByte(0x01);
+
+    for(int i = 0; i<w; i++) {
+        if(i<8) {                           // 8 dots from left
+            gu_sendOneByte(data[i*2]);
+            if(h>2) {
+                for(int j=0; j<(h-2); j++) {
+                    if((data[i*2]&0x01)==0) {
+                        gu_sendOneByte(0x00);
+                    } else {
+                        gu_sendOneByte(0xff);
+                    }
+                }
+            }
+            gu_sendOneByte(data[i*2+1]);
+        } else if (i > (w-8)) {             // 8 dots from right
+
+            gu_sendOneByte(data[(16+i-w)*2]);
+            if(h>2) for(int j=0; j<(h-2); j++) {
+                    if((data[(16+i-w)*2]&0x01)==0) {
+                        gu_sendOneByte(0x00);
+                    } else {
+                        gu_sendOneByte(0xff);
+                    }
+                }
+            gu_sendOneByte(data[(16+i-w)*2+1]);
+
+        } else {                              // in the middle
+            gu_sendOneByte(data[14]);
+            if(h>2) {
+                for(int j=0; j<(h-2); j++) {
+                    if((data[14]&0x01)==0) {
+                        gu_sendOneByte(0x00);
+                    } else {
+                        gu_sendOneByte(0xff);
+                    }
+                }
+            }
+            gu_sendOneByte(data[15]);
+        }
+    }
+
+    i2c.stop();
+
+}
+
+
+// ドット単位キャラクタ表示 p37
+void gu_print_dot(int x, int y, const char* ptext)
+{
+
+    i2c.start();
+    i2c.write(addr_gu);
+    gu_sendOneByte(0x1f);
+    gu_sendOneByte(0x28);
+    gu_sendOneByte(0x64);
+    gu_sendOneByte(0x30);
+    gu_sendOneByte(x & 0xff);
+    gu_sendOneByte(x >> 8);
+    gu_sendOneByte(y & 0xff);
+    gu_sendOneByte(y >> 8);
+    gu_sendOneByte(0x00);
+
+    int i=0;
+    int j=0;
+    while(*(ptext+i)) {
+        if (*(ptext + i++) =='%') {
+            j+=2;   //文字列終端”0%"までインクリメント
+        }
+    }
+
+    gu_sendOneByte(i-j);  //キャラクタデータ長
+    gu_print(ptext);       //キャラクタデータ
+
+    i2c.stop();
+
+}
+
+//
+// Print test//
+void gu_print(const char t[] )
+{
+    i2c.start();
+    i2c.write(addr_gu);
+
+    int i=0;
+    int j=0;
+    int k=0;
+    while(t[i]) {
+        if(t[i] != 37) {
+            gu_sendOneByte(t[i++]);
+        } else {
+            i++;
+            j=t[i++]-0x30;
+            if(j>9) {
+                j -= 7;
+            }
+            if(j>0x10) {
+                j -= 0x20;
+            }
+            k=t[i++]-0x30;
+            if(k>9) {
+                k -= 7;
+            }
+            if(k>0x10) {
+                k -= 0x20;
+            }
+            gu_sendOneByte(j*16+k);
+        }
+    }
+    i2c.stop();
+}
+
+void gu_RealTimeImage(int w, int h, char data[])
+{
+    h = h >> 3;  // get height in byte
+
+    i2c.start();
+    gu_sendOneByte(addr_gu);
+    gu_sendOneByte(0x1f);
+    gu_sendOneByte(0x28);
+    gu_sendOneByte(0x66);
+    gu_sendOneByte(0x11);
+    gu_sendOneByte( w & 0xff);
+    gu_sendOneByte( w >> 8);
+    gu_sendOneByte( h & 0xff);
+    gu_sendOneByte( h >> 8);
+    gu_sendOneByte(0x01);
+    for( int i=0; i < ( w * h ); i++) {
+        gu_sendOneByte( data[i]);
+    }
+    i2c.stop();
+}
+
+// Draw RealTimeBitImage by dot
+void gu_RealTimeImage_dot(int x, int y, int w, int h, const char data[])
+{
+    i2c.start();
+    gu_sendOneByte(addr_gu);
+    gu_sendOneByte(0x1f);
+    gu_sendOneByte(0x28);
+    gu_sendOneByte(0x64);
+    gu_sendOneByte(0x21);
+    gu_sendOneByte(x & 0xff);
+    gu_sendOneByte(x >> 8);
+    gu_sendOneByte(y & 0xff);
+    gu_sendOneByte(y >> 8);
+    gu_sendOneByte(w & 0xff);
+    gu_sendOneByte(w >> 8);
+    gu_sendOneByte(h & 0xff);
+    gu_sendOneByte(h >> 8);
+    gu_sendOneByte(0x01);
+    for(int i=0; i<( w * ((h + 7)>>3)); i++ ) {
+        gu_sendOneByte(data[i]);
+    }
+    i2c.stop();
+}
+
+
+// Set Font width
+void gu_fontWidth(const char fontWidth)
+{
+    /*
+    gu_sendOneByte(0x1f);
+    gu_sendOneByte(0x28);
+    gu_sendOneByte(0x67);
+    gu_sendOneByte(0x03);
+    gu_sendOneByte(fontWidth);
+    */
+
+    char accom_gu[5] ;   //gu-DへのI2Cコマンド用配列
+
+    accom_gu[0] = 0x1F;
+    accom_gu[1] = 0x28;
+    accom_gu[2] = 0x67;
+    accom_gu[3] = 0x03;
+    accom_gu[4] = fontWidth;
+
+    i2c.write(addr_gu, accom_gu, 5);
+
+}
+
+//
+// Move Cursor
+// 動作確認完了 2017/6/26
+void gu_cursor(int x, int y)
+{
+
+    /*
+    gu_sendOneByte(0x1f);
+    gu_sendOneByte(0x24);
+    gu_sendOneByte(x%256);
+    gu_sendOneByte(x>>8);
+    gu_sendOneByte(y%256);
+    gu_sendOneByte(y>>8);
+    */
+
+    char accom_gu[6] ;   //gu-DへのI2Cコマンド用配列
+
+    accom_gu[0] = 0x1f;
+    accom_gu[1] = 0x24;
+    accom_gu[2] = x & 0xFF;
+    accom_gu[3] = x >> 8;
+    accom_gu[4] = y & 0xFF;
+    accom_gu[5] = y >> 8;
+
+    i2c.write(addr_gu, accom_gu, 6);
+
+}
+
+// Font Body Size
+// 動作確認2017/6/26
+void gu_fontsize(const char code)
+{
+    /*
+    gu_sendOneByte(0x1f);
+    gu_sendOneByte(0x28);
+    gu_sendOneByte(0x67);
+    gu_sendOneByte(0x01);
+    gu_sendOneByte(code);
+    */
+    char accom_gu[5] ;   //gu-DへのI2Cコマンド用配列
+
+    accom_gu[0] = 0x1F;
+    accom_gu[1] = 0x28;
+    accom_gu[2] = 0x67;
+    accom_gu[3] = 0x01;
+    accom_gu[4] = code;
+
+    i2c.write(addr_gu, accom_gu, 5);
+
+}
+
+
+//
+// Reverse video font
+void gu_fontReverse(int code)
+{
+
+    i2c.start();
+    gu_sendOneByte(addr_gu);
+    gu_sendOneByte(0x1f);
+    gu_sendOneByte(0x72);
+    gu_sendOneByte(code);
+    i2c.stop();
+
+}
+
+void gu_touchPara(int x,int y)
+{
+    i2c.start();
+    i2c.write(addr_gu);
+    i2c.write(0x1F);
+    i2c.write(0x4B);
+    i2c.write(0x70);
+    i2c.write(x & 0xFF);
+    i2c.write(y & 0xFF);
+    i2c.stop();
+}
+
+// Magnify Font キャラクタ拡大表示
+void gu_magnify(int x, int y)
+{
+    gu_sendOneByte(0x1f);
+    gu_sendOneByte(0x28);
+    gu_sendOneByte(0x67);
+    gu_sendOneByte(0x40);
+    gu_sendOneByte(x);
+    gu_sendOneByte(y);
+}
+
+/*********************************
+    ノリタケ関数
+    ここまで
+**********************************/
+//
+//Show text
+void gu_print1(const char* ptext)
+{
+    i2c.write(addr_gu, ptext, strlen(ptext));
+}
+//
+//輝度調整
+void gu_luminance(const char* cl)
+{
+    i2c.start();
+    i2c.write(addr_gu);
+    i2c.write(0x1F);
+    i2c.write(0x58);
+    i2c.write(*cl & 0xFF);
+    i2c.stop();
+}
+//
+//gu_Dクラス用 1バイト送信
+void gu_sendOneByte(char data)                                            //arduino->mbed
+{
+    i2c.write(data);
+    //while(digitalRead(gu_MBUSY)==HIGH){} // wait for ready.
+    //Serial.write(data);               // send a byte.
+}
+//
+//CF+RF
+void gu_CRLF()
+{
+    char com[2];
+
+    com[0] = 0x0A; //LF
+    com[1] = 0x0D; //CR
+    i2c.write(addr_gu, com, 2);  //LF+CR
+}
+//
+//リバース指定or解除
+void gu_reverse(char x)   //リバース指定or解除
+{
+    char com[3];
+
+    com[0] = 0x1F;
+    com[1] = 0x72;
+    com[2] = x & 0xFF; //0x01:指定 0x00:解除
+    i2c.write(addr_gu, com, 3);
+}
+//1byte送信用
+void gu_onebyte(char data)
+{
+    i2c.write(addr_gu, &data, 1);
+}
+/*****************************************
+
+    SD CARD
+
+*****************************************/
+void sd_writetext(const char* ptext)
+{
+
+    mkdir("/sd/mydir", 0777);
+
+    FILE *fp = fopen("/sd/mydir/iop.txt", "w");//ディレクトリとファイル名の指定
+
+    if(fp == NULL) {
+
+        gu_fontsize(1);
+        gu_cursor(0,2);
+        /* ver1.1.3*/
+        gu_print1("No SD card");
+        //gu_print1("Could not open file for SD card");
+        //error("Could not open file for write\n");
+
+    }
+
+    fprintf(fp, ptext);
+    fclose(fp);
+
+}
\ No newline at end of file