switch文でswの状態に応じた動作のフラグを立てています。
各動作の内容は、フラグごとにif文で定義しています。
次の内容で困っています。
コードを掲載させていただきます。
if(use_r)内の動作について。
①~③の間は、swの状態をモニタしたくありません。
④の動作において、swの状態がある決められた状態になるまで、繰り返し動作をし続け、
その後、switch文に戻る…という動作を行いたいです。
私が記述したコードでは、
①~③の間に、swの状態をモニタしてしまいます。
そのため、③の動作の後(このとき、swの状態は0xFFであったり、switch文で定義されていない状態になっています。)、
④の動作に入れないまま、何も動作しない結果になってしまいます。
(③のあと、swの状態が、switch文で定義されていない状態になっているので、当たり前なのですが…)
while(1){
char use_r = 0, use_g = 0, use_b = 0; /* 各関数を使うか */
char is_valid = 1; /* 定義があるか */
int count=0;
sw = PORTA & 0xFF;
switch(sw){
case 0x00:
use_r = 1;
break;
case 0x01:
use_b = 1;
break;
case 0x30:
use_g = 1;
break;
default:
is_valid = 0; /* 定義が無かった */
break;
}
/* 定義がある場合のみ処理する */
if(is_valid) {
if(prev_sw != sw) {
Reset(); //初期化
delay_ms(1); //delay
}
if (use_r) {
MOT_RIni(); //右初期化
MOT_LIni(); //左初期化
delay_ms(1);
//①機体を停止
MOT_RStop(); //右停止
MOT_LStop(); //左停止
delay_ms(1);
//②機体を後ろに下げる
MOT_RBack(); //右後進
MOT_LBack(); //左後進
delay_ms(500);
//③機体を左に曲げる
MOT_RStop(); //右停止
MOT_LFeed(); //左前進
delay_ms(500);
//①~③の間は、SWの状態をモニタしない
//④swの状態が、0x00、0x01、0x30のいずれかになるまで機体を前進させる
MOT_RStop(); //右停止
MOT_LFeed(); //左前進
do {
sw = PORTA & 0xFF;
}while(!((sw==0x00))||(sw==0x01)||(sw==0x30));
}
}
prev_sw = sw;
}