// //「ミュージックプレイ&LED 点滅」Ver.3 // // 2022年9月 SOUND_3.c // // P1_6:圧電スピーカー // P1_1:LED(赤) // P1_2:タクトSW // P3_7:LED(緑) // // 1 OCT UP...... u // 1 OCT DOWN.... d // DO RE MI FA SO RA SI R // HALF UP ...... s #include "sfr_r8m11a.h" /* R8C/M11A SFRの定義ファイル */ #include "r8cm11a_data_flash_lib.h" /* データフラッシュライブラリ */ #define BEEP_500 10000 // 500Hz : Cu = 5000000 / f (Hz) #define BEEP_1000 5000 // 1000Hz: Cu = 5000000 / f (Hz) #define R 0 #define dDO 1 // 131 // == DO3 #define dDOs 2 // 139 #define dRE 3 // 147 #define dREs 4 // 156 #define dMI 5 // 165 #define dFA 6 // 175 #define dFAs 7 // 185 #define dSO 8 // 196 #define dSOs 9 // 208 #define dRA 10 // 220 #define dRAs 11 // 233 #define dSI 12 // 247 #define DO 13 // 262 // == DO4 #define DOs 14 // 277 #define RE 15 // 294 #define REs 16 // 311 #define MI 17 // 330 #define FA 18 // 349 #define FAs 19 // 370 #define SO 20 // 392 #define SOs 21 // 415 #define RA 22 // 440 #define RAs 23 // 466 #define SI 24 // 494 #define uDO 25 // 523 // == DO5 #define uDOs 26 // 554 #define uRE 27 // 587 #define uREs 28 // 622 #define uMI 29 // 659 #define uFA 30 // 698 #define uFAs 31 // 740 #define uSO 32 // 784 #define uSOs 33 // 831 #define uRA 34 // 880 #define uRAs 35 // 932 #define uSI 36 // 988 // onkai_t[] = 5000000 / Freq.(Hz) <> 38226 = 5000000 / 131 (Hz) const unsigned int onkai_t[] = { 0, 38226, 36081, 34056, 32144, 30340, 28637, 27030, 25513, 24081, 22729, 21454, 20250, 19113, 18040, 17028, 16072, 15170, 14319, 13515, 12756, 12041, 11365, 10727, 10125, 9557, 9020, 8514, 8036, 7585, 7159, 6758, 6378, 6020, 5682, 5363, 5062 }; //======================== (1) クラリネットをこわしちゃった const int tempo1 = 200; // const int oto1[] = { SOs,SOs,SOs,SOs,SOs,SOs,SOs,RAs,uDO,RAs,SOs,REs,uDO,uDO,uDO,uDO,uDO,uDO,uDO, uDOs,uREs,uDOs,uDO,SOs,uREs,uREs,uREs,uFA,uREs,uDOs,uDO,uDOs,uDOs,uDOs,uDOs, uDOs,uDOs,uDOs,uDOs,uDOs,uREs,uDOs,uDO,RAs,uDO,uDO,uDO,uDO,uREs,uDOs,uDO,R, uREs,uDOs,uDO,R,uREs,uDO,uDO,uDO,uDO,uREs,uDO,uDO,uDO,uDO,uREs,uFA,uREs,uDOs, uDO,RAs,uDO,uDOs,uDOs,RAs,RAs,RAs,RAs,uDOs,RAs,RAs,RAs,RAs,uDOs,uREs,uDOs,uDO, RAs,SOs,R }; const int nag1[] = { 2,2,2,2,2,2,2,2,6,2,4,4,2,2,2,2,2,2,2,2,6,2,4,4,4,3,1,2,2,2,2,2,2,3,1,8,2,2,3, 1,2,2,2,2,4,3,1,8,6,2,4,4,6,2,4,2,2,2,1,1,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1, 2,2,2,1,1,2,2,2,2,2,2,4,4 }; const int len1 = sizeof(oto1)/2; // ============== // ================================ (2) ジングルベル const int tempo2 = 160; // const int oto2[] = { DO,RA,SO,FA,DO,DO,DO, DO,RA,SO,FA,RE,RE, RE,RAs,RA,SO,MI,uDO, uDO,uDO,RAs,SO,RA,RE, DO,RA,SO,FA,DO,DO, DO,RA,SO,FA,RE,RE, RE,RAs,RA,SO,uDO,uDO,uDO,uDO, uRE,uDO,RAs,SO,FA,R,uDO, RA,RA,RA,RA,RA,RA, RA,uDO,FA,SO,RA,R, RAs,RAs,RAs,RAs,RAs,RA,RA,RA,RA, RA,SO,SO,RA,SO,R,uDO, RA,RA,RA,RA,RA,RA, RA,uDO,FA,SO,RA,R, RAs,RAs,RAs,RAs,RAs,RA,RA,RA,RA, uDO,uDO,RAs,SO,FA }; const int nag2[] = { 2,2,2,2,6,1,1, 2,2,2,2,6,2, 2,2,2,2,6,2, 2,2,2,2,6,2, 2,2,2,2,6,2, 2,2,2,2,6,2, 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,4, 2,2,4,2,2,4, 2,2,3,1,6,2, 2,2,3,1,2,2,2,1,1, 2,2,2,2,2,2,4, 2,2,4,2,2,4, 2,2,3,1,6,2, 2,2,3,1,2,2,2,1,1, 2,2,2,2,6,2 }; const int len2 = sizeof(oto2)/2; // ============== // ========================= (3) 赤鼻のトナカイ const int tempo3 = 200; // const int oto3[] = { SO,RA,SO,MI,uDO,RA,SO,R,SO,RA,SO,RA,SO,uDO,SI,R, FA,SO,FA,RE,SI,RA,SO,R,SO,RA,SO,RA,SO,RA,MI,R, SO,RA,SO,MI,uDO,RA,SO,R,SO,RA,SO,RA,SO,uDO,SI,R, FA,SO,FA,RE,SI,RA,SO,R,SO,RA,SO,RA,SO,uRE,uDO,R, RA,RA,uDO,RA,SO,MI,SO,FA,RA,SO,FA,MI,R, RE,MI,SO,RA,SI,SI,SI,uDO,uDO,SI,RA,SO,FA,RE,RE,R, SO,RA,SO,MI,uDO,RA,SO,R,SO,RA,SO,RA,SO,uDO,SI,R, FA,SO,FA,RE,SI,RA,SO,R,SO,RA,SO,RA,SO,uRE,uDO,R }; const int nag3[] = { 4,2,2,4,4,4,8,4,2,2,2,2,4,4,12,4, 2,2,4,4,4,4,8,4,2,2,2,2,4,4,12,4, 2,2,4,4,4,4,8,4,2,2,2,2,4,4,12,4, 4,2,2,4,4,4,8,4,2,2,2,2,4,4,12,4, 4,4,4,4,4,4,8,4,4,4,4,12,4, 4,4,4,4,4,4,8,4,4,4,4,4,2,2,4,4, 2,2,4,4,4,4,8,4,2,2,2,2,4,4,12,4, 2,2,4,4,4,4,8,4,2,2,2,2,4,4,12,4 }; const int len3 = sizeof(oto3)/2; // ============== //======================== (4) 大きな古時計 const int tempo4 = 160; // const int oto4[] = { RE,SO,FAs,SO,RA,SO,RA,SI,SI,uDO,SI,MI,RA,RA,SO,SO,SO,FAs,MI,FAs,SO,R,RE,RE, SO,FAs,SO,RA,SO,RA,SI,uDO,SI,MI,RA,RA,SO,SO,SO,FAs,MI,FAs,SO,R,SO,SI, uRE,SI,RA,SO,FAs,SO,RA,SO,FAs,MI,RE,SO,SI,uRE,SI,RA,SO,FAs,SO,RA,R,RE, SO,SO,R,RA,R,SI,SI,uDO,SI,MI,RA,RA,SO,FAs,SO,R,RE,RE, SO,RE,RE,MI,RE,RE,dSI,RE,dSI,RE,RE,SO,RE,RE,MI,RE,RE,dSI,RE,dSI,RE,RE, SO,SO,R,RA,R,SI,SI,uDO,SI,MI,RA,RA,SO,FAs,SO,R }; const int nag4[] = { 4,4,2,2,4,2,2,2,2,2,2,4,2,2,4,2,2,4,2,2,8,4,2,2, 4,2,2,4,2,2,4,2,2,4,2,2,4,2,2,4,2,2,8,4,2,2, 4,2,2,4,2,2,2,2,2,2,4,2,2,4,2,2,4,2,2,12,2,2, 2,2,4,4,4,2,2,2,2,4,2,2,8,8,8,4,2,2, 4,2,2,2,2,4,4,4,4,2,2,4,2,2,4,2,2,4,4,4,2,2, 2,2,4,4,4,2,2,2,2,4,2,2,8,8,12,4 }; const int len4 = sizeof(oto4)/2; // ============== //======================== (5) もろびとこぞりて const int tempo5 = 160; // const int oto5[] = { uFA,uMI,uRE,uDO,uFA,uMI,uRE,uDO,R,uDO,uRE,uRE,uMI,uMI,uFA,uFA,uMI,uRE,uDO,RAs,RA, SO,FA,R,uDO,uRE,uRE,uMI,uMI,uFA,R,uFA,uFA,uMI,uRE,uDO,uDO,RAs,RA,uFA,uFA,uMI,uRE, uDO,uDO,RAs,RA,RA,RA,RA,RA,RA,RAs,uDO,R,RAs,RA,SO,SO,SO,SO,RA,RAs,R,RA,SO,FA,uFA, uRE,uDO,RAs,RA,RAs,RA,SO,FA }; const int nag5[] = { 4,3,1,8,4,3,1,4,2,2,6,2,6,2,16,4,3,1,6,2,4,4,4,2,2,6,2,6,2,12,2,2,2,2,2,2,3,1,2, 2,2,2,2,2,3,1,2,2,2,2,2,1,1,4,2,1,1,2,2,2,1,1,4,2,1,1,2,4,2,3,1,2,2,4,4,8 }; const int len5 = sizeof(oto5)/2; // ============== // ================ (6) ゆうやけこやけ const int tempo6 = 90; // const int oto6[] = { SO, SO, SO, RA, SO, SO, SO, MI, DO, DO, RE, MI, RE, R, MI, MI, SO, RA, uDO, uDO, RA, SO, SO, RA, SO, uDO, R, uDO, uRE, uDO, RA, uDO, uDO, SO, SO, RA, SO, RA, SO, MI, R, SO, MI, RE, DO, RE, RE, DO, RE, MI, SO, RA, SO, uDO, R }; const int nag6[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2 }; const int len6 = sizeof(oto6)/2; // ============== void sw_chk( void ); void init( void ); void delay( unsigned long timer_set ); void sounder( unsigned int tone, int time ); void change_hosc( void ); int note, tempo, i, s_flg; void main( void ) //********************************メイン { init(); //***** change_hosc(); //***** 20MHz Internal Clok s_flg = 0; do { tempo = tempo1; //*********** (1) for (note = 0; note < len1; note++) { sounder( onkai_t[oto1[note]], nag1[note] ); if ( s_flg == 1 ) break; } s_flg = 0; delay(1000L); tempo = tempo2; //*********** (2) for (note = 0; note < len2; note++) { sounder( onkai_t[oto2[note]], nag2[note] ); if ( s_flg == 1 ) break; } s_flg = 0; delay(1000L); tempo = tempo3; //*********** (3) for (note = 0; note < len3; note++) { sounder( onkai_t[oto3[note]], nag3[note] ); if ( s_flg == 1 ) break; } s_flg = 0; delay(1000L); tempo = tempo4; //*********** (4) for (note = 0; note < len4; note++) { sounder( onkai_t[oto4[note]], nag4[note] ); if ( s_flg == 1 ) break; } s_flg = 0; delay(1000L); tempo = tempo5; //*********** (5) for (note = 0; note < len5; note++) { sounder( onkai_t[oto5[note]], nag5[note] ); if ( s_flg == 1 ) break; } s_flg = 0; delay(1000L); tempo = tempo6; //*********** (6) for (note = 0; note < len6; note++) { sounder( onkai_t[oto6[note]], nag6[note] ); if ( s_flg == 1 ) break; } s_flg = 0; delay(1000L); } while(1); } void sw_chk( void ) //**************** SW (LOW) Check { if ( p1_2 == 0 ) { s_flg = 1; } } void init( void ) //*********** INIT { // ポートの入出力設定 pd1 = 0b11111011; // ポート1の入出力設定 P1_2: 入力 pd3 = 0b11111111; // ポート3の入出力設定 pd4 = 0b11111111; // ポート4の入出力設定 pda = 0b11111111; // ポートAの入出力設定 pur1 = 0b00000100; // P1_2: プルアップ // タイマRJ2を使用 ===== p16sel1 = 1; // P1_6をTRJO端子にする p16sel0 = 0; // msttrj = 0; // タイマRJ2を有効にする trjmr = 0x31; // パルス出力モードに設定 trj = 0; // TRJ×1/20M*2の時間でON/OFFする } void delay( unsigned long timer_set ) //***** 引数  タイマ値 1=1ms (at 20MHz) { do { for( i=0; i<871; i++ ); } while( timer_set-- ); } void sounder( unsigned int tone, int time ) //********************* { if( tone == 0 ) { tstart_trjcr = 0; p1_1 = 0; p3_7 = 0; } // タイマ停止 、LED (p1_1=OFF, p3_7=OFF) else { trj = tone; tstart_trjcr = 1; p1_1 = 1; p3_7 = 0; } // タイマ開始 、LED (p1_1=ON, p3_7=OFF) delay( 15000L * time / tempo ); // ***タイマ停止で p1_6=Low にならない時もある***** tstart_trjcr = 0; p1_1 = 0; p3_7 = 1; p1_6 = 0; // タイマ停止 、LED (p1_1=OFF, p3_7=ON) SP (p1_6=OFF) sw_chk(); if ( s_flg == 1 ) { return; } delay( 6000L * time / tempo ); // 19500L = 15000L * 0.4 sw_chk(); if ( s_flg == 1 ) { return; } } void change_hosc( void ) // クロックを高速オンチップオシレータ(20MHz)に変更 { prc0 = 1; /* プロテクト解除 */ hocoe = 1; /* 高速オンチップオシレータ発信開始 */ for(i=0; i<50; i++ ); /* 安定するまで少し待つ(約10ms) */ hscksel = 1; /* 高速オンチップオシレータのクロックに切換え*/ scksel = 1; /* システム基準クロック 低速→高速切換え*/ prc0 = 0; /* プロテクト保護 */ }