;**********************************************************************
; Filename: miracle.asm *
; Date: 2001/3/26 *
; File Version: *
;**********************************************************************
list p=16F648A ; list directive to define processor
__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
__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 ;PORTAをI/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_dataの5ビットをノンアクティブに設定
btfss CE_data,5 ;****************************
bcf PORTB,5 ;CE_dataの5ビットをPORTBの5ビットに
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_dataの5ビットを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_dataの5ビットを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_dataの5ビットを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_dataの5ビット目をLOW(ACTIVE)に設定
btfss CE_data,5 ;****************************
bcf w_temp,5 ;CE_dataの5ビットを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_dataの5ビット目をHI(NON_ACTIVE)に設定
btfss CE_data,5 ;****************************
bcf w_temp,5 ;CE_dataの5ビットを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