MIDIデータ送信プログラム(その2)


;**********************************************************************
;    Filename:	    miracle.asm                                       *
;    Date:          2001/3/26                                        *
;    File Version:                                                    *
;**********************************************************************

	list      p=16F648A             ; list directive to define processor
	#include <P16F648A.INC>         ; processor specific variable definitions

	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;***** VARIABLE DEFINITIONS
w_temp02        EQU     0x0C        ; variable used for context saving 

cnt_data		EQU		0x26
CE_data			EQU		0x27
w_temp			EQU		0x28			; variable used for context saving
w_PORTA_temp	EQU		0x29			;PORTAの入力値の一時保管
cnt_data02		EQU		0x2A
w_PORTA_temp02	EQU		0x2B
CNT2			EQU		0x2C
OUT_SIG1		EQU		0x2D
CNT1			EQU		0x2E
count			EQU		0x2F
CNT3			EQU		0x30
CNT5			EQU		0x31
CNT6			EQU		0x32
CNT7			EQU		0x33
SW_CNT			EQU		0x34
OSC_001_WAVE	EQU		0x35
OSC_002_WAVE	EQU		0x36
OSC_003_WAVE	EQU		0x37
DATA2			EQU		0x38
CNT8			EQU		0x39
OSC_004_WAVE	EQU		0x3A
DATA4			EQU		0x3B
DATA5			EQU		0x3C
DATA1			EQU		0x3D
DATA3			EQU		0x3E
MIDI_BIT_CNT	EQU		0x3F
MIDI_BYTE_CNT	EQU		0x40


MIDI_NOTE		EQU		0x41


time3		EQU	0FFh		;LED time3


sound1_val		EQU	B'00000000'
sound2_val		EQU	B'00001101'
sound3_val		EQU	B'00011010'
					

;**********************************************************************
		ORG     0x000             ; processor reset vector
  		goto    main_setting              ; go to beginning of program


		org     0x04		; 割り込みアドレス
		btfsc	PIE1,TMR1IE	;タイマー1の割り込み?
		goto	INT_TMR1	; カウントを開始へジャンプ
		btfsc	PIE1,TMR2IE	;タイマー2の割り込み?
		goto    INT_TMR2	;カウント設定へジャンプ
		btfsc	INTCON,T0IF	;タイマー0の割り込み?
		goto	INT_TMR3
		retfie				; 別の割り込みなら戻る

;

main_setting
		bsf     STATUS,RP0			;メモリーバンクを1にセット
		movlw	007h
		movwf	TRISA				;ポートAをすべて入力に設定
;
		movlw	000h
		movwf	TRISB				;ポートBをすべて出力に設定
;
;
		bsf		PCON,3				;内部クロックを4MHzに設定
		bcf		OPTION_REG,5		;ICの14pinをCLKOUTに設定
		bcf		RCSTA,7				;RCSTAレジスタの7ビット目(RB1ポート)のシリアル通信を無効にする。
		
		movlw   000H            	;Wレジスタに80Hをセット
		movwf   OPTION_REG      	;OPTION_REGに80Hをセット PORT-B PULL UPなし
		bcf     STATUS,RP0      	;メモリーバンクを0にセット

		movlw	B'00000111'
		movwf	CMCON				;PORTAI/Oピンに設定する。

		movlw	020h
		movwf	PORTB				;ポートBを全OFF状態にする。
		bsf		PORTB,5
		bsf		w_temp,5
		bsf		CE_data,5

		bsf		T1CON,TMR1ON		;タイマ1ON

start
		bsf		INTCON,T0IE			;タイマ0の割り込みを許可する。
		bcf		INTCON,GIE			; 全体の割り込みを禁止する
		bcf		INTCON,RBIE			; ポートBの割り込みを禁止する
		bcf		INTCON,RBIF			; ポートBの割り込みを削除する
		bcf		INTCON,INTE			; RB0 の割り込みを禁止する




		bsf		STATUS,RP0	; レジスタバンク1を選択	
		BSF		PIE1,TMR1IE	;TMR1オーバーフロー割り込み許可
		bsf		OPTION_REG,INTEDG	; 立ち上がりで割り込みが反応する
		bcf		OPTION_REG,NOT_RBPU	; ポートBのプルアップを有効にする
		movlw   B'00000000'	; 
		movwf   TRISB		; ポートBを全部入力用にする
		movlw   B'00000'	;
		movwf   TRISA		; ポートAを全部出力用にする
		bcf     STATUS,RP0	; レジスタバンク0を選択

		movlw	0x80
		movwf	TMR0
		MOVLW	30H			;Wレジスタに30Hをセット
		MOVWF	T1CON		;T1CONレジスタ プリスケーラ1:8 停止




		MOVLW	00H			;Wレジスタに00Hをセット
		MOVWF	TMR1L		;TMR1Lに下位8ビットデータをセット
		MOVLW	00H			;Wレジスタに00Hをセット
		MOVWF	TMR1H		;TMR1Hに上位8ビットデータをセット
		CLRF	CNT1		;CNT1変数を00Hにクリア

		bsf		INTCON,PEIE			;タイマ1、タイマ2の割り込みを許可する。

		bcf		PORTA,4		; 赤いLEDを消す
		bsf		INTCON,GIE	; 全体の割り込みを許可する
		BSF		T1CON,TMR1ON	;TMR1TMR1ONビットをセット カウント開始
		movlw	0x00
		movwf	CNT1
		movwf	CNT2
		movwf	CNT3
		movwf	OSC_001_WAVE
		movwf	OSC_002_WAVE
		movwf	OSC_003_WAVE
		movwf	SW_CNT
		movwf	OSC_004_WAVE
		bsf		PORTB,7
		clrf	MIDI_BIT_CNT
		clrf	MIDI_BYTE_CNT
		movlw	0x08
		movwf	MIDI_NOTE
		movlw	0xAA
		movwf	MIDI_NOTE + 0x01
		movlw	0x55
		movwf	MIDI_NOTE + 0x02


wait
		goto	wait		; 割り込みを待つ

setcount
		movf	PORTB,0		; PORTB -> W
		andlw	B'11110000'	; 下位 4 ビットを 0 にする
		movwf	count		; W -> count
		swapf	count,1		; 上位 4 ビットと下位 4 ビットを入れ替える
		movf	count,0		; count -> W
		movwf	PORTA		; W -> PORTA
		bcf	INTCON,RBIF	; 割り込みをリセット
		retfie			; 割り込み処理から復帰

count_begin
		clrw			; 0 -> W
		movwf	PORTA		; LEDを消す
		bsf	PORTA,4		; 赤いLEDを点灯
		goto	wait		; 割り込みを無効にしたまま待つ

INT_TMR1
		bcf		INTCON,GIE				; 全体の割り込みを禁止する
		MOVLW   00H						;Wレジスタに00Hをセット
		MOVWF   TMR1L					;TMR1Lに下位8ビットデータをセット
		MOVLW   00H						;Wレジスタに00Hをセット
		MOVWF   TMR1H					;TMR1Hに上位8ビットデータをセット 

		BCF		PIR1,TMR1IF                ;オーバーフローフラグのクリア
		BSF		STATUS,RP0                ;メモリーバンクを1にセット
		BSF		PIE1,TMR1IE                 ;オーバーフロー割り込み許可
		BCF		STATUS,RP0                ;メモリーバンクを0にセット

		INCF	CNT1,F                        ;変数CNT1に+1する。
		MOVF	CNT1,W                        ;WレジスタにCNT1の値をセット
		MOVWF	PORTB                        ;PORTBCNT1の値を出力


;[ if _DATA1 < _DATA2 then goto Xxx ]
		;movf	CNT1,W
		;subwf	0xFF,W
		;btfss	STATUS,C
		;goto	Xxx
		RETFIE

Xxx
		COMF	OUT_SIG1
		RETFIE                                      ;割り込みを許可してリターン


INT_TMR2
;        MOVLW	00H                        ;Wレジスタに00Hをセット
;       MOVWF	TMR2L                    ;TMR1Lに下位8ビットデータをセット
;        MOVLW	00H                        ;Wレジスタに00Hをセット
;        MOVWF	TMR2H                    ;TMR1Hに上位8ビットデータをセット 
		bcf		INTCON,GIE			; 全体の割り込みを禁止する
		BCF		PIR1,TMR2IF             ;オーバーフローフラグのクリア
		BSF		STATUS,RP0                ;メモリーバンクを1にセット
		BSF		PIE1,TMR2IE              ;オーバーフロー割り込み許可
		BCF		STATUS,RP0                ;メモリーバンクを0にセット

		INCF	CNT2,F                        ;変数CNT1に+1する。
		MOVF	CNT2,W                        ;WレジスタにCNT1の値をセット
		MOVWF	PORTB                        ;PORTBCNT1の値を出力

		RETFIE                                      ;割り込みを許可してリターン


INT_TMR3
		bcf		INTCON,GIE				; 全体の割り込みを禁止する
		BCF		INTCON,T0IF				;オーバーフローフラグのクリア
		BSF		STATUS,RP0				;メモリーバンクを1にセット
		BSF		INTCON,T0IE				;オーバーフロー割り込み許可


		BCF		STATUS,RP0				;メモリーバンクを0にセット

		INCF	CNT3,F					;変数CNT1に+1する。

		movlw	0x80
		movwf	TMR0




SEND_MIDI_MESSEAGE
;[ if _DATA1 = _DATA2 then goto Xxx ]
		movlw	0x03
		xorwf	MIDI_BYTE_CNT,W
		btfsc	STATUS,Z
		goto	CLR_MIDI_BYTE_CNT

SEND_MESSEAGE02
;[ if _DATA1 = _DATA2 then goto Xxx ]
		movlw	0x08
		xorwf	MIDI_BIT_CNT,W
		btfsc	STATUS,Z
		goto	CLR_MIDI_BIT_CNT

SEND_MESSEAGE03
;[ if _DATA1 = _DATA2 then goto Xxx ]
		movlw	0x00
		xorwf	SW_CNT,W
		btfsc	STATUS,Z
		goto	MIDI_START_BIT


;[ if _DATA1 = _DATA2 then goto Xxx ]
		movlw	0x09
		xorwf	SW_CNT,W
		btfsc	STATUS,Z
		goto	MIDI_START_BIT


;[ if _DATA1 = _DATA2 then goto Xxx ]
		movlw	0x0A
		xorwf	SW_CNT,W
		btfsc	STATUS,Z
		goto	MIDI_STOP_BIT



;[ if _DATA1 = _DATA2 then goto Xxx ]
		movlw	0x0A
		xorwf	SW_CNT,W
		btfsc	STATUS,Z
		goto	MIDI_START_BIT


;[ if _DATA1 = _DATA2 then goto Xxx ]
		movlw	0x13
		xorwf	SW_CNT,W
		btfsc	STATUS,Z
		goto	MIDI_STOP_BIT


;[ if _DATA1 = _DATA2 then goto Xxx ]
		movlw	0x14
		xorwf	SW_CNT,W
		btfsc	STATUS,Z
		goto	MIDI_START_BIT


;[ if _DATA1 = _DATA2 then goto Xxx ]
		movlw	0x1C
		xorwf	SW_CNT,W
		btfsc	STATUS,Z
		goto	MIDI_STOP_BIT



;
; _DATA1 の bit 3 を _DATA2 の bit 7 にコピー
;
		movlw	0x00
		xorwf	MIDI_BIT_CNT,W
		btfsc	STATUS,Z
		goto	SEND_DATA_001_00

;
; _DATA1 の bit 3 を _DATA2 の bit 7 にコピー
;
		movlw	0x01
		xorwf	MIDI_BIT_CNT,W
		btfsc	STATUS,Z
		goto	SEND_DATA_001_01

;
; _DATA1 の bit 3 を _DATA2 の bit 7 にコピー
;
		movlw	0x02
		xorwf	MIDI_BIT_CNT,W
		btfsc	STATUS,Z
		goto	SEND_DATA_001_02

;
; _DATA1 の bit 3 を _DATA2 の bit 7 にコピー
;
		movlw	0x03
		xorwf	MIDI_BIT_CNT,W
		btfsc	STATUS,Z
		goto	SEND_DATA_001_03

;
; _DATA1 の bit 3 を _DATA2 の bit 7 にコピー
;
		movlw	0x04
		xorwf	MIDI_BIT_CNT,W
		btfsc	STATUS,Z
		goto	SEND_DATA_001_04

;
; _DATA1 の bit 3 を _DATA2 の bit 7 にコピー
;
		movlw	0x05
		xorwf	MIDI_BIT_CNT,W
		btfsc	STATUS,Z
		goto	SEND_DATA_001_05

;
; _DATA1 の bit 3 を _DATA2 の bit 7 にコピー
;
		movlw	0x06
		xorwf	MIDI_BIT_CNT,W
		btfsc	STATUS,Z
		goto	SEND_DATA_001_06

;
; _DATA1 の bit 3 を _DATA2 の bit 7 にコピー
;
		movlw	0x07
		xorwf	MIDI_BIT_CNT,W
		btfsc	STATUS,Z
		goto	SEND_DATA_001_07




;
; _DATA1 の bit 3 を _DATA2 の bit 7 にコピー
;
		movlw	0x01
		xorwf	MIDI_BIT_CNT,W
		btfsc	STATUS,Z
		goto	SEND_DATA_002_00

;
; _DATA1 の bit 3 を _DATA2 の bit 7 にコピー
;
		movlw	0x02
		xorwf	MIDI_BIT_CNT,W
		btfsc	STATUS,Z
		goto	SEND_DATA_003



SEND_DATA_001_00
		btfss	MIDI_NOTE + 0x00,0
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x00,0
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE

SEND_DATA_001_01
		btfss	MIDI_NOTE + 0x00,1
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x00,1
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE

SEND_DATA_001_02
		btfss	MIDI_NOTE + 0x00,2
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x00,2
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE

SEND_DATA_001_03
		btfss	MIDI_NOTE + 0x00,3
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x00,3
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE

SEND_DATA_001_04
		btfss	MIDI_NOTE + 0x00,4
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x00,4
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE

SEND_DATA_001_05
		btfss	MIDI_NOTE + 0x00,5
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x00,5
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE

SEND_DATA_001_06
		btfss	MIDI_NOTE + 0x00,6
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x00,6
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE

SEND_DATA_001_07
		btfss	MIDI_NOTE + 0x00,7
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x00,7
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE


SEND_DATA_002_00
		btfss	MIDI_NOTE + 0x01,0
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x01,0
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE 
SEND_DATA_002_01
		btfss	MIDI_NOTE + 0x01,1
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x01,1
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE 
SEND_DATA_002_02
		btfss	MIDI_NOTE + 0x01,2
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x01,2
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE 
SEND_DATA_002_03
		btfss	MIDI_NOTE + 0x01,3
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x01,3
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE
SEND_DATA_002_04
		btfss	MIDI_NOTE + 0x01,4
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x01,4
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE

SEND_DATA_002_05
		btfss	MIDI_NOTE + 0x01,5
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x01,5
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE

SEND_DATA_002_06
		btfss	MIDI_NOTE + 0x01,6
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x01,6
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE

SEND_DATA_002_07
		btfss	MIDI_NOTE + 0x01,7
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x01,7
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE

SEND_DATA_003_00
		btfss	MIDI_NOTE + 0x02,0
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x02,0
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE

SEND_DATA_003_01
		btfss	MIDI_NOTE + 0x02,1
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x02,1
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE

SEND_DATA_003_02
		btfss	MIDI_NOTE + 0x02,2
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x02,2
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE

SEND_DATA_003_03
		btfss	MIDI_NOTE + 0x02,3
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x02,3
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE

SEND_DATA_003_04
		btfss	MIDI_NOTE + 0x02,4
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x02,4
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE

SEND_DATA_003_05
		btfss	MIDI_NOTE + 0x02,5
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x02,5
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE

SEND_DATA_003_06
		btfss	MIDI_NOTE + 0x02,6
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x02,6
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE

SEND_DATA_003_07
		btfss	MIDI_NOTE + 0x02,7
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x02,7
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE









SEND_DATA_003
		btfss	MIDI_NOTE + 0x00,1
		bcf		PORTB,7
		btfsc	MIDI_NOTE + 0x00,1
		bsf		PORTB,7
		INCF	SW_CNT,F
		INCF	MIDI_BIT_CNT
		RETFIE 









MIDI_START_BIT
		bcf		PORTB,7
		INCF	SW_CNT,F
		RETFIE


MIDI_STOP_BIT
		bsf		PORTB,7
		INCF	SW_CNT,F
		RETFIE

CLR_MIDI_BIT_CNT
		clrf	MIDI_BIT_CNT
		INCF	MIDI_BYTE_CNT
		goto	SEND_MESSEAGE03

CLR_MIDI_BYTE_CNT
		clrf	MIDI_BYTE_CNT
		goto	SEND_MESSEAGE03







;		INCF	SW_CNT,F


END