;******************************************************************************************
;  シリアル6桁7セグメントLEDボード用 7セグメント表示サンプル
;    ※このプログラムは、12F683用とペアで使用する
;     (1)シリアル入力機能
;     (2)Sモード
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H17.08.01
;   History      :
;******************************************************************************************
;  (0)Display(アノードコモン用)
;     6文字 7Segment Anode-common LED Board
;  (1)Descript I/O 
;      B0～B7 : 7 Segment diode (a～h)
;      A0,A1,A2,A3,A6,A7 : 7 Segment diode (1～6)
;      A4  : Output(TX)
;      A5  : Input (RS)
;
;******************************************************************************************

	LIST	P=PIC16F88,ST=OFF,R=DEC
	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 _CONFIG1 , _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _HS_OSC
	__CONFIG _CONFIG2 , _IESO_OFF & _FCMEN_OFF
;
IODAT	EQU	20H
RECLP	EQU	21H
RECWAT	EQU	22H
DN0	EQU	23H
DN1	EQU	24H
DN2	EQU	25H
DN3	EQU	26H
DN4	EQU	27H
DN5	EQU	28H
LPDSPA	EQU	2AH
LPDSPB	EQU	2BH
LPWAT1A	EQU	2CH
LPWAT1B	EQU	2DH
UPDTMP	EQU	2EH
SCDN0	EQU	2FH
SCDN1	EQU	30H
SCDN2	EQU	31H
SCDN3	EQU	32H
SCDN4	EQU	33H
SCDN5	EQU	34H
SCCNT	EQU	35H
SERITMP	EQU	36H

	ORG	0
	GOTO	START
	ORG	4
	GOTO	START
START
; Bank0での設定
	BANKSEL	PORTA	; PortAのBankを選択する
	MOVLW	B'11001111'
	MOVWF	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'00100000'
	MOVWF	TRISA	; PortAのI/O設定(Bank1)
	MOVLW	B'00000000'
	MOVWF	TRISB	; PortBのI/O設定(Bank1)
; Bank0に戻す
	BANKSEL	PORTA	; PortAのBankを選択する
;
	CALL	INITMDN	; 変数初期化
	CALL	DEMO00	; 電源ONでPIC12F683の準備ができるまでデモで時間を潰す
	BSF	PORTA,4	
	CLRF	SCCNT

	CALL	INITDN	; DN変数を初期化（無表示）
MAIN
	CALL	SERIDAT
	CALL	WATDSP2
	GOTO	MAIN
;******************************************************************************************
;   Function Name : DEC7SEG
;   Disctiption   : DECデコーダと7セグメント表示
;   Input         : W:ワーキングレジスタ
;   Output        : なし
;******************************************************************************************
DEC7SEG
	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'10000000'		; G(10)
	RETLW	B'10000000'		; H(11)
	RETLW	B'10000000'		; I(12)
	RETLW	B'10000000'		; J(13)
	RETLW	B'10000000'		; K(14)
	RETLW	B'10001111'		; L(15)
	RETLW	B'10000000'		; M(16)
	RETLW	B'10000000'		; N(17)
	RETLW	B'10000000'		; O(18)
	RETLW	B'10010010'		; P(19)
	RETLW	B'10000000'		; Q(1A)
	RETLW	B'10110111'		; R(1B)
	RETLW	B'11000001'		; S(1C)
	RETLW	B'10000000'		; T(1D)
	RETLW	B'10001100'		; U(1E)
	RETLW	B'10000000'		; V(1F)
	RETLW	B'10000000'		; W(20)
	RETLW	B'10000000'		; X(21)
	RETLW	B'11010100'		; Y(22)
	RETLW	B'10000000'		; Z(23)
	RETLW	B'10000000'		; 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'10000000'		; h(2B)
	RETLW	B'10111111'		; i(2C)
	RETLW	B'10000000'		; j(2D)
	RETLW	B'10000000'		; k(2E)
	RETLW	B'10000000'		; l(2F)
	RETLW	B'10000000'		; m(30)
	RETLW	B'10000000'		; n(31)
	RETLW	B'10000000'		; o(32)
	RETLW	B'10010010'		; p(33)
	RETLW	B'10000000'		; q(34)
	RETLW	B'10110111'		; r(35)
	RETLW	B'10000000'		; s(36)
	RETLW	B'10000000'		; t(37)
	RETLW	B'10000000'		; u(38)
	RETLW	B'10101101'		; v(39)
	RETLW	B'10000000'		; w(3A)
	RETLW	B'10000000'		; x(3B)
	RETLW	B'10000000'		; y(3C)
	RETLW	B'10000000'		; z(3D)
	RETLW	B'11111111'		;  (3E)
	RETLW	B'00000000'		; -(3F)
	RETLW	B'00000000'		; _(40)

;******************************************************************************************
;   Function Name : SERIDAT
;   Disctiption   : データ連動
;                   連動データがあればデータ連動を行なう
;   Input         : なし
;******************************************************************************************
SERIDAT
; 1.データフラグをチェックし、連動データがないなら抜ける
	BTFSC 	 PORTA,5
	RETURN	
; 2.確認OKシグナルを送る(1=>0)
	BCF	PORTA,4
; 3.受信モードにして相手の送信を待つ 
	CALL	REC
; 4.確認OKシグナルを戻す(0=>1)
	BSF	PORTA,4
; 5.データ移動
	MOVFW	IODAT
	MOVWF	SERITMP
; 6.データ文字によるフラグ判定
	XORLW	'S'
	BTFSS	STATUS,Z
	GOTO	SERIDAT1
	MOVLW	H'01'
	MOVWF	SCCNT
	RETURN
SERIDAT1
; 5.データ更新
	MOVFW	SCCNT
	XORLW	H'00'
	BTFSS	STATUS,Z
	GOTO	SERIDAT2A
	MOVFW	SERITMP
	CALL	UPDDAT0
	RETURN
SERIDAT2A
	MOVFW	SCCNT	
	XORLW	H'06'
	BTFSC	STATUS,Z
	GOTO	SERIDAT2B
	MOVFW	SERITMP
	CALL	UPDDAT1
	MOVLW	H'01'
	ADDWF	SCCNT,F
	RETURN
SERIDAT2B
	MOVFW	SERITMP
	CALL	UPDDAT1
	MOVFW	SERITMP
	CALL	UPDDAT2
	CLRF	SCCNT
	RETURN
;******************************************************************************************
;   Function Name : UPDDAT0
;   Disctiption   : データ更新
;                   データがある都度、スクロールさせる更新パターン
;                   キャラクタコードを数字に変換する 
;   Input         : Wレジスタ
;******************************************************************************************
UPDDAT0
	MOVWF	UPDTMP
	XORLW	'B'
	BTFSS	STATUS,Z
	GOTO	UPDDAT0A
	MOVLW	H'3E'
	MOVWF	UPDTMP
	GOTO	UPDDAT0B
UPDDAT0A
	MOVFW	UPDTMP
	MOVLW	B'00001111'
	ANDWF	UPDTMP,F
	GOTO	UPDDAT0B
UPDDAT0B
	MOVFW	DN4
	MOVWF	DN5
;
	MOVFW	DN3
	MOVWF	DN4
;
	MOVFW	DN2
	MOVWF	DN3
;
	MOVFW	DN1
	MOVWF	DN2
;
	MOVFW	DN0
	MOVWF	DN1
;
	MOVFW	UPDTMP
	MOVWF	DN0
;
	RETURN
;******************************************************************************************
;   Function Name : UPDDAT1
;   Disctiption   : データ更新
;                   Sデータがあった場合、更新まで隠すパターン
;                   キャラクタコードを数字に変換する 
;   Input         : Wレジスタ
;******************************************************************************************
UPDDAT1
	MOVWF	UPDTMP
	XORLW	'B'
	BTFSS	STATUS,Z
	GOTO	UPDDAT1A
	MOVLW	H'3E'
	MOVWF	UPDTMP
	GOTO	UPDDAT1B
UPDDAT1A
	MOVFW	UPDTMP
	MOVLW	B'00001111'
	ANDWF	UPDTMP,F
	GOTO	UPDDAT1B
UPDDAT1B
;
	MOVFW	SCDN4
	MOVWF	SCDN5
;
	MOVFW	SCDN3
	MOVWF	SCDN4
;
	MOVFW	SCDN2
	MOVWF	SCDN3
;
	MOVFW	SCDN1
	MOVWF	SCDN2
;
	MOVFW	SCDN0
	MOVWF	SCDN1
;
	MOVFW	UPDTMP
	MOVWF	SCDN0
;
	RETURN
;******************************************************************************************
;   Function Name : UPDDAT2
;   Disctiption   : データ更新
;                   Sデータで隠したデータをセットする
;                   キャラクタコードを数字に変換する 
;   Input         : Wレジスタ
;******************************************************************************************
UPDDAT2
;
	MOVWF	UPDTMP
	XORLW	'B'
	BTFSS	STATUS,Z
	GOTO	UPDDAT2A
	MOVLW	H'3E'
	MOVWF	UPDTMP
	GOTO	UPDDAT2B
UPDDAT2A
	MOVFW	UPDTMP
	MOVLW	B'00001111'
	ANDWF	UPDTMP,F
	GOTO	UPDDAT2B
UPDDAT2B
;
	MOVFW	SCDN5
	MOVWF	DN5
;
	MOVFW	SCDN4
	MOVWF	DN4
;
	MOVFW	SCDN3
	MOVWF	DN3
;
	MOVFW	SCDN2
	MOVWF	DN2
;
	MOVFW	SCDN1
	MOVWF	DN1
;
	MOVFW	SCDN0
	MOVWF	DN0
;
	RETURN
;******************************************************************************************
;   Function Name : INITMDN
;   Disctiption   : SCDN,DN変数の初期化
;   Input         : なし
;******************************************************************************************
INITMDN
	MOVLW	H'3E'
	MOVWF	DN0
	MOVLW	H'3E'
	MOVWF	DN1
	MOVLW	H'3E'
	MOVWF	DN2
	MOVLW	H'3E'
	MOVWF	DN3
	MOVLW	H'3E'
	MOVWF	DN4
	MOVLW	H'3E'
	MOVWF	DN5
;
	MOVLW	H'3E'
	MOVWF	SCDN0
	MOVLW	H'3E'
	MOVWF	SCDN1
	MOVLW	H'3E'
	MOVWF	SCDN2
	MOVLW	H'3E'
	MOVWF	SCDN3
	MOVLW	H'3E'
	MOVWF	SCDN4
	MOVLW	H'3E'
	MOVWF	SCDN5
	RETURN
;******************************************************************************************
;   Function Name : DEMO10
;   Disctiption   : 電源投入時のデモ(約10秒)
;   Input         : なし
;******************************************************************************************
DEMO10
; PicCPU 表示
	MOVLW	H'27'	;d
	MOVWF	DN5
	MOVLW	H'2C'	;i
	MOVWF	DN4
	MOVLW	H'1C'	;S
	MOVWF	DN3
	MOVLW	H'19'	;p
	MOVWF	DN2
	MOVLW	H'15'	;L
	MOVWF	DN1
	MOVLW	H'22'	;Y
	MOVWF	DN0
	CALL	WATDSP
	RETURN
;******************************************************************************************
;   Function Name : DEMO00
;   Disctiption   : 電源投入時のデモ(約10秒)
;   Input         : なし
;******************************************************************************************
DEMO00
; PicCPU 表示
	MOVLW	H'19'	;P
	MOVWF	DN5
	MOVLW	H'2C'	;i
	MOVWF	DN4
	MOVLW	H'26'	;c
	MOVWF	DN3
	MOVLW	H'0C'	;C
	MOVWF	DN2
	MOVLW	H'19'	;P
	MOVWF	DN1
	MOVLW	H'1E'	;U
	MOVWF	DN0
	CALL	WATDSP

; 16F88 表示
	MOVLW	H'3E'	; 
	MOVWF	DN5
	MOVLW	H'01'	;1
	MOVWF	DN4
	MOVLW	H'06'	;6
	MOVWF	DN3
	MOVLW	H'0F'	;F
	MOVWF	DN2
	MOVLW	H'08'	;8
	MOVWF	DN1
	MOVLW	H'08'	;8
	MOVWF	DN0
	CALL	WATDSP
	RETURN

;******************************************************************************************
;   Function Name : WATDSP2
;   Disctiption   : 0.02秒程度、7Segmentを表示する
;   Input         : DN0～DN5
;******************************************************************************************
WATDSP2
	MOVLW	H'0D'	; 表示時間調整
	MOVWF	LPDSPA
WATDSP2A
	CALL	C1DSP7
	DECFSZ	LPDSPA,F
	GOTO	WATDSP2A
	RETURN
;******************************************************************************************
;   Function Name : WATDSP
;   Disctiption   : WAITする（5秒程度、7Segmentを表示する）
;   Input         : DN0～DN5
;******************************************************************************************
WATDSP
	MOVLW	H'0A'	; 5秒程度点灯
	MOVWF	LPDSPB
WATDSPB
	MOVLW	H'CF'	; 表示時間調整
	MOVWF	LPDSPA
WATDSPA
	CALL	C1DSP7
	DECFSZ	LPDSPA,F
	GOTO	WATDSPA
	DECFSZ	LPDSPB,F
	GOTO	WATDSPB
	RETURN

;******************************************************************************************
;   Function Name : C1DSP7
;   Disctiption   : ６桁の数字を設定し、7Segmentを点灯する
;   Input         : DN0～DN5
;   Output        : なし
;******************************************************************************************
C1DSP7
;  (0)全ての桁を初期化する
	CALL	DEC7OFF
;  (1)0桁目の処理
;    1)数字をドットパターンに変換して表示する
	MOVFW	DN0
	CALL	DEC7SEG
	BCF	PORTA,0
;    2)Wait
	CALL	WAT1
	BSF	PORTA,0
;  (2)1桁目の処理
;    1)数字をドットパターンに変換して表示する
	MOVFW	DN1
	CALL	DEC7SEG
	BCF	PORTA,1
;    2)Wait
	CALL	WAT1
	BSF	PORTA,1
;  (3)2桁目の処理
;    1)数字をドットパターンに変換して表示する
	MOVFW	DN2
	CALL	DEC7SEG
	BCF	PORTA,2
;    2)Wait
	CALL	WAT1
	BSF	PORTA,2
;  (4)3桁目の処理
;    1)数字をドットパターンに変換して表示する
	MOVFW	DN3
	CALL	DEC7SEG
	BCF	PORTA,3
;    2)Wait
	CALL	WAT1
	BSF	PORTA,3
;  (5)4桁目の処理
;    1)数字をドットパターンに変換して表示する
	MOVFW	DN4
	CALL	DEC7SEG
	BCF	PORTA,6
;    2)Wait
	CALL	WAT1
	BSF	PORTA,6
;  (6)5桁目の処理
;    1)数字をドットパターンに変換して表示する
	MOVFW	DN5
	CALL	DEC7SEG
	BCF	PORTA,7
;    2)Wait
	CALL	WAT1
	BSF	PORTA,7

	RETURN


;******************************************************************************************
;   Function Name : DEC7OFF
;   Disctiption   : 7セグメント表示の全桁を初期化
;		　　　A0,A2～A4,A6,A7をゼロにする(7 Segment diode の1～6)
;   Input         : なし
;   Output        : なし
;******************************************************************************************
DEC7OFF
	BSF	PORTA,0
	BSF	PORTA,1
	BSF	PORTA,2
	BSF	PORTA,3
	BSF	PORTA,6
	BSF	PORTA,7
	RETURN

;******************************************************************************************
;   Function Name : INITDN
;   Disctiption   : 7セグメント表示変数を初期化
;   Input         : なし
;   Output        : なし
;******************************************************************************************
INITDN
	MOVLW	H'3E'
	MOVWF	DN0
	MOVLW	H'3E'
	MOVWF	DN1
	MOVLW	H'3E'
	MOVWF	DN2
	MOVLW	H'3E'
	MOVWF	DN3
	MOVLW	H'3E'
	MOVWF	DN4
	MOVLW	H'3E'
	MOVWF	DN5
	RETURN
;******************************************************************************************
;   Function Name : WAT1
;   Disctiption   : タイマー関数(7 Segment表示機の桁間WAIT)
;   Input         : なし
;   Output        : なし
;******************************************************************************************
WAT1
	MOVLW	H'FF'
	MOVWF	LPWAT1B
WAT1B
	MOVLW	H'FF'
	MOVWF	LPWAT1A
WAT1A
	DECFSZ	LPWAT1A,F
	GOTO	WAT1A
;	DECFSZ	LPWAT1B,F
;	GOTO	WAT1B

	RETURN

;******************************************************************************************
;   Function Name : REC
;   Disctiption   : ＲＳ２３２Ｃ受信サブルーチン(PORTA 5)
;                   9600BPS OSC;8.000MHz仕様
;   Input         : 
;   Output        :
;******************************************************************************************
; (0)変数初期化
	CLRF	IODAT
; (1)受信データを待つ
REC	BTFSC	PORTA,5
	GOTO	REC
; (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,5	; ビットデータが0の時, 0を立てる
	BCF	STATUS,C
	BTFSC	PORTA,5	; ビットデータが1の時, 1を立てる
	BSF	STATUS,C
	RRF	IODAT,F	; 変数内でビットをシフトする
	DECFSZ	RECLP,F
	GOTO	REC2
	NOP
	NOP
;
	RETURN

	END
