;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
;　姫路城
;　内部クロック（4MHz）使用
;				Ver　00.00.01
;				06/19/2006
;				by. すきやき工房
;_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

	list      p=12f675           ; list directive to define processor
	#include <p12f675.inc>        ; processor specific variable definitions

	errorlevel  -302              ; suppress message 302 from list file

	__CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON &  _INTRC_OSC_NOCLKOUT


;********　変数定義
w_temp        EQU     0x20        ; コンテキスト保存用
status_temp   EQU     0x21        ; コンテキスト保存用
CNT1	EQU	0x022
CNT2	EQU	0x023
CNT3	EQU	0x024
CNT4	EQU	0x025

CMD1	EQU	0x026
CMD2	EQU	0x027
CMD3	EQU	0x028
CMD4	EQU	0x029
CMD5	EQU	0x030
CMD6	EQU	0x031
CMD7	EQU	0x032
CMD8	EQU	0x033
CMD9	EQU	0x034

CMD	EQU	0x035

WAIT_C	EQU	0x036
POTM	EQU	0x037

;********
	ORG     0x000             ;プロセッサー　リセットベクタ
	goto	main

	ORG	0x004             ; interrupt vector location
;********　割り込み処理

		movwf   w_temp            ; save off current W register contents
		movf	STATUS,w          ; move status register into W register
		movwf	status_temp       ; save off contents of STATUS register


; isr code can go here or be located as a call subroutine elsewhere


		movf    status_temp,w     ; retrieve copy of STATUS register
		movwf	STATUS            ; restore pre-isr STATUS register contents
		swapf   w_temp,f
		swapf   w_temp,w          ; restore pre-isr W register contents
		retfie                    ; return from interrupt

;********　メインプログラム
main
	;内部オシレータの校正？

		call    0x3FF             ; retrieve factory calibration value
		bsf     STATUS,RP0		;バンク１に切り替え
		movwf   OSCCAL            ; update register with factory cal value 
		bcf     STATUS,RP0		;バンク0に切り替え

	;ポートの初期設定

	bcf 		STATUS,RP0		;バンク0に切り替え
	clrf 	GPIO				 ;Init GPIO
	movlw 	b'00000111'			 ;Set GP<2:0> to   (コンパレータoff)
	movwf 	CMCON 			;(COMPARATOR CONTROL REGISTER)digital IO
	bsf 		STATUS,RP0		;バンク１に切り替え
	clrf 	ANSEL				 ;(ANALOG SELECT REGISTER) Digital I/O

	movlw b'00111011'	 ;Set GP<54310> as inputs  （1：input 0:output 下位ビットより0→5　［543210］）
	movwf TRISIO ;an-d set GP<2>as outputs
	bcf 		STATUS,RP0		;バンク0に切り替え
;*************
; remaining code goes here
	movlw	b'00000001'			;コマンドデータ格納
	movwf	CMD1
	movlw	b'10000001'		
	movwf	CMD2
	movlw	b'01000001'		
	movwf	CMD3
	movlw	b'11000001'		
	movwf	CMD4
	movlw	b'00100001'		
	movwf	CMD5
	movlw	b'10100001'		
	movwf	CMD6
	movlw	b'01100001'		
	movwf	CMD7
	movlw	b'11100001'		
	movwf	CMD8
	movlw	b'00010001'		
	movwf	CMD9

;*************
_main_loop

	movf	GPIO,w
	movwf	POTM

	movlw	d'30'
	movwf	WAIT_C
LOOP6
	call TIM1m
	decfsz	WAIT_C,F
	goto	LOOP6

	movf	GPIO,w
	xorwf	POTM,w
	btfss	STATUS,Z
	goto	no_sw
	



	btfss	POTM,5	;上
	goto	sw2
	btfss	POTM,4	;下
	goto	sw8
	btfss	POTM,1	;左
	goto	sw4
	btfss	POTM,0	;右
	goto	sw6
	goto	no_sw

sw2
	movf	CMD2,w
	movwf	CMD

	btfsc	POTM,1	;左
	goto	sw3

	movf	CMD1,w
	movwf	CMD

	goto out_sw

sw3
	btfsc	POTM,0	;右
	goto	out_sw

	movf	CMD3,w
	movwf	CMD

	goto out_sw

;

sw8
	movf	CMD8,w
	movwf	CMD

	btfsc	POTM,1	;左
	goto	sw9

	movf	CMD7,w
	movwf	CMD

	goto out_sw

sw9
	btfsc	POTM,0	;右
	goto	out_sw

	movf	CMD9,w
	movwf	CMD

	goto out_sw


sw4
	movf	CMD4,w
	movwf	CMD

	goto out_sw

sw6
	movf	CMD6,w
	movwf	CMD

	goto out_sw

out_sw
	call soushin
no_sw



	goto _main_loop
;*************
soushin
;						リーダー
	call	TENTOU_1T
	call	TENTOU_1T
	call	TENTOU_1T
	call	TENTOU_1T
	call	SHOUTOU_1T

	btfsc CMD,7
	call	TENTOU_1T
	call	TENTOU_1T
	call	SHOUTOU_1T
	
	btfsc CMD,6
	call	TENTOU_1T
	call	TENTOU_1T
	call	SHOUTOU_1T
	
	btfsc CMD,5
	call	TENTOU_1T
	call	TENTOU_1T
	call	SHOUTOU_1T
	
	btfsc CMD,4
	call	TENTOU_1T
	call	TENTOU_1T
	call	SHOUTOU_1T
	
	btfsc CMD,3
	call	TENTOU_1T
	call	TENTOU_1T
	call	SHOUTOU_1T
	
	btfsc CMD,2
	call	TENTOU_1T
	call	TENTOU_1T
	call	SHOUTOU_1T
	
	btfsc CMD,1
	call	TENTOU_1T
	call	TENTOU_1T
	call	SHOUTOU_1T
	
	btfsc CMD,0
	call	TENTOU_1T
	call	TENTOU_1T
	call	SHOUTOU_1T
	

	call	TENTOU_1T
	call	SHOUTOU_1T
	call	TENTOU_1T
	call	SHOUTOU_1T
	call	TENTOU_1T
	call	SHOUTOU_1T
	call	TENTOU_1T
	call	SHOUTOU_1T


	return
;*************
;*************
;*************
;*************
;点灯サブルーチン（600us）
;4クロックで１サイクル、4MHz では 1cycleで、1usec
TENTOU_1T
	movlw	0x17
	movwf	CNT3

LOOP3
	movlw	0x04
	movwf	CNT1
	movlw	0x01
	movwf	CNT2

	bsf GPIO,2
	nop
LOOP1
	decfsz	CNT1,F	;2+3*0x04-1=13	cycle
	goto	LOOP1

	bcf GPIO,2
	nop
LOOP2
	nop			;2+4*0x01+8-1=13	cycle	
	decfsz	CNT2,F
	goto	LOOP2

	nop
	decfsz	CNT3,F		
	goto	LOOP3

	return			;600cycleで、600us

;*************
;消灯サブルーチン（600us）
;4クロックで１サイクル、4MHz では 1cycleで、1usec
SHOUTOU_1T
	bcf GPIO,2
	movlw	0x95
	movwf	CNT1

LOOP4
	nop			;4*0x95-1=595	cycle	
	decfsz	CNT1,F
	goto	LOOP4
	return			;3+ 595 +2=600 cycle


;*************
;ウェイトサブルーチン(約1ミリ秒)
;4クロックで１サイクル、4MHz では 1cycleで、1usec
TIM1m
	movlw	0xf9
	movwf	CNT1
LOOP5
	nop			;4*0xf9-1=995	cycle	
	decfsz	CNT1,F
	goto	LOOP5
	return			;2+ 995 +2=999 cycle

		END                       ; directive 'end of program'
