ソース
;*********************************************
; PIC16F628
; SOUND PLAYER v0.1
; yokoie 2003.11.26作製
; 2004.03.11更新
;クロックは4MHz
;PWMを利用、出力はRB3/CCP1(9ピン)
;*********************************************
LIST P=16F628, ST=OFF, R=DEC, F=INHX8M
INCLUDE P16F628.INC
;Fuse(Config)のデータ
;__CONFIG _INTRC_OSC_NOCLKOUT & _MCLRE_ON & _LVP_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _CP_OFF
; 変数レジスタの定義
CNT1 EQU 0x70 ;タイマ用変数
CNT2 EQU 0x71 ;タイマ用変数
CNT3 EQU 0x72 ;タイマ用変数
CNT4 EQU 0x73 ;
SNDCNT EQU 0x74 ;音符カウンタ
; メインルーチン
ORG 0 ;Reset Start
MAIN
BSF STATUS,RP0 ;バンク1へ切替
MOVLW 0x03 ;Set PortA to Read Mode
MOVWF TRISA
MOVLW 0xB0 ;Set PortB to Read Mode
MOVWF TRISB
;**** PWM モードの設定 ****
MOVLW 0x6f ;PWMのパルス幅を188に
MOVWF PR2 ;プリスケーラー設定
BCF STATUS,RP0 ;バンク0に戻す
MOVLW 0CH ;
MOVWF CCP1CON ;CCP1CONをPWMモードに設定
MOVLW 0x40
MOVWF CCPR1L ;PWMのデューティー設定
;**** TIMER2 設定 ****
MOVLW 0x06 ;TIMER2=ON プリスケーラー=1:1
MOVWF T2CON ;TIMER2をセット
;**** 音符カウンタリセット ****
MOVLW 0x20
MOVWF SNDCNT
;演奏開始
MAINLP BCF STATUS, Z ;ゼロフラグクリア
MOVF SNDCNT,W ;楽譜の位置
CALL BANK1
MOVWF EEADR ;アドレスをEEADRへセット
BSF EECON1,RD ;楽譜読み出し開始
MOVF EEDATA,W ;Wレジスタにデータ取り出し
CALL BANK0
XORLW 0xed ;0xedなら曲が終了
BTFSC STATUS, Z ;
CALL RESTRT ;先頭に戻る
CALL BANK1
MOVF EEDATA,W ;Wレジスタにデータ取り出し
CALL BANK0
CALL SETSND ;音を出す
INCF SNDCNT
GOTO MAINLP
RESTRT MOVLW 0x20 ;音符データの先頭に戻す
MOVWF SNDCNT
GOTO MAINLP ;再開
;PWM周期設定
SETSND ;MOVF E_ADRS,W ;周波数データのアドレス指定
CALL BANK1
MOVWF EEADR ;アドレスをEEADRへセット
BSF EECON1,RD ;読み出し設定
MOVF EEDATA,W ;Wレジスタにデータ取り出し
CALL BANK1
MOVWF PR2 ;PWMの周期を設定
CALL BANK0
CALL TIM2 ;音符の長さだけ持続
RETURN
STPSND
BCF T2CON, 2 ;0出力
CALL TIM2 ;タイマー2
BSF T2CON, 2 ;1出力
RETURN
; タイマサブルーチン
TIM1 MOVLW 0xff ;255
MOVWF CNT1 ;
TIMLP1 CALL TIM2
DECFSZ CNT1,F ;
GOTO TIMLP1 ;
RETURN ;
;音符の時間待つ
TIM2 MOVLW 0x40 ;音符の長さを設定
MOVWF CNT2 ;CNT2<=0x40
TIMLP2 CALL TIM3 ;
DECFSZ CNT2,F ;
GOTO TIMLP2 ;
RETURN ;
TIM3 MOVLW 0xff ;255
MOVWF CNT3 ;
TIMLP3 CALL TIM4
DECFSZ CNT3,F ;
GOTO TIMLP3 ;
RETURN ;
TIM4 MOVLW 0x01 ;
MOVWF CNT4 ;
TIMLP4 DECFSZ CNT4,F ;
GOTO TIMLP4 ;
RETURN ;
;バンク切り替え関数
BANK0 BCF STATUS, RP0 ;バンク0へ
BCF STATUS, RP1
RETURN
BANK1 BSF STATUS, RP0 ;バンク1へ
BCF STATUS, RP1
RETURN
;EEPROM DATA
ORG 02100H ;周波数データ
DE 0, 0xeC, 0xDF, 0xd2, 0xc6, 0xbb, 0xb0, 0xa6, 0x9d, 0x94, 0x8c,
DE 0x84, 0x7c, 0x73, 0x6e, 0x68
DE 0x62, 0x5c, 0x57, 0x52, 0x4d, 0
;ここから楽譜を入力
;データ番地と音階対応表
; 0x01:ド 0x02:ド# 0x03:レ 0x04:レ# 0x05:ミ
; 0x06:ファ 0x07:ファ# 0x08:ソ 0x09:ソ# 0x0a:ラ
; 0x0b:ラ# 0x0c:シ 0x0d:ド↑ 0x0e:ド#↑ 0x0f:レ↑
; 0x10:レ#↑ 0x11:ミ↑ 0x12:ファ↑ 0x13:ファ#↑ 0x14:ソ↑
; 0x15:休符
;曲の最後に0xedを入力してください。
ORG 02120H
DE 0x14, 0x14, 0x11, 0x12, 0x14, 0x14, 0x11, 0x12
DE 0x14, 0x08, 0x0a, 0x0c, 0x0d, 0x0f, 0x11, 0x12
DE 0x11, 0x11, 0x0d, 0x0f, 0x11, 0x15, 0x05, 0x06
DE 0x08, 0x0a, 0x08, 0x06, 0x08, 0x05, 0x06, 0x08
DE 0x06, 0x06, 0x0a, 0x08, 0x06, 0x06, 0x05, 0x03
DE 0x05, 0x03, 0x01, 0x03, 0x05, 0x06, 0x08, 0x0a
DE 0x06, 0x06, 0x0a, 0x08, 0x0a, 0x0a, 0x0c, 0x0d
DE 0x08, 0x0a, 0x0c, 0x0d, 0x0f, 0x11, 0x12, 0x14
DE 0xed
END