void int_imia0(void) /* 音程を出すための割り込みハンドラ */ /* 使用する大域変数と役割は以下の通り */ /* timer0_count は割り込み回数を数えるカウンタ */ /* play_cont は指定音長になるときの割り込み回数 */ /* da_amp はD/Aの出力上限値 */ { /* ここで、割り込み回数をインクリメントする */ timer0_count++; /* ここで、割り込みがかかる度にD/Aの出力を上限値か下限値に切替える */ if(timer0_count&0x01) { da_out(0,da_amp); } else { da_out(0,0); } /* ここで、タイマカウントが音長カウントに達したらタイマストップする */ /* タイマストップしたら割り込みはかからなくなる */ if(timer0_count>=play_count) { timer_stop(0); da_out(0,0); } /* 再びタイマ割り込みを使用するために必要な操作 */ timer_intflag_reset(0); /* タイマ0の割り込みフラグをクリア */ ENINT(); /* CPUを割り込み許可状態に */ }
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); /* スピーカーオフ */ }
void sound(int vol,int div) { speaker_switch(SPEAKER); for(;;) { da_out(0,vol); wait1_100ms(div); da_out(0,0); wait1_100ms(div); } }
void int_imia0(void) { if(note_flag==1) { da_out(0,note_vol); note_flag = 0; } else { da_out(0,0); note_flag = 1; } timer_intflag_reset(0); ENINT(); }
void sound_sin(int vol,int div) { unsigned char data[360]; int wcount; int deg; speaker_switch(SPEAKER); for(;;) { for(deg=0;deg<360;deg+=16) { da_out(0,sin_data[deg]); for(wcount=div;wcount>0;wcount--); } } }