;****************************************************************************************** ; メロディーサンプル ; Program Name : ; Programer : ; Create date : Version 1.0 H17.07.17 ; History : ;****************************************************************************************** ; 平均律音階 ; 中心の“ラ”の音の周波数が440Hz,その1オクターブ低い“ラ”の音が220Hz ; 音階の周波数=220×2^(n/12) nは,1から12の整数 ; ド :261.63Hz(191.11回) 41 ; レ :293.66Hz(170.26回) 49 ; ミ :329.63Hz(151.69回) 52 ; ファ:349.23Hz(143.17回) 57 ; ソ :392 Hz(127.55回) 62 ; ラ :440 Hz(113.63回) 6E ; シ :493.88Hz(101.24回) 7B ; ド :523.25Hz( 95.56回) 82 ; 分周ループ回数 ; ソース周波数 / ターゲット周波数 / 2(ON,OFF) ; プログラム ; Step1) 100KHzを作る 4MHzなら40回分周、20MHzなら200回分周 ; Step2) 各音階を作る ; 例)ラ:100KHz / 440Hz / 2 => 113.63回 ;****************************************************************************************** #DEFINE PI_CLK H'01' ; OSC 1MHz ;====================== 以下はPIC12F683用の記述 ====================== ; 1MHz動作 LIST P=PIC12F683 ; INCLUDE "P12F683.inc" ;標準ヘッダ定義ファイル __CONFIG _MCLRE_OFF & _INTRC_OSC_NOCLKOUT & _WDT_OFF PLYINP EQU 20H PLYNUM EQU 21H PLYLP EQU 22H PLYLP1 EQU 23H PLYLP2 EQU 24H ORG 0 GOTO START ORG 4 GOTO START START BCF STATUS,RP0 MOVLW 07H ; BANK0でデジタルIO設定(Comparator機能でポート設定) MOVWF CMCON0 ; BANK0でデジタルIO設定(Comparator機能でポート設定) CLRF GPIO ; BANK0でポート初期化 BSF STATUS,RP0 CLRF ANSEL ; BANK1でデジタルIO初期化 MOVLW B'001000' ; BANK1でPORT設定 MOVWF TRISIO ; BANK1でPORT設定 BCF STATUS,RP0 MAIN CALL DEMO1 CALL DEMO2 GOTO MAIN ;******************************************************************************************* ; 関数名 : DEMO1     ; 機能 : DEMO1を鳴らす(ドレミファソラシド・ドシラソファミレド) ; 引数 : ; 変数 : ; 注意 : ;******************************************************************************************* DEMO1 MOVLW H'05' CALL PLAY ; MOVLW H'06' CALL PLAY ; MOVLW H'07' CALL PLAY ; MOVLW H'08' CALL PLAY ; MOVLW H'09' CALL PLAY ; MOVLW H'0A' CALL PLAY ; MOVLW H'0B' CALL PLAY ; MOVLW H'0C' CALL PLAY ; CALL PLAYSP ; MOVLW H'0C' CALL PLAY ; MOVLW H'0B' CALL PLAY ; MOVLW H'0A' CALL PLAY ; MOVLW H'09' CALL PLAY ; MOVLW H'08' CALL PLAY ; MOVLW H'07' CALL PLAY ; MOVLW H'06' CALL PLAY ; MOVLW H'05' CALL PLAY CALL PLAYSP CALL PLAYSP CALL PLAYSP CALL PLAYSP RETURN ;******************************************************************************************* ; 関数名 : DEMO2     ; 機能 : DEMO2を鳴らす(海) ; 引数 : ; 変数 : ; 注意 : ;******************************************************************************************* DEMO2 MOVLW H'0A' ;ラ CALL PLAY MOVLW H'0A' ;ラ CALL PLAY ; MOVLW H'09' ;ソ CALL PLAY MOVLW H'09' ;ソ CALL PLAY ; MOVLW H'08' ;ファ CALL PLAY MOVLW H'08' ;ファ CALL PLAY ; MOVLW H'06' ;レ CALL PLAY ; MOVLW H'09' ;ソ CALL PLAY ; MOVLW H'08' ;ファ CALL PLAY MOVLW H'08' ;ファ CALL PLAY ; MOVLW H'06' ;レ CALL PLAY MOVLW H'06' ;レ CALL PLAY ; ; MOVLW H'05' ;ド CALL PLAY ; MOVLW H'05' ;ド CALL PLAY ; MOVLW H'08' ;ファ CALL PLAY MOVLW H'08' ;ファ CALL PLAY ; MOVLW H'08' ;ファ CALL PLAY MOVLW H'08' ;ファ CALL PLAY ; MOVLW H'09' ;ソ CALL PLAY MOVLW H'09' ;ソ CALL PLAY MOVLW H'09' ;ソ CALL PLAY MOVLW H'09' ;ソ CALL PLAY ; CALL PLAYSP CALL PLAYSP CALL PLAYSP CALL PLAYSP ; MOVLW H'0A' ;ラ CALL PLAY MOVLW H'0A' ;ラ CALL PLAY ; MOVLW H'0A' ;ラ CALL PLAY MOVLW H'0A' ;ラ CALL PLAY ; MOVLW H'0C' ;ド CALL PLAY MOVLW H'0C' ;ド CALL PLAY ; MOVLW H'0A' ;ラ CALL PLAY ; MOVLW H'0A' ;ラ CALL PLAY ; MOVLW H'09' ;ソ CALL PLAY MOVLW H'09' ;ソ CALL PLAY ; MOVLW H'08' ;ファ CALL PLAY MOVLW H'08' ;ファ CALL PLAY ; MOVLW H'06' ;レ CALL PLAY ; MOVLW H'06' ;レ CALL PLAY ; MOVLW H'05' ;ド CALL PLAY MOVLW H'05' ;ド CALL PLAY ; MOVLW H'09' ;ソ CALL PLAY MOVLW H'09' ;ソ CALL PLAY ; MOVLW H'08' ;ファ CALL PLAY MOVLW H'08' ;ファ CALL PLAY MOVLW H'08' ;ファ CALL PLAY MOVLW H'08' ;ファ CALL PLAY ; CALL PLAYSP CALL PLAYSP CALL PLAYSP CALL PLAYSP RETURN ;******************************************************************************************* ; 関数名 : PLAYSP   ; 機能 : 休む ; 引数 : ; 変数 : ; 注意 : ;******************************************************************************************* PLAYSP BCF GPIO,0 MOVLW H'BF' MOVWF PLYLP2 PLYSP2 MOVLW H'41' MOVWF PLYLP1 PLYSP1 CALL PLYWAT DECFSZ PLYLP1,F GOTO PLYSP1 DECFSZ PLYLP2,F GOTO PLYSP2 RETURN ;******************************************************************************************* ; 関数名 : PLAY   ; 機能 : 鳴らす ; 引数 : Wレジスタ:ド5/レ6/ミ7/ファ8/ソ9/ラA/シB/ドC ; 変数 : ; 注意 : ;******************************************************************************************* PLAY MOVWF PLYINP CALL PLYTBL MOVWF PLYNUM ; MOVFW PLYINP CALL PLYTBL1 MOVWF PLYLP2 PLAY0 BSF GPIO,0 MOVFW PLYNUM MOVWF PLYLP1 PLAY1 CALL PLYWAT DECFSZ PLYLP1,F GOTO PLAY1 ; BCF GPIO,0 MOVFW PLYNUM MOVWF PLYLP1 PLAY2 CALL PLYWAT DECFSZ PLYLP1,F GOTO PLAY2 ; DECFSZ PLYLP2,F GOTO PLAY0 ; RETURN PLYTBL ; 周波数分周変数 ADDWF PCL,F RETLW H'FF' ; ミ RETLW H'FF' ; ファ RETLW H'FF' ; ソ RETLW H'FF' ; ラ RETLW H'FF' ; シ RETLW H'BF' ; ド 191 RETLW H'AA' ; レ 170 RETLW H'98' ; ミ 152 RETLW H'8F' ; ファ 143 RETLW H'80' ; ソ 128 RETLW H'72' ; ラ 114 RETLW H'65' ; シ 101 RETLW H'60' ; ド 96 RETLW H'FF' ; レ PLYTBL1 ; 8分音符が鳴らす時間(0.25秒) ADDWF PCL,F RETLW H'FF' ; ミ RETLW H'FF' ; ファ RETLW H'FF' ; ソ RETLW H'FF' ; ラ RETLW H'FF' ; シ RETLW H'41' ; ド 191 RETLW H'49' ; レ 170 RETLW H'52' ; ミ 152 RETLW H'57' ; ファ 143 RETLW H'62' ; ソ 128 RETLW H'6E' ; ラ 114 RETLW H'7B' ; シ 101 RETLW H'82' ; ド 96 RETLW H'FF' ; レ ;******************************************************************************************* ; 関数名 : PLYWAT   ; 機能 : 100KHzを作成 ; 引数 : ; 変数 : ; 注意 : ;******************************************************************************************* PLYWAT MOVLW PI_CLK MOVWF PLYLP PLYWAT1 DECFSZ PLYLP,F GOTO PLYWAT1 RETURN END