// //「ミュージックプレイ&LED 点滅」Ver.3 // // 2024年6月6日 SOUND_4.c // // p3_7:スピーカー // P1_0:LED(赤) // P4_2:LED(緑) // // 1 OCT UP...... u // 1 OCT DOWN.... d // DO RE MI FA SO RA SI R // HALF UP ...... s #include "sfr_r8m12a.h" /* R8C/M12A SFRの定義ファイル */ #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 sound_1(unsigned int tone, int time); void sound_2(unsigned int tone, int push); void change_hosc(void); void jidou(void); void syudou(void); int note, tempo, i, n_flg, mode, push; int p34, p35, p46, p47, p45, p17, p15, p13; void main(void) //********************************メイン { init(); //***** change_hosc(); //***** 20MHz Internal Clock ON mode = 1; // mode: 1...オルゴール、 2...手動演奏、  電源投入後は mode: 1 オルゴール sw_chk(); do { if (mode == 1) { jidou(); delay(1000L); } // オルゴール else if (mode == 2) { syudou(); delay(1000L); } // 手動演奏 } while(1); } void sw_chk(void) //**************** SW Check { if (mode == 1 && p1_3 == 0 && p1_5 == 0 ) mode = 2; // mode = 1 オルゴールで p1_3, p1_5 押している時 => mode =2 手動演奏にする else if (mode == 2 && p1_3 == 0 && p1_5 == 0 ) mode = 1; // mode = 2 手動演奏で p1_3, p1_5 押している時 => mode 1 オルゴールにする else if (mode == 1 && p1_3 == 0) n_flg = 1; // mode = 1 自動演奏で p1_3押した時 => 次の曲へ } void jidou(void) //**************** オルゴール { do { if (mode == 2) break; // do while を抜ける n_flg = 0; delay(1000L); //*********** (1) tempo = tempo1; for (note = 0; note < len1; note++) { sound_1(onkai_t[oto1[note]], nag1[note]); if (n_flg == 1 || mode == 2) break; // for ループ抜け次の曲へ } if (mode == 2) break; n_flg = 0; delay(1000L); //*********** (2) tempo = tempo2; for (note = 0; note < len2; note++) { sound_1(onkai_t[oto2[note]], nag2[note]); if (n_flg == 1 || mode == 2) break; } if (mode == 2) break; n_flg = 0; delay(1000L); //*********** (3) tempo = tempo3; for (note = 0; note < len3; note++) { sound_1(onkai_t[oto3[note]], nag3[note]); if (n_flg == 1 || mode == 2) break; } if (mode == 2) break; n_flg = 0; delay(1000L); //*********** (4) tempo = tempo4; for (note = 0; note < len4; note++) { sound_1(onkai_t[oto4[note]], nag4[note]); if (n_flg == 1 || mode == 2) break; } if (mode == 2) break; n_flg = 0; delay(1000L); //*********** (5) tempo = tempo5; for (note = 0; note < len5; note++) { sound_1(onkai_t[oto5[note]], nag5[note]); if (n_flg == 1 || mode == 2) break; } if (mode == 2) break; n_flg = 0; delay(1000L); //*********** (6) tempo = tempo6; for (note = 0; note < len6; note++) { sound_1(onkai_t[oto6[note]], nag6[note]); if (n_flg == 1 || mode == 2) break; } } while(1); } void syudou(void) //**************** 手動演奏 { p1_0 = 0; p4_2 = 0; // LED OFF // 19113, 17028, 15170, 14319, 12756, 11365, 10125, 9557 p34 = 0; p35 = 0; p46 = 0; p47 = 0; p45 = 0; p17 = 0; p15 = 0; p13 = 0; do { if (p3_4 == 0 && p34 == 0) { sound_2(19113, 1); p34 = 1; }// SW1 ON  DO 演奏 else if (p3_4 == 1 && p34 == 1) { sound_2(19113, 0); p34 = 0; } else if (p3_5 == 0 && p35 == 0) { sound_2(17028, 1); p35 = 1; } // SW2 ON  RE 演奏 else if (p3_5 == 1 && p35 == 1) { sound_2(17028, 0); p35 = 0; } else if (p4_6 == 0 && p46 == 0) { sound_2(15170, 1); p46 = 1; } // SW3 ON  MI 演奏 else if (p4_6 == 1 && p46 == 1) { sound_2(15170, 0); p46 = 0; } else if (p4_7 == 0 && p47 == 0) { sound_2(14319, 1); p47 = 1; } // SW4 ON  FA 演奏 else if (p4_7 == 1 && p47 == 1) { sound_2(14319, 0); p47 = 0; } else if (p4_5 == 0 && p45 == 0) { sound_2(12756, 1); p45 = 1; } // SW5 ON  SO 演奏 else if (p4_5 == 1 && p45 == 1) { sound_2(12756, 0); p45 = 0; } else if (p1_7 == 0 && p17 == 0) { sound_2(11365, 1); p17 = 1; } // SW6 ON  RA 演奏 else if (p1_7 == 1 && p17 == 1) { sound_2(11365, 0); p17 = 0; } else if (p1_5 == 0 && p15 == 0) { sound_2(10125, 1); p15 = 1; } // SW7 ON  SI 演奏 else if (p1_5 == 1 && p15 == 1) { sound_2(10125, 0); p15 = 0; } else if (p1_3 == 0 && p13 == 0) { sound_2(9557, 1); p13 = 1; } // SW8 ON  uDO 演奏 else if (p1_3 == 1 && p13 == 1) { sound_2(9557, 0); p13 = 0; } sw_chk(); if (mode == 1) break; } while(1); } void init(void) //*********** INIT { // ポートの入出力設定 pd1 = 0b01010111; // ポート1の入出力設定 p1 _3,_5,_7: 入力 pd3 = 0b11001111; // ポート3の入出力設定 p3 _4,_5 : 入力 pd4 = 0b00011111; // ポート4の入出力設定 p4 _5,_6,_7: 入力 pda = 0b11111111; // ポートAの入出力設定 pur1 = 0b10101000; // p1 _3,_5,_7 プルアップ pur3 = 0b00110000; // p3 _4,_5 プルアップ pur4 = 0b11100000; // p4 _5,_6,_7 プルアップ // タイマRJ2をパルス出力モードで使用 ===== // http://r8cm12.web.fc2.com/r8c/menu9.html#under2 p37sel1 = 1; // p3_7をTRJO端子にする p37sel0 = 0; // msttrj = 0; // タイマRJ2を有効にする trjmr = 0x31; // パルス出力モードで、20MHz/2 をソースにする trj = 0; // trj/(20M/2) の時間でON/OFFする } void change_hosc(void) // クロックを高速オンチップオシレータ(20MHz)に変更 { prc0 = 1; /* プロテクト解除 */ hocoe = 1; /* 高速オンチップオシレータ発信開始 */ for(i=0; i<50; i++); /* 安定するまで少し待つ(約10ms) */ hscksel = 1; /* 高速オンチップオシレータのクロックに切換え*/ scksel = 1; /* システム基準クロック 低速→高速切換え*/ prc0 = 0; /* プロテクト保護 */ } void delay(unsigned long timer_set) //***** 引数  タイマ値 1=1ms (at 20MHz) { do { for(i=0; i<871; i++); } while(timer_set--); } void sound_1(unsigned int tone, int time) //*******************(オルゴール用) // tone : 5000000 / 演奏音の周波数(Hz) // (例) 演奏音: 440(Hz)の時、 tone = 11364 で //       trj = 11364 セットで、trj/10(MHz)*2 = 0.0023(s)周期 = 440(Hz)で // タイマーが ON/OFFを繰り返す // // tstart_trjcr = 1: タイマースタート、0: タイマー停止 { if(tone == 0) { tstart_trjcr = 0; p1_0 = 0; p4_2 = 0; } // タイマ停止 、LED (p1_0=OFF, p4_2=OFF) else { trj = tone; tstart_trjcr = 1; p1_0 = 1; p4_2 = 0; } // タイマ開始 、LED (p1_0=ON, p4_2=OFF) delay(15000L * time / tempo); tstart_trjcr = 0; p1_0 = 0; p4_2 = 1; p3_7 = 0; // タイマ停止 、LED (p1_0=OFF, p4_2=ON) SP (p3_7=OFF) sw_chk(); if (n_flg == 1 || mode == 2) return; else { // チャタリング対策 delay(6000L * time / tempo); sw_chk(); if (n_flg == 1 || mode == 2) return; } } void sound_2(unsigned int tone, int push) //*******************(手動演奏用) // tstart_trjcr = 1: タイマースタート、0: タイマー停止 { if (push == 1) { trj = tone; tstart_trjcr = 1; p1_0 = 1; p4_2 = 0; delay(100L); } // タイマ開始 、LED (p1_0=ON, p4_2=OFF) else { tstart_trjcr = 0; p1_0 = 0; p4_2 = 1; p3_7 = 0; delay(100L); } // タイマ停止 、LED (p1_0=OFF, p4_2=ON) SP (p3_7=OFF) }