;******************************************************************************************
;  4桁カウンタサンプル(周波数カウンタ)
;   Project      :
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H18.05.01
;   History      :
;******************************************************************************************
;  (0)Display
;     7 Segment Diode ( Anode common type )
;     内部オシレータを使用する(8MHz)
;  (1)Descript I/O 
;      B0～B7      : 7 Segment diode (a～h) 
;      A0          : Network comunication (Input)
;      A1          : Network comunication (Output)
;      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	2CH
CNT2	EQU	2DH
LP1	EQU	2EH
LP2	EQU	2FH
LPWAT1	EQU	30H
LPWT1B	EQU	31H
PRIOD	EQU	32H
IODAT	EQU	33H
RECWAT	EQU	34H
RECDAT	EQU	35H
RECLP	EQU	36H
TMPDAT	EQU	37H
TMPDAT1	EQU	38H
TCNT	EQU	39H
TCNT1	EQU	3AH

	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'00100101'
	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を選択する
	BSF	PORTA,1	; 受信準備中のステータスにする
; デモ表示
MAIN
	CLRF	PRIOD	; 小数点を表示しない
;	CALL	DEMO0	; 電源投入時に7-Segment Displayが正常に点灯するか確認する
;	CALL	DEMO1	; デモを表示する
;	CALL	INTCOU	; 変数初期化
	MOVLW	H'41'
	MOVWF	DN0
	MOVWF	DN1
	MOVWF	DN2
	MOVWF	DN3
MADIN
; 7セグメントを表示する
	CALL	WATDSP05
;
; データがあれば受信する 
	CALL	SERIDAT
;
	GOTO	MADIN

;******************************************************************************************
;   Function Name : DEC7SEG
;   Title         : DECデコーダと7セグメント表示(アノードコモン用)
;   Input         : W:ワーキングレジスタ
;   Output        : なし
;******************************************************************************************
DEC7SEG
;	MOVFW	INDAT
	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 : SERIDAT
;   Title         : データ連動(データがあれば受信する)
;   Input         : なし
;******************************************************************************************
SERIDAT
; 1.データフラグをチェックし、連動データがないなら抜ける
	BTFSC 	 PORTA,0
	RETURN	
; 2.確認OKシグナルを送る(1=>0)
	BCF	PORTA,1
; 3.データ更新
	CALL	REC
	MOVWF	DN3
;
	CALL	REC
	MOVWF	DN2
;
	CALL	REC
	MOVWF	DN1
;
	CALL	REC
	MOVWF	DN0
;
; 4.確認OKシグナルを戻す(0=>1)
	BSF	PORTA,1
;
	RETURN

;******************************************************************************************
;   Function Name : DEMO0
;   Title         : 7-Segment-LEDの点灯状態確認用関数
;   Input         : なし
;******************************************************************************************
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         : なし
;******************************************************************************************
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
;******************************************************************************************
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
;******************************************************************************************
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
;******************************************************************************************
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 : DEC7OFF
;   Title         : 7セグメント表示の全桁を初期化
;   Input         : 
;   Output        : 
;******************************************************************************************
DEC7OFF
	BCF	PORTA,3
	BCF	PORTA,4
	BCF	PORTA,6
	BCF	PORTA,7
	RETURN

;******************************************************************************************
;   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 : REC
;   Title         : ＲＳ２３２受信サブルーチン(PORTA 0)
;                   9600BPS OSC;8.000MHz仕様
;   Input         : 
;   Output        :
;******************************************************************************************
REC
; (0)変数初期化
	CLRF	IODAT
REC0
; (1)受信データを待つ
	BTFSC	PORTA,0
	GOTO	REC0
; (2)1/2ビット分待つ
	MOVLW	H'21'	; 9600BPS,OSC;8MHz
	MOVWF   RECWAT
REC1	DECFSZ	RECWAT,F
	GOTO	REC1
; (3)データ受信(8ビット分)
	MOVLW	8
	MOVWF	RECLP
	NOP
REC2	MOVLW	H'42'	; 9600BPS,OSC;8MHz
	MOVWF	RECWAT
REC3	DECFSZ	RECWAT,F
	GOTO	REC3
	NOP
	BTFSS	PORTA,0	; ビットデータが0の時, 0を立てる
	BCF	STATUS,C
	BTFSC	PORTA,0	; ビットデータが1の時, 1を立てる
	BSF	STATUS,C
	RRF	IODAT,F	; 変数内でビットをシフトする
	DECFSZ	RECLP,F
	GOTO	REC2
	NOP
	NOP
;
	CALL	TIMER
	MOVFW	IODAT	
	RETURN
;
;******************************************************************************************
;   Function Name : TIMER
;   Title         : タイマー(100回ループ)
;   Input         : 
;   Output        :
;******************************************************************************************
TIMER
	MOVLW	H'1A'
	MOVWF	TCNT1
TIMER2
	MOVLW	H'64'
	MOVWF	TCNT
TIMER1
	DECFSZ	TCNT,F
	GOTO	TIMER1 
	DECFSZ	TCNT1,F
	GOTO	TIMER2 
	RETURN
;
	END
