void time_print(TIME time) { char buf[17]; my_itoa(buf,time.hour); print_zero(time.hour); lcd_printstr(buf); lcd_printch(':'); my_itoa(buf,time.minute); print_zero(time.minute); lcd_printstr(buf); lcd_printch(':'); my_itoa(buf,time.second); print_zero(time.second); lcd_printstr(buf); }
//右詰めに数値を3桁ごとにコンマを挿入して表示 void lcd_print_num(int num) { char tmp[33]; int i; num_conma(tmp, num); for (i = 0; tmp[i] != '\0'; i++) ; //表示座標を右端から文字数分引いたところから始める(右詰め) lcd_cursor(16 - i, 0); lcd_printstr(tmp); }
void stop_watch_print(TIME time) { char buf[17]; my_itoa(buf,time.hour); print_zero(time.hour); lcd_printstr(buf); lcd_printch(':'); my_itoa(buf,time.minute); print_zero(time.minute); lcd_printstr(buf); lcd_printch(':'); my_itoa(buf,time.second); print_zero(time.second); lcd_printstr(buf); my_itoa(buf,time.msec/10); lcd_printch('.'); print_zero(time.msec/10); lcd_printstr(buf); }
void sample_replay(int mode) /* 録音または再生を行う関数 */ /* mode: PLAY, SAMPLE */ { bufptr = 0; /* バッファポインタを初期化 */ if (mode == PLAY){ /* 再生モードの処理 */ /* ここにスピーカをスピーカとして使用する命令 */ speaker_switch(SPEAKER); lcd_init(); lcd_cursor(0,0); lcd_printstr(" Push * or # key"); lcd_cursor(0,1); lcd_printstr(" Now Playing... "); /* 音声出力処理内容を記述する */ while(bufptr <= TIME){ /* データ出力を繰り返す */ da_out( 0, databuf[bufptr]); /* ◎D/Aにデータを出力 */ bufptr++; /* ◎バッファポインタを +1 */ } } if (mode == INVERSE){ /* 再生モードの処理 */ /* ここにスピーカをスピーカとして使用する命令 */ speaker_switch(SPEAKER); lcd_init(); lcd_cursor(0,0); lcd_printstr(" Push * or 5 key"); lcd_cursor(0,1); lcd_printstr(" Now Inverse... "); /* 音声出力処理内容を記述する */ while(bufptr <= TIME){ /* データ出力を繰り返す */ da_out( 0, databuf[TIME-bufptr]);/* ◎D/Aにデータを出力 */ bufptr++; /* ◎バッファポインタを +1 */ } } if (mode == SAMPLE){ /* 録音モードの処理 */ /* ここにスピーカをマイクとして使用する命令 */ speaker_switch(MIC); lcd_init(); lcd_cursor(0,0); lcd_printstr(" Push * or 5 key"); lcd_cursor(0,1); lcd_printstr(" Now Sampling..."); /* 音声取込処理内容を記述する */ while(bufptr <= TIME){ /* データ読込を繰り返す */ ad_start( 0, 0); /* ◎A/D変換スタート */ while(ADSTATUS() == 0); /* ◎A/D変換終了待ち 約5us */ databuf[bufptr] = ADREAD(); /* ◎変換データを格納 */ bufptr++; /* ◎バッファポインタを +1 */ } } speaker_switch(MIC); /* スピーカーオフ */ }
unsigned char menu(void) /* LCD にメニューを書いて動作を選択するための関数 */ /* 戻り値は入力キー情報 */ { /* キー入力取得のための変数を宣言する */ unsigned char cf, key_data; lcd_cursor(0,0); /* LCD にメッセージ表示 */ lcd_printstr("Rec:[*] Play:[#]"); lcd_cursor(0,1); lcd_printstr(" Push * or # key"); /* キー入力判定用変数の初期化 */ cf = 0; key_data = 0; char old_data=0; while (cf == 0 ){ /* キー入力するまでループする */ /* ここにキー入力の処理を記述する */ /* ここから追記 */ key_data = 0; //key 1,2,3 PADR = 0x07; // PA3 = L cf = P6DR; // データ入力 cf = ~cf; // cfの反転 cf &= 0x07; // P60,1,2のみ見る switch(cf) { case 1 : key_data = '1'; break; case 2 : key_data = '2'; break; case 4 : key_data = '3'; break; } //key 4,5,6 PADR = 0x0b; cf = P6DR; cf = ~cf; cf &= 0x07; switch(cf) { case 1 : key_data = '4'; break; case 2 : key_data = '5'; break; case 4 : key_data = '6'; break; } //key 7,8,9 //PADR = 0x0b; /* This is a mistake code. */ PADR = 0x0d; cf = P6DR; cf = ~cf; cf &= 0x07; switch(cf) { case 1 : key_data = '7'; break; case 2 : key_data = '8'; break; case 4 : key_data = '9'; break; } //key *,0,# PADR = 0x0e; cf = P6DR; cf = ~cf; cf &= 0x07; switch(cf) { case 1 : key_data = '*'; break; case 2 : key_data = '0'; break; case 4 : key_data = '#'; break; } //チャタリング防止 if(key_data != 0 && old_data != key_data){ sleep_ms(10); old_data = key_data; } if(key_data == 0){ old_data = 0; sleep_ms(10); } /* ここまで追記 */ /* ◎key *,# のみの入力に対応させる処理を記述する */ /*追記*/ if(key_data == '*' || key_data == '5' || key_data == '#') cf = 1; /*ここまで*/ } /* 入力されたキーの情報を返す */ return key_data; }
int main(void) { unsigned int score, high_score; char score_s[MAXDIGITNUM+1]; ROMEMU(); USE_UI(); timer_pri_set(0,1); random_init(); lcd_init(); key_init(); timer_init(); sound_init(); timer_set(1,100); timer_start(1); ENINT(); lcd_cursor(0,0); lcd_printstr(" 0:Game Start "); lcd_cursor(0,1); lcd_printstr(" *:High Score "); high_score = 0; lcd_cursor(0,0); while(1) { if (key_check(10) == KEYON){ /* *キー:ハイスコア表示 */ lcd_cursor(0,0); /* LCD にハイスコア表示 */ lcd_printstr(" High Score is "); lcd_cursor(0,1); lcd_printstr(" "); lcd_cursor(0,1); lcd_printstr(ntos(high_score,score_s)); } if (key_check(10) == KEYOFF){ lcd_cursor(0,0); lcd_printstr(" 0:Game Start "); lcd_cursor(0,1); lcd_printstr(" *:High Score "); } if (key_check(11) == KEYON){ /* 0キー:ゲームスタート */ zanki = 5; lcd_cursor(0,0); /* LCD に操作方法表示 */ lcd_printstr("*:Sight 0:Trig."); score = game_start(); /* ゲームスタート */ lcd_cursor(0,1); /* 得点表示欄のクリア */ lcd_printstr(" "); if (score > high_score){ /* ハイスコアのとき */ high_score = score; /* ハイスコア登録 */ lcd_cursor(0,0); /* ハイスコア表示 */ lcd_printstr(" High Score !!! "); lcd_cursor(0,1); lcd_printstr(ntos(high_score,score_s)); } else { /* ハイスコアでないとき*/ lcd_cursor(0,0); /* スコアを表示 */ lcd_printstr(" Your Score ... "); lcd_cursor(0,1); lcd_printstr(ntos(score,score_s)); } n_time = 0; while (n_time < WAITFEWSEC); /* 得点表示後にちょっと待つ */ lcd_cursor(0,0); /* LCD にメッセージ表示 */ lcd_printstr(" 0:Game Start "); lcd_cursor(0,1); lcd_printstr(" *:High Score "); } } }
int game_start(void) { int target, score, gameover, hit, i, j; int prev_key10, prev_key11, key10, key11; unsigned int ds; char t, nc; char disp[MAXINVNUM+1]; /* [0: 1234567890n] のような画面イメージ */ /* 照準,区切り,インベーダとUFO */ target = 0; t = '0'; score = 0; /* 照準とスコアの初期化 */ speed_count = 0; speed = INITSPEED; /* プレイ速度の初期化 */ shift_flag = FALSE; /* 敵の前進フラグの初期化 */ disp[0] = '0'; disp[1] = ':'; /* 表示フィールドの初期化 */ for (i = 2; i < MAXINVNUM; i++) disp[i] = ' '; disp[MAXINVNUM] = '\0'; gameover = FALSE; /* ゲーム終了フラグの初期化 */ key10 = key_check(10); /* キーバッファ(照準キー)の初期化 */ prev_key10 = KEYOFF; key11 = key_check(11); /* キーバッファ(発射キー)の初期化 */ prev_key11 = KEYOFF; lcd_cursor(0,1); /* 初期画面の表示 */ lcd_printstr(disp); while (gameover == FALSE){ /* ゲームオーバでなければループ */ /* キーの立上りを検出するための前回チェック時のキー状態を記憶 */ /* キーバッファ(照準キー)処理 */ if (key10 != KEYTRANS) prev_key10 = key10; /* 遷移中は前々回の値そのまま */ key10 = key_check(10); /* キーバッファ(発射キー)処理 */ if (key11 != KEYTRANS) prev_key11 = key11; /* 遷移中は前々回の値そのまま */ key11 = key_check(11); if ((prev_key10 == KEYOFF) && (key10 == KEYON)){ /* 照準キーが押されたときの処理 */ /* 照準は 0->1->...->8->9->n->0->... と順に変化する */ target++; /* 照準 +1 */ if (target > 10) target = 0; /* UFOの次は0 */ if (target < 10) t = '0' + target; /* 照準がUFOでないときのキャラ */ else t = 'n'; /* 照準がUFOのときのキャラ */ disp[0] = t; /* 照準値を表示にセット */ effect('t'); /* 効果音を鳴らす */ /* フィールドの表示 */ lcd_cursor(0,1); lcd_printstr(disp); } if ((prev_key11 == KEYOFF) && (key11 == KEYON)){ /* 発射キーが押されたときの処理 */ hit = FALSE; /* ヒット判定フラグの初期化 */ i = 2; /* 最も左の敵表示位置 */ while ((i < MAXINVNUM) && (hit != TRUE)){ /* 列の左から命中を探す */ if (disp[i] == t){ /* 照準と一致するキャラか? */ hit = TRUE; /* ヒット判定 */ ds = MAXINVNUM - i; /* 基本得点の計算(砲台に近い程大) */ score = score + ds; /* 得点追加 */ if (target > 9) score = score + ds * 2; /* UFOなら3倍の得点 */ for (j = i; j > 2; j--) disp[j] = disp[j-1]; /* 命中左側を右寄せ */ disp[2] = ' '; /* 最も左は常に空白を詰める */ /* フィールドの表示 */ lcd_cursor(0,1); lcd_printstr(disp); } i++; /* 探索位置を +1 */ } /* ヒット判定があるか右端まで調べたら, 探索終了 */ if (hit == TRUE) effect('s'); /* 命中時の効果音 */ else { /* Add 3-1 */ zanki--; /* get damage */ effect('m'); /* 失敗時の効果音 */ } } /* 敵が前進するタイミングのときの処理 */ if (shift_flag == TRUE){ /* 前進フラグが立っているなら */ if (disp[2] != ' ') disp[1] = disp[2]; /* 侵略時のみ区切りに侵入 */ for (i = 2; i < MAXINVNUM; i++) /* 敵全体を左に1つシフト */ disp[i] = disp[i + 1]; if (score % 10 == 1) nc = 'n'; /* スコアの最下位が1ならUFO出現 */ else nc = (random() % 10) + '0'; /* それ以外はランダムな数字 */ disp[MAXINVNUM - 1] = nc; /* 右端に新キャラを入れる */ shift_flag = FALSE; /* 前進フラグの消去 */ lcd_cursor(0,1); /* フィールドの表示 */ lcd_printstr(disp); } /* Modify 3-1 */ if (disp[1] != ':') { zanki--; score += game_start(); } if(zanki==0) { gameover = TRUE; } } return score; /* 得点を返す */ }