アセンブラプログラム

;**********************************************************************
;    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_temp        EQU     0x0C        ; variable used for context saving 

cnt_data		EQU 0x26

time3		EQU	50h		;LED time3


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

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


		ORG     0x004             ; interrupt vector location
;

main
		BSF     STATUS,RP0			;メモリーバンクを1にセット
		movlw	007h
		movwf	TRISA				;ポートAをすべて入力に設定
;
		clrf	TRISB				;ポートBをすべて出力に設定
;
;
       MOVLW   080H            ;Wレジスタに80Hをセット
       MOVWF   OPTION_REG      ;OPTION_REGに80Hをセット PORT-B PULL UPなし
       BCF     STATUS,RP0      ;メモリーバンクを0にセット

		movlw	0ffh
		movwf	PORTB				;ポートBを全OFF状態にする。


case_select

		comf	PORTA,w
		movwf	w_temp
		movlw	B'00000111'
		andwf	w_temp
		movlw	B'00000000'
		xorwf	w_temp,w
		btfsc	STATUS,Z
		goto	CLEAR_CE
		movlw	B'00000001'
		xorwf	w_temp,w
		btfsc	STATUS,Z
		goto	mode_sound1
		movlw	B'00000010'
		xorwf	w_temp,w
		btfsc	STATUS,Z
		goto	mode_sound2
		movlw	B'00000011'
		xorwf	w_temp,w
		btfsc	STATUS,Z
		goto	mode_sound2
		movlw	B'00000100'
		xorwf	w_temp,w
		btfsc	STATUS,Z
		goto	mode_sound3
		movlw	B'00000101'
		xorwf	w_temp,w
		btfsc	STATUS,Z
		goto	mode_sound3
		movlw	B'00000110'
		xorwf	w_temp,w
		btfsc	STATUS,Z
		goto	mode_sound3
		movlw	B'00000111'
		xorwf	w_temp,w
		btfsc	STATUS,Z
		goto	mode_sound3
		goto	case_select

CLEAR_CE
		bsf		PORTB,5
		goto	case_select


mode_sound1
		movlw	sound1_val
		movwf	PORTB
		goto	CE_SIG
mode_sound2
		movlw	sound2_val
		movwf	PORTB
		goto	CE_SIG
mode_sound3
		movlw	sound3_val
		movwf	PORTB
		goto	CE_SIG

CE_SIG
		movlw	time3
		movwf	cnt_data
CE_SIG02
		decf	cnt_data,w
		movwf	cnt_data
		movf	cnt_data,w
		btfss	STATUS,Z
		goto	CE_SIG02
		bcf		PORTB,6
		goto	case_select





END

;**********************************************************************
;    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


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     0x004             ; interrupt vector location
;

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
		
case_select

		;goto	test_route

		comf	PORTA,w
		movwf	w_temp
		movlw	B'00000111'
		andwf	w_temp
		movlw	B'00000000'
		xorwf	w_temp,w
		btfsc	STATUS,Z
		goto	CLEAR_CE
		movlw	B'00000001'
		xorwf	w_temp,w
		btfsc	STATUS,Z
		goto	mode_sound1
		movlw	B'00000010'
		xorwf	w_temp,w
		btfsc	STATUS,Z
		goto	mode_sound2
		movlw	B'00000011'
		xorwf	w_temp,w
		btfsc	STATUS,Z
		goto	mode_sound2
		movlw	B'00000100'
		xorwf	w_temp,w
		btfsc	STATUS,Z
		goto	mode_sound3
		movlw	B'00000101'
		xorwf	w_temp,w
		btfsc	STATUS,Z
		goto	mode_sound3
		movlw	B'00000110'
		xorwf	w_temp,w
		btfsc	STATUS,Z
		goto	mode_sound3
		movlw	B'00000111'
		xorwf	w_temp,w
		btfsc	STATUS,Z
		goto	mode_sound3
		goto	case_select

CLEAR_CE
		movlw	000h
		movwf	w_temp
		bsf		CE_data,5		;CE_data5ビットをノンアクティブに設定
		btfss	CE_data,5		;****************************
		bcf		PORTB,5			;CE_data5ビットをPORTB5ビットに
		btfsc	CE_data,5		;コピー
		bsf		w_temp,5			;****************************
		movf	w_temp,w
		movwf	PORTB
		goto	case_select


mode_sound1
		call	VALUE_TEMP
		movlw	sound1_val
		movwf	w_temp
		btfss	CE_data,5		;****************************
		bcf		w_temp,5		;CE_data5ビットをw_tempの5ビットに
		btfsc	CE_data,5		;コピー
		bsf		w_temp,5		;****************************
		movf	w_temp,w
		movwf	PORTB
		goto	CE_SIG


mode_sound2
		call	VALUE_TEMP
		movlw	sound2_val
		movwf	w_temp
		btfss	CE_data,5		;****************************
		bcf		w_temp,5		;CE_data5ビットをw_tempの5ビットに
		btfsc	CE_data,5		;コピー
		bsf		w_temp,5		;****************************
		movf	w_temp,w
		movwf	PORTB
		goto	CE_SIG


mode_sound3
		call	VALUE_TEMP
		movlw	sound3_val
		movwf	w_temp
		btfss	CE_data,5		;****************************
		bcf		w_temp,5		;CE_data5ビットをw_tempの5ビットに
		btfsc	CE_data,5		;コピー
		bsf		w_temp,5		;****************************
		movf	w_temp,w
		movwf	PORTB
		goto	CE_SIG


CE_SIG
		movlw	time3				;時間稼ぎカウンタレジスタ"cnt_data"に値を設定
		movwf	cnt_data
CE_SIG02
		movlw	time3				;時間稼ぎカウンタレジスタ"cnt_data02"に値を設定
		movwf	cnt_data02
CE_SIG03
		decf	cnt_data02,w		;****************************
		movwf	cnt_data02			;	64usecの時間稼ぎルーチン開始
		movf	cnt_data02,w		;
		btfss	STATUS,Z			;****************************
		goto	CE_SIG03
CHECK_PORTA_VAL		
		comf	PORTA,w				;****************************
		movwf	w_PORTA_temp02		;64usecごとのPORTAの入力値に変化が
		movlw	B'00000111'			;ないかどうかを判定するルーチン
		andwf	w_PORTA_temp02		;
		movf	w_PORTA_temp,w		;
		xorwf	w_PORTA_temp02,w	;
		btfss	STATUS,Z			;***************************
		goto	CE_NON_ACTIVE		;もし、w_PORTA_temp02とw_PORTA_tempの値が一致しなければ、case_selectラベルに戻るため
CE_SIG04
		decf	cnt_data,w		;時間稼ぎカウンタをデクリメント
		movwf	cnt_data		
		movf	cnt_data,w		
		btfss	STATUS,Z		;
		goto	CE_SIG02		
;		movf	CE_data,w		;
;		movwf	w_temp
		bcf		CE_data,5		;CE_data5ビット目をLOW(ACTIVE)に設定
		btfss	CE_data,5		;****************************
		bcf		w_temp,5		;CE_data5ビットをw_tempの5ビットに
		btfsc	CE_data,5		;コピー
		bsf		w_temp,5		;****************************


		movf	w_temp,w
		movwf	PORTB			;CE信号をアクティブに設定し、PORTBに出力
		goto	case_select
CE_NON_ACTIVE
		bsf		CE_data,5		;CE_data5ビット目をHI(NON_ACTIVE)に設定
		btfss	CE_data,5		;****************************
		bcf		w_temp,5		;CE_data5ビットをw_tempの5ビットに
		btfsc	CE_data,5		;コピー
		bsf		w_temp,5		;****************************
		movf	w_temp,w
		movwf	PORTB
		goto	case_select		;もし、w_PORTA_temp02とw_PORTA_tempの値が一致しなければ、case_selectラベルに戻る



test_route
		movf	PORTA,w
		movwf	PORTB
		goto	test_route




VALUE_TEMP
		comf	PORTA,w			;*****************************
		movwf	w_PORTA_temp			;PORTA入力値をマスクしてw_tempに格納
		movlw	B'00000111'		;
		andwf	w_PORTA_temp			;*****************************
		RETURN



end