;******************************************************************************************
;  4桁カウンタサンプル(超音波距離計)
;   Project      :
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H19.06.01
;   History      :
;******************************************************************************************
;  (0)Display
;     7 Segment Diode ( Anode common type )
;     内部オシレータを使用する(8MHz)
;  (1)Descript I/O 
;      B0～B7      : 7 Segment diode (a～h) 
;      A0          : Send TONE
;      A1          : Recive TONE
;      A2          : None
;      A3,A4,A6,A7 : 7 Segment diode (1～4)
;      A5          : None
;******************************************************************************************
	LIST	P=PIC16F88
	INCLUDE	"P16F88.inc"	
	__CONFIG _CONFIG1 , _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO
	__CONFIG _CONFIG2 , _IESO_OFF & _FCMEN_OFF

DN0	EQU	20H
DN1	EQU	21H
DN2	EQU	22H
DN3	EQU	23H
LPDSP	EQU	24H
LPDSP1	EQU	25H
CNT1	EQU	26H
CNT2	EQU	27H
LP1	EQU	28H
LP2	EQU	29H
LPWAT1	EQU	2AH
LPWT1B	EQU	2BH
LPWAT2	EQU	2CH
LPWT2B	EQU	2DH
PRIOD	EQU	2EH
TMPDAT	EQU	2FH
TMPDAT1	EQU	30H
TCNT	EQU	31H
TCNT1	EQU	32H
LPMAN1	EQU	33H
COU0	EQU	34H
COU1	EQU	35H
COU2	EQU	36H
COU3	EQU	37H
STAT	EQU	38H
LPWAT3	EQU	39H
LPWT3B	EQU	3AH
TIMCNT	EQU	3BH
LPCNV	EQU	3CH
;
	ORG	0
	GOTO	START
	ORG	4
	GOTO	START
START
; Bank0での設定
	BANKSEL	PORTA	; PortAのBankを選択する
	CLRF	PORTA	; PortAの初期化(Bank0)
	CLRF	PORTB	; PortBの初期化(Bank0,1,2,3)

; Bank1での設定
	BANKSEL	ANSEL	; ANSELのBankを選択する(Bank1)
	MOVLW	B'01111110'	;内部OSC選択,内部OSCに8MHzを選択
	MOVWF	OSCCON
	MOVLW	B'00000000'	;Degitalに設定
	MOVWF	ANSEL	; Degital Inputに設定(Bank1)
	MOVLW	B'00100110'
	MOVWF	TRISA	; PortAのI/O設定(Bank1)
	MOVLW	B'00000000'
	MOVWF	TRISB	; PortBのI/O設定(Bank1)
	MOVLW	B'10000000'	; 7:10Bitを右詰めで得る,6:?(どっちでも),5-4:ReferはVoltage-GND,3-0:None
	MOVWF	ADCON1	;(Bank1)
; Bank0に戻す
	BANKSEL	PORTA	; PortAのBankを選択する
; デモ表示
MAIN
; ============================================
;   1.初期化
; ============================================
	CLRF	PRIOD	; 小数点を表示しない	
	CALL	DEMO0	; 電源投入時に7-Segment Displayが正常に点灯するか確認する
	CALL	DEMO1	; デモを表示する
MADIN
; ============================================
;   2.40KHzパルス送信(1Plusで4.125[mm]進む)
;      ※ 5Plusなら0.021[m]
; ============================================
	MOVLW	H'05'		;1
	MOVWF	LPMAN1		;1
MAIN1
	BSF	PORTA,0		;1
	CALL	WAT2		;2
	BCF	PORTA,0		;1
	CALL	WAT2		;2
	DECFSZ	LPMAN1,F	;1(2)
	GOTO	MAIN1		;2
;
; ============================================
;   3.パルス受信
; ============================================
;   (1)初期カウント値セット
	MOVLW	H'02'
	MOVWF	TIMCNT		;1
MAIN2:
;   (2)パルスチェック
	BTFSC	PORTA,1		;1(2)
	GOTO	MAIND		;2
;   (3)カウント
	MOVLW	H'01'		;1
	ADDWF	TIMCNT,F	;1	
;   (4)ウエイト
	CALL	WAT3		;2
	MOVFW	STAT		;1
	XORLW	H'00'		;1
	BTFSS	STATUS,Z	;1(2)
	GOTO	MAIND
;   (5)オーバーフローでないならループ
	MOVFW	TIMCNT		;1
	XORLW	H'FF'		;1
	BTFSS	STATUS,Z	;1(2)
	GOTO	MAIN2		;2
;   (6)エラー値設定
	CALL	ERRCOU
	GOTO	MAIND1
; ============================================
;   4.結果の表示
; ============================================
MAIND:
;   (1)10進変換
	CALL	CNVHC
	MOVLW	H'04'
	MOVWF	PRIOD
MAIND1:
;   (2)数値を表示変数に代入 
	CALL	SETHEX
;   (3)結果を表示する
	CALL	WATDSP05
;
	GOTO	MADIN

;******************************************************************************************
;   Function Name : DEC7SEG
;   Title         : DECデコーダと7セグメント表示(アノードコモン用)
;   Input         : W:ワーキングレジスタ
;   Output        : なし
;******************************************************************************************
DEC7SEG
	MOVWF	TMPDAT
	MOVWF	TMPDAT1
	MOVLW	H'42'
	SUBWF	TMPDAT1,F
	BTFSS	STATUS,C
	GOTO	DEC7SEG1
	MOVLW	H'42'
	MOVWF	TMPDAT
DEC7SEG1
	MOVFW	TMPDAT
	CALL	TBL7A
	MOVWF	PORTB
	RETURN
TBL7A
	ADDWF	PCL,F
	RETLW	B'10001000'		; 0(00)
	RETLW	B'11111100'		; 1(01)
	RETLW	B'10100010'		; 2(02)
	RETLW	B'11100000'		; 3(03)
	RETLW	B'11010100'		; 4(04)
	RETLW	B'11000001'		; 5(05)
	RETLW	B'10000001'		; 6(06)
	RETLW	B'11111000'		; 7(07)
	RETLW	B'10000000'		; 8(08)
	RETLW	B'11000000'		; 9(09)
	RETLW	B'10010000'		; A(0A)
	RETLW	B'10000101'		; B(0B)
	RETLW	B'10001011'		; C(0C)
	RETLW	B'10100100'		; D(0D)
	RETLW	B'10000011'		; E(0E)
	RETLW	B'10010011'		; F(0F)
	RETLW	B'00000000'		; G(10)
	RETLW	B'00000000'		; H(11)
	RETLW	B'00000000'		; I(12)
	RETLW	B'00000000'		; J(13)
	RETLW	B'00000000'		; K(14)
	RETLW	B'00000000'		; L(15)
	RETLW	B'00000000'		; M(16)
	RETLW	B'00000000'		; N(17)
	RETLW	B'00000000'		; O(18)
	RETLW	B'10010010'		; P(19)
	RETLW	B'00000000'		; Q(1A)
	RETLW	B'10110111'		; R(1B)
	RETLW	B'00000000'		; S(1C)
	RETLW	B'00000000'		; T(1D)
	RETLW	B'10001100'		; U(1E)
	RETLW	B'00000000'		; V(1F)
	RETLW	B'00000000'		; W(20)
	RETLW	B'00000000'		; X(21)
	RETLW	B'00000000'		; Y(22)
	RETLW	B'00000000'		; Z(23)
	RETLW	B'00000000'		; a(24)
	RETLW	B'10000101'		; b(25)
	RETLW	B'10100111'		; c(26)
	RETLW	B'10100100'		; d(27)
	RETLW	B'10000011'		; e(28)
	RETLW	B'10010011'		; f(29)
	RETLW	B'11000000'		; g(2A)
	RETLW	B'00000000'		; h(2B)
	RETLW	B'10111111'		; i(2C)
	RETLW	B'00000000'		; j(2D)
	RETLW	B'00000000'		; k(2E)
	RETLW	B'00000000'		; l(2F)
	RETLW	B'00000000'		; m(30)
	RETLW	B'00000000'		; n(31)
	RETLW	B'00000000'		; o(32)
	RETLW	B'10010010'		; p(33)
	RETLW	B'00000000'		; q(34)
	RETLW	B'10110111'		; r(35)
	RETLW	B'00000000'		; s(36)
	RETLW	B'00000000'		; t(37)
	RETLW	B'00000000'		; u(38)
	RETLW	B'10101101'		; v(39)
	RETLW	B'00000000'		; w(3A)
	RETLW	B'00000000'		; x(3B)
	RETLW	B'00000000'		; y(3C)
	RETLW	B'00000000'		; z(3D)
	RETLW	B'11111111'		;  (3E)
	RETLW	B'00000000'		; -(3F)
	RETLW	B'00000000'		; _(40)
	RETLW	B'00000000'		; 全(41)
	RETLW	B'10011011'		; ERROR(42)

;******************************************************************************************
;   Function Name : DEMO0
;   Title         : 7-Segment-LEDの点灯状態確認用関数
;   Input         : なし
;   Output        :
;******************************************************************************************
DEMO0
	MOVLW	H'41'
	MOVWF	DN3
	MOVLW	H'41'
	MOVWF	DN2
	MOVLW	H'41'
	MOVWF	DN1
	MOVLW	H'41'
	MOVWF	DN0
	CALL	WATDSP

	RETURN

;******************************************************************************************
;   Function Name : DEMO1
;   Title         : 電源投入時のデモ
;   Input         : なし
;   Output        :
;******************************************************************************************
DEMO1
; PicCPU 表示
	MOVLW	H'19'	;P
	MOVWF	DN3
	MOVLW	H'2C'	;i
	MOVWF	DN2
	MOVLW	H'26'	;c
	MOVWF	DN1
	MOVLW	H'3E'	;
	MOVWF	DN0
	CALL	WATDSP

; 16F88 表示
	MOVLW	H'01'	;1
	MOVWF	DN3
	MOVLW	H'06'	;6
	MOVWF	DN2
	MOVLW	H'08'	;8
	MOVWF	DN1
	MOVLW	H'08'	;8
	MOVWF	DN0
	CALL	WATDSP

	RETURN

;******************************************************************************************
;   Function Name : WATDSP
;   Title         : WAITする（1秒程度、7Segmentを表示する）
;   Input         : DN0～DN3
;   Output        :
;******************************************************************************************
WATDSP
	MOVLW	H'05'	; 1秒程度点灯
	MOVWF	LPDSP1
WATDP1A
	MOVLW	H'CF'	; 表示時間調整
	MOVWF	LPDSP
WATDSP1
	CALL	C1DSP7
	DECFSZ	LPDSP,F
	GOTO	WATDSP1
	DECFSZ	LPDSP1,F
	GOTO	WATDP1A
	RETURN

;******************************************************************************************
;   Function Name : WATDSP05
;   Title         : WAITする（0.5秒程度、7Segmentを表示する）
;   Input         : DN0～DN3
;   Output        :
;******************************************************************************************
WATDSP05
	CALL	WATDSP2
	CALL	WATDSP2
	CALL	WATDSP2
	CALL	WATDSP2
	CALL	WATDSP2
	CALL	WATDSP2
	CALL	WATDSP2
	CALL	WATDSP2
	CALL	WATDSP2
	CALL	WATDSP2
	RETURN
;******************************************************************************************
;   Function Name : WATDSP2
;   Title         : 0.05秒程度、7Segmentを表示する
;   Input         : DN0～DN3
;   Output        :
;******************************************************************************************
WATDSP2
	MOVLW	H'1B'	; 表示時間調整
	MOVWF	LPDSP
WATDP2A
	CALL	C1DSP7
	DECFSZ	LPDSP,F
	GOTO	WATDP2A
	RETURN

;******************************************************************************************
;   Function Name : C1DSP7
;   Title         : ４桁の数字を設定し、7Segmentを点灯する
;   Input         : DN0～DN5
;   Output        : 
;******************************************************************************************
C1DSP7
;  (0)全ての桁を初期化する
	CALL	DEC7OFF
;  (1)0桁目の処理
;    1)数字をドットパターンに変換して表示する
	MOVFW	DN0
	CALL	DEC7SEG
	BTFSC	PRIOD,0
	BCF	PORTB,7
	BSF	PORTA,3
;    2)Wait
	CALL	WAT1
	BCF	PORTA,3
;  (2)1桁目の処理
;    1)数字をドットパターンに変換して表示する
	MOVFW	DN1
	CALL	DEC7SEG
	BTFSC	PRIOD,1
	BCF	PORTB,7
	BSF	PORTA,4
;    2)Wait
	CALL	WAT1
	BCF	PORTA,4
;  (3)2桁目の処理
;    1)数字をドットパターンに変換して表示する
	MOVFW	DN2
	CALL	DEC7SEG
	BTFSC	PRIOD,2
	BCF	PORTB,7
	BSF	PORTA,6
;    2)Wait
	CALL	WAT1
	BCF	PORTA,6
;  (4)3桁目の処理
;    1)数字をドットパターンに変換して表示する
	MOVFW	DN3
	CALL	DEC7SEG
	BTFSC	PRIOD,3
	BCF	PORTB,7
	BSF	PORTA,7
;    2)Wait
	CALL	WAT1
	BCF	PORTA,7

	RETURN

;******************************************************************************************
;   Function Name : CNVHC
;   Title         : カウンタ値を１０進変数に代入
;   Input         : TIMCNT
;   Output        : COU0～COU3
;******************************************************************************************
CNVHC
;    1.カウンタ変数の初期化
	CALL	INTCOU
;    2.代入
;     (1)カウンタ値がゼロなら抜ける
	MOVFW	TIMCNT
	XORLW	H'00'
	BTFSC	STATUS,Z
	RETURN
;     (2)変換
	MOVFW	TIMCNT
	MOVWF	LPCNV
CNVHC1
	CALL	CNTDEC
	DECFSZ	LPCNV,F
	GOTO	CNVHC1
	RETURN
;******************************************************************************************
;   Function Name : DEC7OFF
;   Title         : 7セグメント表示の全桁を初期化
;   Input         : 
;   Output        : 
;******************************************************************************************
DEC7OFF
	BCF	PORTA,3
	BCF	PORTA,4
	BCF	PORTA,6
	BCF	PORTA,7
	RETURN
;******************************************************************************************
;   Function Name : INTCOU
;   Title         : カウンター変数を初期化
;   Input         : 
;   Output        : COU0～COU3
;******************************************************************************************
INTCOU
	CLRF	COU0
	CLRF	COU1
	CLRF	COU2
	CLRF	COU3
	RETURN

;******************************************************************************************
;   Function Name : ERRCOU
;   Title         : エラーメッセージ１をセット
;   Input         : 
;   Output        : COU0～COU3
;******************************************************************************************
ERRCOU
	MOVLW	H'0E'	;E
	MOVWF	COU3
	MOVLW	H'1B'	;r
	MOVWF	COU2
	MOVLW	H'1B'	;r
	MOVWF	COU1
	MOVLW	H'01'	;1
	MOVWF	COU0
	CLRF	PRIOD	
	RETURN

;******************************************************************************************
;   Function Name : SETHEX
;   Title         : 16進カウンター変数の７セグメント変数設定
;   Input         : COU0 - COU3
;   Output        :
;******************************************************************************************
SETHEX
	MOVFW	COU0
	MOVWF	DN0
	MOVFW	COU1
	MOVWF	DN1
	MOVFW	COU2
	MOVWF	DN2
	MOVFW	COU3
	MOVWF	DN3
	RETURN
;******************************************************************************************
;   Function Name : CNTDEC
;   Title         : 10進(4桁)アップカウンタ
;   Input         : COU0,COU1,COU2,COU3
;   Output        : COU0,COU1,COU2,COU3
;******************************************************************************************
CNTDEC
	MOVLW	H'01'
	ADDWF	COU0,F	; 0桁目10進カウンタ(0aで桁上げ)
	MOVFW	COU0
	XORLW	H'0A'
	BTFSS	STATUS,Z
	RETLW	H'00'
;
	CLRF	COU0
	MOVLW	H'01'
	ADDWF	COU1,F	; 1桁目10進カウンタ(0aで桁上げ)
	MOVFW	COU1
	XORLW	H'0A'
	BTFSS	STATUS,Z
	RETLW	H'00'
;
	CLRF	COU1
	MOVLW	H'01'
	ADDWF	COU2,F	; 2桁目10進カウンタ(0aで桁上げ)
	MOVFW	COU2
	XORLW	H'0A'
	BTFSS	STATUS,Z
	RETLW	H'00'
;
	CLRF	COU2
	MOVLW	H'01'
	ADDWF	COU3,F	; 3桁目10進カウンタ(0aで桁上げ)
	MOVFW	COU3
	XORLW	H'0A'
	BTFSS	STATUS,Z
	RETLW	H'00'
;
	CLRF	COU0
	CLRF	COU1
	CLRF	COU2
	CLRF	COU3

	RETLW	H'01'


;******************************************************************************************
;   Function Name : WAT1
;   Title         : タイマー関数(7 Segment表示機の桁間WAIT)
;   Input         : 
;   Output        : 
;******************************************************************************************
WAT1
	MOVLW	H'FF'
	MOVWF	LPWT1B
WAT1B
	MOVLW	H'FF'
	MOVWF	LPWAT1
WAT1A
	DECFSZ	LPWAT1,F
	GOTO	WAT1A
;	DECFSZ	LPWT1B,F
;	GOTO	WAT1B

	RETURN
;
;******************************************************************************************
;   Function Name : WAT2
;   Title         : タイマー関数(超音波センサーの40KHz作成用)
;   Input         : 
;   Output        : 
;   Description   : OSC:8MHz用  8MHz/4 =(100)=> 40KHz/2 - (10) => 15
;******************************************************************************************
WAT2
;	MOVLW	H'FF'		;1
;	MOVWF	LPWT2B		;1
;WAT2B
	MOVLW	H'05'		;1
	MOVWF	LPWAT2		;1
WAT2A
	DECFSZ	LPWAT2,F	;1(2)
	GOTO	WAT2A		;2
;	DECFSZ	LPWT2B,F	;1(2)
;	GOTO	WAT2B		;2
	NOP			;1
	NOP			;1
	RETURN			;2

;
;******************************************************************************************
;   Function Name : WAT3
;   Title         : タイマー関数(超音波センサーの時間・距離変換用)
;   Input         : 
;   Output        : 
;   Description   : OSC:8MHz用  
;      1.音速 330[m/Sec]、1カウント0.01[m] ※往復0.02[m]　　とする時のＴ：反射時間、F：周波数は
;         T = 0.2 / 330 = 0.000,0606[Sec]
;         F = 1 / 0.000,0606 = 16,502[Hz]
;      2.OSC:8MHzの時のTのS：ステップ数は
;         S = 8,000,000 / 4 / 16,502 = 121[Step]     ; 14 + 107
;******************************************************************************************
WAT3
	CLRF	STAT		;1
;	MOVLW	H'0F'		;1
;	MOVWF	LPWT3B		;1
WAT3B
	MOVLW	H'0A'		;1
	MOVWF	LPWAT3		;1
WAT3A
	NOP			;1
	NOP			;1
	NOP			;1
	NOP			;1
	NOP			;1
	NOP			;1
	BTFSC	PORTA,1		;1(2)
	GOTO	WAT3EN		;2
	DECFSZ	LPWAT3,F	;1(2)
	GOTO	WAT3A		;2
;	DECFSZ	LPWT3B,F	;1(2)
;	GOTO	WAT3B		;2
	NOP			;1
	NOP			;1
	RETURN			;2
WAT3EN
	MOVLW	H'FF'		
	MOVWF	STAT
	RETURN

	END
