;----------------------------------------------------------------------------------------
;３桁周波数カウンタ－　７ｓｅｇ　カソードｺﾓﾝ　ＬＥＤ
;最高周波数　20MHｚ
;----------------------------------------------------------------------------------------

		TITLE		"<3桁周波数ｶｳﾝﾀ->"
		SUBTITLE	"<7segｶｿｰﾄﾞｺﾓﾝ>"
		LIST		 P=16F628A
		INCLUDE		"P16F628A.inc"

		__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_ON & _LVP_OFF & _MCLRE_OFF & _HS_OSC

;----------------------------------------------------------------------------------------
;	[ ﾒﾓﾘ-割り当て ]
;----------------------------------------------------------------------------------------

wait_cn		EQU		02CH
A0D		EQU		02DH
cn		EQU		02EH

x_0		EQU		030H		;Xは、必ず #10h 番地に置いてね
x_1		EQU		031H
x_2		EQU		032H
x_3		EQU		033H

vfo_0		EQU		038H		;#18h番地;Lo(VFO)
vfo_1		EQU		039H
vfo_2		EQU		03AH
vfo_3		EQU		03BH


;dec は必ず＃20h番地に; 10進格納場所（ 10ﾊﾞｲﾄ ）dec_top

dec_0		EQU		040H		;計算結果 1000MHｚの桁
dec_1		EQU		041H		;計算結果　100MHｚの桁
dec_2		EQU		042H		;計算結果　 10MHｚの桁
dec_3		EQU		043H		;計算結果　  1MHｚの桁
dec_4		EQU		044H		;計算結果　100KHｚの桁
dec_5		EQU		045H		;計算結果 　10KHｚの桁
dec_6		EQU		046H		;計算結果　  1KHｚの桁
dec_7		EQU		047H		;計算結果　 100Hｚの桁
dec_8		EQU		048H		;計算結果　  10Hｚの桁
dec_9		EQU		049H		;計算結果   　1Hｚの桁


val_0		EQU		04AH		; 変換したい値（３２ビット）
val_1		EQU		04BH		; 変換したい値（３２ビット）
val_2		EQU		04CH		; 変換したい値（３２ビット）
val_3		EQU		04DH		; 変換したい値（３２ビット）

val_m		EQU		04EH		; 一時余り格納場所（サブルーチンで使用）

N		EQU		04FH		;prescaler 1/N= ×4倍

mode		EQU		051H		;RB1がLの時10MHz桁以下表示。RB1がHの時1MHz桁以下表示

dsp_0		EQU		059H		;7ｾｸﾞﾒﾝﾄLED表示　1桁目
dsp_1		EQU		05AH		;7ｾｸﾞﾒﾝﾄLED表示　2桁目
dsp_2		EQU		05BH		;7ｾｸﾞﾒﾝﾄLED表示　3桁目
dsp_3		EQU		05CH		;7ｾｸﾞﾒﾝﾄLED表示　4桁目
dsp_4		EQU		05DH		;7ｾｸﾞﾒﾝﾄLED表示　5桁目
dsp_5		EQU		05EH		;7ｾｸﾞﾒﾝﾄLED表示　6桁目

;----------------------------------------------------------------------------------------
; START
;----------------------------------------------------------------------------------------

		ORG		0000H
		GOTO		start
		ORG		0004H
		GOTO		start

;----------------------------------------------------------------------------------------
; 7SEG 表示DATA　0-9
;----------------------------------------------------------------------------------------

t_fig		ADDWF		PCL,F
		RETLW		0BEH		;7ｾｸﾞﾒﾝﾄLED表示DATA [0]
		RETLW		018H		;7ｾｸﾞﾒﾝﾄLED表示DATA [1]
		RETLW		076H		;7ｾｸﾞﾒﾝﾄLED表示DATA [2]
		RETLW		07CH		;7ｾｸﾞﾒﾝﾄLED表示DATA [3]
		RETLW		0D8H		;7ｾｸﾞﾒﾝﾄLED表示DATA [4]
		RETLW		0ECH		;7ｾｸﾞﾒﾝﾄLED表示DATA [5]
		RETLW		0CEH		;7ｾｸﾞﾒﾝﾄLED表示DATA [6]
		RETLW		038H		;7ｾｸﾞﾒﾝﾄLED表示DATA [7]
		RETLW		0FEH		;7ｾｸﾞﾒﾝﾄLED表示DATA [8]
		RETLW		0F8H		;7ｾｸﾞﾒﾝﾄLED表示DATA [9]
		RETLW		000H		;7ｾｸﾞﾒﾝﾄLED表示DATA [ﾌﾞﾗﾝｸ]
		RETLW		000H		;7ｾｸﾞﾒﾝﾄLED表示DATA [ﾌﾞﾗﾝｸ]
		RETLW		000H		;7ｾｸﾞﾒﾝﾄLED表示DATA [ﾌﾞﾗﾝｸ]
		RETLW		000H		;7ｾｸﾞﾒﾝﾄLED表示DATA [ﾌﾞﾗﾝｸ]
		RETLW		000H		;7ｾｸﾞﾒﾝﾄLED表示DATA [ﾌﾞﾗﾝｸ]
		RETLW		000H		;7ｾｸﾞﾒﾝﾄLED表示DATA [ﾌﾞﾗﾝｸ]
		SLEEP

;----------------------------------------------------------------------------------------
; 7SEG 表示DATA　0-9　DP　表示付
;----------------------------------------------------------------------------------------

t_fig_dp	ADDWF		PCL,F
		RETLW		0BFH		;7ｾｸﾞﾒﾝﾄLED表示DATA [0.]
		RETLW		019H		;7ｾｸﾞﾒﾝﾄLED表示DATA [1.]
		RETLW		077H		;7ｾｸﾞﾒﾝﾄLED表示DATA [2.]
		RETLW		07DH		;7ｾｸﾞﾒﾝﾄLED表示DATA [3.]
		RETLW		0D9H		;7ｾｸﾞﾒﾝﾄLED表示DATA [4.]
		RETLW		0EDH		;7ｾｸﾞﾒﾝﾄLED表示DATA [5.]
		RETLW		0CFH		;7ｾｸﾞﾒﾝﾄLED表示DATA [6.]
		RETLW		039H		;7ｾｸﾞﾒﾝﾄLED表示DATA [7.]
		RETLW		0FFH		;7ｾｸﾞﾒﾝﾄLED表示DATA [8.]
		RETLW		0F9H		;7ｾｸﾞﾒﾝﾄLED表示DATA [9.]
		RETLW		000H		;7ｾｸﾞﾒﾝﾄLED表示DATA [ﾌﾞﾗﾝｸ]
		RETLW		000H		;7ｾｸﾞﾒﾝﾄLED表示DATA [ﾌﾞﾗﾝｸ]
		RETLW		000H		;7ｾｸﾞﾒﾝﾄLED表示DATA [ﾌﾞﾗﾝｸ]
		RETLW		000H		;7ｾｸﾞﾒﾝﾄLED表示DATA [ﾌﾞﾗﾝｸ]
		RETLW		000H		;7ｾｸﾞﾒﾝﾄLED表示DATA [ﾌﾞﾗﾝｸ]
		RETLW		000H		;7ｾｸﾞﾒﾝﾄLED表示DATA [ﾌﾞﾗﾝｸ]
		SLEEP

;----------------------------------------------------------------------------------------

start


		MOVLW		07H          ;
		MOVWF		CMCON               ;コンパレータOFF


		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

;----------------------------------------------------------------------------------------


dp_off		BSF		STATUS,5
		MOVLW		00FH
		MOVWF		TRISB
		BCF		STATUS,5
		BSF		PORTB,7
		BSF		PORTB,6
		BSF		PORTB,5
		BSF		PORTB,4
		NOP
		NOP
		MOVF		PORTB,W
		ANDLW		00FH
		MOVWF		mode

		MOVLW		001H
		MOVWF		wait_cn
		CALL		wait_ms
		RETURN

;----------------------------------------------------------------------------------------


c_main025		CLRF		vfo_0
		CLRF		vfo_1
		CLRF		vfo_2
		CLRF		vfo_3
		CLRWDT
		CLRF		TMR0		;カウンタTMR0をクリア
		BSF		STATUS,5	;バンク1
		MOVLW		018H
		MOVWF		TRISA		;trisA
		BCF		STATUS,5	;バンク0
		NOP
		CALL		t250sec		;(2+799994)*1

		BSF		STATUS,5	;1	バンク1
		MOVLW		010H
		MOVWF		TRISA		;1	ra.3ピンをout;TMR0の停止
		BCF		TRISA,3
		BCF		STATUS,5
		BCF		PORTA,3
		CALL		dl5
		NOP
		MOVF		TMR0,W
		MOVWF		vfo_1
		INCF		vfo_0,F
toggle		DECF		vfo_0,F
		BCF		PORTA,3
		BSF		PORTA,3
		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		0FAH
		MOVWF		cn
		NOP


display		MOVF		dsp_5,W
		CALL		t_fig
		MOVWF		PORTB
		BCF		PORTA,2
		CALL		delay329
		NOP
		NOP
		BSF		PORTA,2

		MOVF		dsp_4,W
		CALL		t_fig_dp
		MOVWF		PORTB
		BCF		PORTA,1
		CALL		delay329
		NOP
		NOP
		BSF		PORTA,1

		MOVF		dsp_3,W
		CALL		t_fig
		MOVWF		PORTB
		BCF		PORTA,0
		CALL		delay329
		NOP
		NOP
		BSF		PORTA,0

		NOP
		DECFSZ		cn,F
		GOTO		display
		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
		MOVLW		00FH
		MOVWF		wait_cn
		GOTO		wait_ms
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		04AH
		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
		BTFSC		mode,0
		GOTO		LBL0153
		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
		BTFSS		mode,0
		GOTO		LBL015F
LBL0153		MOVF		dec_2,W
		MOVWF		dsp_5
		MOVF		dec_3,W
		MOVWF		dsp_4
		MOVF		dec_4,W
		MOVWF		dsp_3
		MOVF		dec_6,W
		MOVWF		dsp_2
		MOVF		dec_7,W
		MOVWF		dsp_1
		MOVF		dec_8,W
		MOVWF		dsp_0
LBL015F		CALL		dp_off
		GOTO		f_counter


		END
