/**************************************************/ /* エンコーダメニュー展開 RIKIYA 2002.11.7*/ /* enctest2.c */ /* H8-3048/F*/ /* ロータリエンコーダと液晶表示器を使って */ /* メニュー選択の操作パネルを作る */ /**************************************************/ #include <3048f.h> #include /* メニュー文字列の設定 */ static char *menu[4][9] = /*乗り物を選ぶためのメニュー*/ {{"Select Vehicle ", /* 表題 */ "CAR ", "BIKE ", "MTB "}, /*自動車メーカーを選ぶためのメニュー*/ {"Select CAR Maker ", /* 表題 */ "TOYOTA ", "NISSAN ", "HONDA ", "MITSUBISHI ", "BMW ", "VOLVO "}, /*バイクメーカーを選ぶためのメニュー*/ {"Select BIKE Maker", /* 表題 */ "HONDA ", "YAHAMA ", "KAWASAKI ", "SUZUKI ", "DUCATI "}, /*自転車メーカーを選ぶためのメニュー*/ {"Select MTB Maker ", /* 表題 */ "TREK ", "SPECIALIZED ", "GT ", "Cannondale ", "MONGOOSE ", "SCHWINN ", "GIANT ", "PEUGEOT "}}; /*メイン関数 *******************************************/ void main(void){ timer_init(); /* タイマーの初期化 */ lcd_init(); /* 液晶表示器の初期化 */ sci1_init(); /* シリアル通信の初期化 */ PA.DDR = 0x00; /* PA全BIT入力モード */ P1.DDR = 0xff; /* P1全BIT出力モード */ ITU.TMDR.BIT.MDF = 1; /* ITU2 位相係数モード */ ITU.TSTR.BIT.STR2 = 1; /* カウント開始 */ ITU2.TCNT = 0; /* TCNTを0にクリア */ while(1){ /*乗り物を選ぶ処理*/ switch(menu_sel(0,3)){ case 1: /* 自動車メーカーを選ぶ処理 */ /* 選んだメーカー名をシリアルで出力する*/ sci1_strtx(menu[1][menu_sel(1,6)]); sci1_tx('\r'); sci1_tx('\n'); break; case 2: /* バイクメーカーを選ぶ処理 */ /* 選んだメーカー名をシリアルで出力する */ sci1_strtx(menu[2][menu_sel(2,5)]); sci1_tx('\r'); sci1_tx('\n'); break; case 3: /* 自転車メーカーを選ぶ処理 */ /* 選んだメーカー名をシリアルで出力する */ sci1_strtx(menu[3][menu_sel(3,8)]); sci1_tx('\r'); sci1_tx('\n'); break; } } } /* メニュー表示/選択関数 ***************************/ /* menu_no メニューページの番号 0始まり */ /* menber メニューに含まれる選択肢の数 1始まり */ /* PAのbit4が0で、表示中の選択肢に決定する。 */ /* 選択された選択肢の番号を返す */ /***************************************************/ int menu_sel(int menu_no,int menber){ int count; int end_no; while(PA.DR.BIT.B4 == 0){} /* 選択スイッチを離すまで停止*/ end_no = (menber + 1) * 4; /* エンコーダカウント値オーバー領域 */ ITU2.TCNT = 0; /* エンコーダカウント値クリア */ lcd_locate(0,0); /* カーソル位置の指定 */ lcd_print(menu[menu_no][0]); /* メニュータイトルの表示 */ while(1){ P1.DR.BYTE = ITU2.TCNT; /*デバッグ用カウント値表示 */ /*アップカウント中に選択肢の上限を超えた場合に初めの選択肢にジャンプする処理*/ if((ITU2.TCNT >= (end_no - 4)) && (ITU2.TCNT < end_no)){ count = 1; ITU2.TCNT = 0; /*ダウンカウント中に選択肢の下限を超えた場合に最終の選択肢にジャンプする処理*/ }else if((ITU2.TCNT >= 0x20) && (ITU2.TCNT <= 0xFFFF)){ count = menber; ITU2.TCNT = end_no - 5; /* 以下、順次選択肢を切り替えて行く処理 */ }else if((ITU2.TCNT >= 0) && (ITU2.TCNT < 0x04)){ count = 1; }else if((ITU2.TCNT >= 0x04) && (ITU2.TCNT < 0x08)){ count = 2; }else if((ITU2.TCNT >= 0x08) && (ITU2.TCNT < 0x0C)){ count = 3; }else if((ITU2.TCNT >= 0x0C) && (ITU2.TCNT < 0x10)){ count = 4; }else if((ITU2.TCNT >= 0x10) && (ITU2.TCNT < 0x14)){ count = 5; }else if((ITU2.TCNT >= 0x14) && (ITU2.TCNT < 0x18)){ count = 6; }else if((ITU2.TCNT >= 0x18) && (ITU2.TCNT < 0x1C)){ count = 7; }else if((ITU2.TCNT >= 0x1C) && (ITU2.TCNT < 0x20)){ count = 8; } /* 対象となる選択肢を表示器に表示させる処理 */ lcd_locate(0,1); /* カーソル位置の指定 */ lcd_print(menu[menu_no][count]); /* 選択ボタンが押されたら選択肢番号countを戻り値として関数を終了する*/ if(PA.DR.BIT.B4 == 0){ return count; } } }