;4桁周波数カウンタ－
;最高周波数　35MHｚ
;OSC 12.8MHz
;LED アノ－ドコモン

		TITLE		"<4桁周波数ｶｳﾝﾀ->"

		LIST		 P=16F84A
		INCLUDE		"P16F84A.inc"

	__CONFIG	_CP_OFF & _WDT_OFF & _PWRTE_OFF & _HS_OSC

;----------------------------------------------------------------------------------------
;	[ ﾒﾓﾘ-割り当て ]
;----------------------------------------------------------------------------------------

wait_cn	EQU		0CH
A0D		EQU		0DH
cn		EQU		0EH

x_0		EQU		010H		;Xは、必ず #10h 番地に置いてね
x_1		EQU		011H
x_2		EQU		012H
x_3		EQU		013H

vfo_0	EQU		018H		;#18h番地;Lo(VFO)
vfo_1	EQU		019H
vfo_2	EQU		01AH
vfo_3	EQU		01BH


;dec は必ず＃20h番地に; 10進格納場所（ 10ﾊﾞｲﾄ ）dec_top

dec_0	EQU		020H		;計算結果 1000MHｚの桁
dec_1	EQU		021H		;計算結果　100MHｚの桁
dec_2	EQU		022H		;計算結果　 10MHｚの桁
dec_3	EQU		023H		;計算結果　  1MHｚの桁
dec_4	EQU		024H		;計算結果　100KHｚの桁
dec_5	EQU		025H		;計算結果 　10KHｚの桁
dec_6	EQU		026H		;計算結果　  1KHｚの桁
dec_7	EQU		027H		;計算結果　 100Hｚの桁
dec_8	EQU		028H		;計算結果　  10Hｚの桁
dec_9	EQU		029H		;計算結果   　1Hｚの桁


val_0	EQU		02AH		; 変換したい値（３２ビット）
val_1	EQU		02BH		; 変換したい値（３２ビット）
val_2	EQU		02CH		; 変換したい値（３２ビット）
val_3	EQU		02DH		; 変換したい値（３２ビット）

val_m	EQU		02EH		; 一時余り格納場所（サブルーチンで使用）

N		EQU		02FH		;prescaler 1/N= ×4倍

mode		EQU		031H		;RB1がLの時10MHz桁以下表示。RB1がHの時1MHz桁以下表示

dsp_0	EQU		039H		;7ｾｸﾞﾒﾝﾄLED表示　1桁目
dsp_1	EQU		03AH		;7ｾｸﾞﾒﾝﾄLED表示　2桁目
dsp_2	EQU		03BH		;7ｾｸﾞﾒﾝﾄLED表示　3桁目
dsp_3	EQU		03CH		;7ｾｸﾞﾒﾝﾄLED表示　4桁目
dsp_4	EQU		03DH		;7ｾｸﾞﾒﾝﾄLED表示　5桁目
dsp_5	EQU		03EH		;7ｾｸﾞﾒﾝﾄLED表示　6桁目

;----------------------------------------------------------------------------------------
; START
;----------------------------------------------------------------------------------------

		ORG		0000H
		GOTO		start
		ORG		0004H
		GOTO		start

;----------------------------------------------------------------------------------------
; 7SEG 表示DATA　0-9
;----------------------------------------------------------------------------------------

t_fig	ADDWF		PCL,F
		RETLW		041H		;7ｾｸﾞﾒﾝﾄLED表示DATA [0]
		RETLW		0E7H		;7ｾｸﾞﾒﾝﾄLED表示DATA [1]
		RETLW		089H		;7ｾｸﾞﾒﾝﾄLED表示DATA [2]
		RETLW		083H		;7ｾｸﾞﾒﾝﾄLED表示DATA [3]
		RETLW		027H		;7ｾｸﾞﾒﾝﾄLED表示DATA [4]
		RETLW		013H		;7ｾｸﾞﾒﾝﾄLED表示DATA [5]
		RETLW		031H		;7ｾｸﾞﾒﾝﾄLED表示DATA [6]
		RETLW		0C7H		;7ｾｸﾞﾒﾝﾄLED表示DATA [7]
		RETLW		001H		;7ｾｸﾞﾒﾝﾄLED表示DATA [8]
		RETLW		007H		;7ｾｸﾞﾒﾝﾄLED表示DATA [9]
		RETLW		0FFH		;7ｾｸﾞﾒﾝﾄLED表示DATA [ﾌﾞﾗﾝｸ]
		RETLW		0FFH		;7ｾｸﾞﾒﾝﾄLED表示DATA [ﾌﾞﾗﾝｸ]
		RETLW		0FFH		;7ｾｸﾞﾒﾝﾄLED表示DATA [ﾌﾞﾗﾝｸ]
		RETLW		0FFH		;7ｾｸﾞﾒﾝﾄLED表示DATA [ﾌﾞﾗﾝｸ]
		RETLW		0FFH		;7ｾｸﾞﾒﾝﾄLED表示DATA [ﾌﾞﾗﾝｸ]
		RETLW		0FFH		;7ｾｸﾞﾒﾝﾄLED表示DATA [ﾌﾞﾗﾝｸ]
		SLEEP

;----------------------------------------------------------------------------------------

start	CALL		wt255ms
		CLRF		TMR0
		BSF		STATUS,5
		MOVLW	010H
		MOVWF	TRISA
		CLRWDT
		MOVLW	067H
		MOVWF	OPTION_REG
		BCF		STATUS,5
		CLRF		PORTA
		CLRF		PORTB
		CLRF		dsp_5
		CLRF		dsp_4
		CLRF		dsp_3
		CLRF		dsp_2
		CLRF		dsp_1
		CLRF		dsp_0
		NOP
		GOTO		f_counter

;----------------------------------------------------------------------------------------

dp_on	BSF		STATUS,5
		MOVLW	000H
		MOVWF	TRISB
		BCF		STATUS,5
		RETURN

;----------------------------------------------------------------------------------------

c_main025	CLRF		vfo_0
		CLRF		vfo_1
		CLRF		vfo_2
		CLRF		vfo_3
		CLRWDT
		CLRF		TMR0		;カウンタTMR0をクリア
		BSF		STATUS,5	;バンク1
		MOVLW	001H
		MOVWF	TRISB		;trisA

		MOVLW	010H
		MOVWF	TRISA		;trisA
		BCF		STATUS,5	;バンク0
		NOP
		CALL		t250sec		;(2+799994)*1

		BSF		STATUS,5	;1	バンク1
		MOVLW	001H
		MOVWF	TRISB		;1	ra.3ピンをout;TMR0の停止
		BCF		TRISB,0
		BCF		STATUS,5
		BCF		PORTB,0
		CALL		dl5
		NOP
		MOVF		TMR0,W
		MOVWF	vfo_1
		INCF		vfo_0,F
toggle	DECF		vfo_0,F
		BCF		PORTB,0
		BSF		PORTB,0
		NOP
		NOP
		MOVF		TMR0,W
		SUBWF	vfo_1,W
		BTFSC	STATUS,2
		GOTO		toggle
		DECF		vfo_0,F
		RETURN

;----------------------------------------------------------------------------------------

t250sec


;		MOVLW	04DH
;		MOVWF	wait_cn
;		CALL		wait_us
;		NOP
;		NOP
		MOVLW	0BBH
		MOVWF	cn
		NOP

display	MOVF		dsp_5,W
		CALL		t_fig
		MOVWF	PORTB
		BSF		PORTA,0
		CALL		delay329
		NOP
		NOP
		NOP
		NOP
		NOP
		BCF		PORTA,0

		MOVF		dsp_4,W
		CALL		t_fig
		MOVWF	PORTB
		BSF		PORTA,1
		CALL		delay329
		NOP
		NOP
		NOP
		NOP
		NOP
		BCF		PORTA,1

		MOVF		dsp_3,W
		CALL		t_fig
		MOVWF	PORTB
		BSF		PORTA,2
		CALL		delay329
		NOP
		NOP
		NOP
		NOP
		NOP
		BCF		PORTA,2


		MOVF		dsp_2,W
		CALL		t_fig
		MOVWF	PORTB
		BSF		PORTA,3
		CALL		delay329
		NOP
		NOP
		NOP
		NOP
		NOP
		BCF		PORTA,3

		NOP
		NOP
		NOP

		DECFSZ	cn,F
		GOTO		display

		NOP
		NOP
		NOP
		RETURN

delay329	MOVLW	0FDH
		MOVWF	wait_cn
		CALL		wait_us
		MOVLW	05AH
		MOVWF	wait_cn
		CALL		wait_us

dl5		MOVF		INTCON,W
		MOVWF	mode
		BCF		STATUS,0
		MOVLW	001H
		BTFSC	mode,2
		ADDWF	vfo_2,F
		BTFSC	STATUS,0
		ADDWF	vfo_3,F
		BTFSC	mode,2
		BCF		INTCON,2
		RETURN

;----------------------------------------------------------------------------------------

LBL00B1	MOVLW	004H
		MOVWF	N
		CALL		mult_vN
		MOVF		x_3,W
		MOVWF	val_3
		MOVF		x_2,W
		MOVWF	val_2
		MOVF		x_1,W
		MOVWF	val_1
		MOVF		x_0,W
		MOVWF	val_0
		CALL		dcmain
		RETURN

wait_us	DECFSZ	wait_cn,F
		GOTO		wait_us
		RETURN

wt255ms	MOVLW	0FFH
		MOVWF	wait_cn
wait_ms	MOVLW	000H
		MOVWF	A0D
wait_ms1	NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		DECFSZ	A0D,F
		GOTO		wait_ms1
		DECFSZ	wait_cn,F
		GOTO		wait_ms
		RETURN

;----------------------------------------------------------------------------------------
;	３２ビットバイナリ→１０進変換
;	valに３２ビットデータを置く。（val[3]:val[2]:val[1]:va[0])
;	dcmainをコールする。	decに答えが格納される。
;	(dec[0]:dec[1]:...:dec[8]:dec[9])   dec[0]が最上位桁でdec[9]が最下位桁
;	変換後valは破壊される。
;	sample:		val	= 00:00:04:D2 h
;			dec	= 00:00:00:00:00:00:01:02:03:04
;                  	dec(0):dec(1):(2):(3):(4):(5):(6):(7):(8):dec(9)
;						(1,234)

dcmain	MOVLW	02AH
		MOVWF	FSR
		CALL		devide
		CALL		devide
		CALL		devide
		CALL		devide
		CALL		devide
		CALL		devide
		CALL		devide
		CALL		devide
		CALL		devide
		CALL		devide

;						---------------------------------
;						ｾﾞﾛﾌﾞﾗﾝｸの処理
;						---------------------------------
		BTFSC	mode,0
		GOTO		ZERO_10
		MOVLW	003H		;Zero Blank処置　最小100Hz表示
		GOTO		ZERO_100
ZERO_10	MOVLW	003H		;Zero Blank処置　最小10Hz表示

ZERO_100
		MOVWF	cn
		MOVLW	020H		; dec[0]格納場所初期値
		MOVWF	FSR
zb1		MOVF		INDF,W
		BTFSS	STATUS,2	;if dec[]=00, then continue, else return
		RETURN
		MOVF		INDF,W
		BTFSC	STATUS,2
		MOVLW	00BH
		MOVWF	INDF
		INCF		FSR,F
		DECFSZ	cn,F
		GOTO		zb1
		RETURN

;----------------------------------------------------------------------------------------
;		÷１０サブルーチン
;		１０で除算します

devide	MOVLW	020H
		MOVWF	cn
		CLRF		val_m
devide0	BCF		STATUS,0
		RLF		val_0,F
		RLF		val_1,F
		RLF		val_2,F
		RLF		val_3,F
		RLF		val_m,F
		MOVLW	0F6H
		ADDWF	val_m,W
		BTFSC	STATUS,0
		MOVWF	val_m
		BTFSC	STATUS,0
		INCF		val_0,F
		DECFSZ	cn,F
		GOTO		devide0
		DECF		FSR,F
		MOVF		val_m,W
		MOVWF	INDF
		RETURN

;	[end of 10進変換]


;---------------------------------------------------------------------------------------------------------------------------
;	掛け算				x[32bit]=vfo[32bit] * N[8bit]
;	vfoに32ビットデータを置く	（vfo[3]:vfo[2]:vfo[1]:vfo[0]) 
;       Nに 8ﾋﾞｯﾄﾃﾞｰﾀを置く。		N ;  最大  #255です。
;	xに答えが格納される。		（x[3]:x[2]:x[1]:x[0]) 
;	変換後 N は破壊されない。


mult_vN	CLRF		x_3
		CLRF		x_2
		CLRF		x_1
		CLRF		x_0
		MOVLW	008H
		MOVWF	cn
mult0	BTFSS	N,0
		GOTO		mutpas
		MOVF		vfo_0,W
		ADDWF	x_0,F
		MOVLW	001H
		BTFSC	STATUS,0
		ADDWF	x_1,F
		BTFSC	STATUS,0
		ADDWF	x_2,F
		BTFSC	STATUS,0
		ADDWF	x_3,F
		MOVF		vfo_1,W
		ADDWF	x_1,F
		MOVLW	001H
		BTFSC	STATUS,0
		ADDWF	x_2,F
		BTFSC	STATUS,0
		ADDWF	x_3,F
		MOVF		vfo_2,W
		ADDWF	x_2,F
		MOVLW	001H
		BTFSC	STATUS,0
		ADDWF	x_3,F
		MOVF		vfo_3,W
		ADDWF	x_3,F

mutpas	BCF		STATUS,0
		RLF		vfo_0,F
		RLF		vfo_1,F
		RLF		vfo_2,F
		RLF		vfo_3,F
		BTFSC	STATUS,0
		BSF		vfo_0,0
		BCF		STATUS,0
		RRF		N,F
		BTFSC	STATUS,0
		BSF		N,7
		DECFSZ	cn,F
		GOTO		mult0

		MOVLW	008H
		MOVWF	cn
multrot	BCF		STATUS,0
		RRF		vfo_3,F
		RRF		vfo_2,F
		RRF		vfo_1,F
		RRF		vfo_0,F
		BTFSC	STATUS,0
		BSF		vfo_3,7
		DECFSZ	cn,F
		GOTO		multrot
		RETURN

;		[end of 掛け算]

f_counter
		CALL		dp_on
		CALL		c_main025
		CALL		LBL00B1
		MOVF		dec_2,W
		MOVWF	dsp_5
		MOVF		dec_3,W
		MOVWF	dsp_4
		MOVF		dec_4,W
		MOVWF	dsp_3
		MOVF		dec_5,W
		MOVWF	dsp_2
		MOVF		dec_6,W
		MOVWF	dsp_1
		MOVF		dec_7,W
		MOVWF	dsp_0
		GOTO		f_counter

		END
