
	TITLE		"<8桁周波数ｶｳｳﾝﾀ-　PIC16F876>"
	SUBTITLE	"<ｶｿｰﾄﾞｺﾓﾝ　7ｾｸﾞﾒﾝﾄLED >"
	LIST		P=PIC16F876
	INCLUDE		"P16F876.INC"

	__CONFIG	_HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _LVP_OFF

;---------------------------------------------------------------------------------------------------------------------------
;	[ ﾒﾓﾘ-割り当て ]

wait_cn		EQU		02CH
wait_cn2	EQU		02DH
cn		EQU		02EH

x_0		EQU		030H
x_1		EQU		031H
x_2		EQU		032H
x_3		EQU		033H

vfo_0		EQU		038H
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=1,2,3,4,5,6,8,9,10 [ ｽﾙ-の場合は　×4倍 ]
									;外部にﾌﾟﾘｽｹを付けた場合　例　1/8のﾌﾟﾘｽｹの場合は　8×4倍 32が N となる

poi		EQU		050H

mode		EQU		051H					;FC/LH/Lo/-/CW/SSB/bt/Rev=11111111b
									;bt=1の時100KHz桁以下表示。bt=0の時100MHz桁以下表示

ifdef_0		EQU		052H
ifdef_1		EQU		053H

overf		EQU		054H

regrb		EQU		057H
oldrb		EQU		058H

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桁目
dsp_6		EQU		05FH					;7ｾｸﾞﾒﾝﾄLED表示　7桁目
dsp_7		EQU		060H					;7ｾｸﾞﾒﾝﾄLED表示　8桁目




light		EQU		05FH					;LED ON/OFF のrotate レジスタ

;---------------------------------------------------------------------------------------------------------------------------

		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

		BSF		STATUS,RP0
		MOVLW		07H
		MOVWF		ADCON1
		BCF		STATUS,RP0

		CALL		wt255ms

		CLRF		TMR0					;TMR0をクリア
		BSF		STATUS,5				;バンク1
		MOVLW		010H					;ra.4-ra.0ピンをOUTに !ra,#00010000b
		MOVWF		TRISA					;trisA
		CLRWDT							;prescalerをクリア
		MOVLW		067H					;prescaler 1/256 set ;RBプルアップ; 立ち上がりカウント
		MOVWF		OPTION_REG
		BCF		STATUS,5				;バンク0
		CLRF		PORTA
		CLRF		PORTB
		CLRF		PORTC



		CLRF		dsp_7
		CLRF		dsp_6
		CLRF		dsp_5
		CLRF		dsp_4
		CLRF		dsp_3
		CLRF		dsp_2
		CLRF		dsp_1
		CLRF		dsp_0

;		GOTO		dp_off

		GOTO		f_counter

;---------------------------------------------------------------------------------------------------------------------------

dp_on		BSF		STATUS,5				;バンク1
		MOVLW		000H					;rb.0-rb.7ピンをout に !rb,#00000000b
		MOVWF		TRISB					;trisb
		MOVLW		000H					;rc.0-rc.7ピンをout に !rc,#00000000b
		MOVWF		TRISC					;trisc
		BCF		STATUS,5				;バンク0
		RETURN


;---------------------------------------------------------------------------------------------------------------------------


dp_off

	BSF		STATUS,5
	MOVLW		020H
	MOVWF		TRISA
	BCF		STATUS,5

	BTFSS		PORTA,5
	GOTO		mhz_dp
	MOVLW		00FH		;1M表示
	MOVWF		mode
	GOTO		hz_dp

mhz_dp
	MOVLW		000H		;10M表示
	MOVWF		mode
hz_dp

		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					;ra.3ピンをIN=high impedance/TMR0の開始
		MOVWF		TRISA					;trisA						| 1cycle
		BCF		STATUS,5				;バンク0					| 1cycle

;****** 測定開始 ********************************************************************************

		NOP							;						| 1cycle
		CALL		t250sec					;(2+799994)*1					|　数えて799,996cycle
		BSF		STATUS,5				;1	バンク1					|1cycle
		MOVLW		010H					;1	ra.3ピンをout;TMR0の停止		|1cycle

;****** 測定終了 ********************************************************************************
;  ---- 800000 step -----
;****** 測定終了 ********************************************************************************

		MOVWF		TRISA					;1	trisA	ここまで 3cycle
		BCF		TRISA,3					;1
		BCF		STATUS,5				;バンク0
		BCF		PORTA,3
		CALL		dl5					;overflow check after last check

		NOP
		MOVF		TMR0,W					;TMR0のdataをvfo[1]に
		MOVWF		vfo_1

		INCF		vfo_0,F
toggle		DECF		vfo_0,F
		BCF		PORTA,3					;port Ra4のトグル
		BSF		PORTA,3
		NOP
		NOP

		MOVF		TMR0,W
		SUBWF		vfo_1,W					;vfo[1]-TMR0=0であれば Z=1
		BTFSC		STATUS,2
		GOTO		toggle
		DECF		vfo_0,F					;vfo[0]への prescaler値の取り込み完。
		RETURN

;---------------------------------------------------------------------------------------------------------------------------
; このループ合計で799994stepになるように調整する　　※　基準周波数が12.8MHｚの場合
;---------------------------------------------------------------------------------------------------------------------------

;*****************************************************************
;　この部分は　799994stepになるように余りのstepを調整している
;*****************************************************************


t250sec									;110+1+2  +1+1+1  +(799874  )    +1+1+2=799994steps
		MOVLW		00FH					;1+(35*3cycle+2+2)=110
		MOVWF		wait_cn					;1
		CALL		wait_us					;2cycle
		MOVLW		05EH					;1　　　displayを125回繰り返す
		MOVWF		cn					;1


;********************************************
;　表示プログラム　
;********************************************

display			
						;--94*(6*1063+3+1+2)-1=799874

		NOP							;1  時間調整


		NOP
		NOP
		MOVF		dsp_7,W					;8桁
		CALL		 t_fig					;2cycle /3cycle ;2+4
		MOVWF		PORTC					;1
		BCF		PORTB,7					;1
		CALL		delay328				;2+1052
		NOP							;1
		BSF		PORTB,7					;1



		NOP
		NOP
		MOVF		dsp_6,W					;7桁
		CALL		t_fig_dp				;2cycle /3cycle ;2+4
		MOVWF		PORTC					;1
		BCF		PORTB,6					;1
		CALL		delay328				;2+1052
		NOP							;1
		BSF		PORTB,6					;1


		NOP
		NOP
		MOVF		dsp_5,W					;6桁
		CALL		 t_fig					;2cycle /3cycle ;2+4
		MOVWF		PORTC					;1
		BCF		PORTB,5					;1
		CALL		delay328				;2+1052
		NOP							;1
		BSF		PORTB,5					;1


		NOP
		NOP
		MOVF		dsp_4,W					;5桁
		CALL		 t_fig					;2cycle /3cycle ;2+4
		MOVWF		PORTC					;1
		BCF		PORTB,4					;1
		CALL		delay328				;2+1052
		NOP							;1
		BSF		PORTB,4					;1


		NOP
		NOP
		MOVF		dsp_3,W					;4桁
		CALL		t_fig_dp					;2cycle /3cycle ;2+4
		MOVWF		PORTC					;1
		BCF		PORTB,3					;1
		CALL		delay328				;2+1052
		NOP							;1
		BSF		PORTB,3					;1


		NOP
		NOP
		MOVF		dsp_2,W					;3桁
		CALL		 t_fig					;2cycle /3cycle ;2+4
		MOVWF		PORTC					;1
		BCF		PORTB,2					;1
		CALL		delay328				;2+1052
		NOP							;1
		BSF		PORTB,2					;1


		NOP
		NOP
		MOVF		dsp_1,W					;2桁
		CALL		 t_fig					;2cycle /3cycle ;2+4
		MOVWF		PORTC					;1
		BCF		PORTB,1					;1
		CALL		delay328				;2+1052
		NOP							;1
		BSF		PORTB,1					;1

		NOP
		NOP
		MOVF		dsp_0,W					;1桁
		CALL		 t_fig					;2cycle /3cycle ;2+4
		MOVWF		PORTC					;1
		BCF		PORTB,0					;1
		CALL		delay328				;2+1052
		NOP							;1
		BSF		PORTB,0					;1

		NOP							;1  時間調整
		NOP							;1  時間調整

		DECFSZ		cn,F					;1
		GOTO		display					;2

		RETURN							;2

;---------------------------------------------------------------------------------------------------------------------------
;	[1051steps=328.0 usecのルーチン]　変更　[1047stepsのルーチンへ]

delay328								;1048step
		MOVLW		0FDH					;1+(252*3cycle+2+2)+3=764
		MOVWF		wait_cn					;1cycle	 |	 	 |
		CALL		wait_us					;2cycle  |      	 |

		MOVLW		059H					;1+(88*3cycle+2+2)+15=  284
		MOVWF		wait_cn					;1cycle	 |	 	 |
		CALL		wait_us					;2cycle  |      	 |

dl5		MOVF		INTCON,W				;1cycle	 |	 	 |
		MOVWF		overf					;1cycle	 |	 	 |
		BCF		STATUS,0				;1cycle  |		 |
		MOVLW		001H					;1cycle	 |  16cy	 |
		BTFSC		overf,2					;2cycle	 | 		 |
		ADDWF		vfo_2,F					;0	 |		 |
		BTFSC		STATUS,0				;2cycle	 |		 |
		ADDWF		vfo_3,F					;0	 |		 |
		BTFSC		overf,2					;2cycle	 |		 |
		BCF		INTCON,2				;0cycle  |      	 |
		RETURN							;2cycle	 |		 |

;---------------------------------------------------------------------------------------------------------------------------

calc0									;単なるFreq. counterの計算はここから
		MOVLW		004H					;N:TD7104P 逓倍数x4
		MOVWF		N
		CALL		mult_vN					;x=VFO*N逓倍 。x[3]-x[0]に逓倍後のVFOが入っている.

calc1		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					;16進-10進変換
		RETURN

;---------------------------------------------------------------------------------------------------------------------------

wt15ms		MOVLW		00FH
		MOVWF		wait_cn					; wait 15ms
		GOTO		wait_ms
;---------------------------------------------------------------------------------------------------------------------------

wait_us		DECFSZ		wait_cn,F				;3 steps=1.2μｓのカウント
		GOTO		wait_us
		RETURN

;	[ｍｓオーダーのウェイト]

wt255ms		MOVLW		0FFH
		MOVWF		wait_cn
wait_ms		MOVLW		000H
		MOVWF		wait_cn2
wait_ms1	NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP

		DECFSZ		wait_cn2,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		040H		; 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		calc0
		BTFSS		mode,1
		GOTO		dp_MHz

		MOVF		dec_2,W					;計算結果　 10MHｚの桁
		MOVWF		dsp_7					;6桁目
		MOVF		dec_3,W					;計算結果　  1MHｚの桁
		MOVWF		dsp_6					;6桁目
		MOVF		dec_4,W					;計算結果　100kHｚの桁
		MOVWF		dsp_5					;6桁目
		MOVF		dec_5,W					;計算結果   10kHｚの桁
		MOVWF		dsp_4					;5桁目
		MOVF		dec_6,W					;計算結果    1kHｚの桁
		MOVWF		dsp_3					;4桁目
		MOVF		dec_7,W					;計算結果   100Hｚの桁
		MOVWF		dsp_2					;3桁目
		MOVF		dec_9,W					;計算結果    10Hｚの桁
		MOVWF		dsp_1					;2桁目
		MOVF		dec_9,W					;計算結果     1Hｚの桁
		MOVWF		dsp_0					;1桁目
		BTFSC		mode,1
		GOTO		dp_Hz

dp_MHz
		MOVF		dec_2,W					;計算結果　 10MHｚの桁
		MOVWF		dsp_7					;6桁目
		MOVF		dec_3,W					;計算結果　  1MHｚの桁
		MOVWF		dsp_6					;6桁目
		MOVF		dec_4,W					;計算結果　100kHｚの桁
		MOVWF		dsp_5					;6桁目
		MOVF		dec_5,W					;計算結果   10kHｚの桁
		MOVWF		dsp_4					;5桁目
		MOVF		dec_6,W					;計算結果    1kHｚの桁
		MOVWF		dsp_3					;4桁目
		MOVF		dec_7,W					;計算結果   100Hｚの桁
		MOVWF		dsp_2					;3桁目
		MOVF		dec_8,W					;計算結果    10Hｚの桁
		MOVWF		dsp_1					;2桁目
		MOVF		dec_9,W					;計算結果     1Hｚの桁
		MOVWF		dsp_0					;1桁目

dp_Hz
		CALL		dp_off
		GOTO		f_counter

		END
