;******************************************************************************************
;  12F683(または12C509A)を使った2桁電子サイコロのサンプルプログラム
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H17.07.10
;   History      :
;******************************************************************************************
;  (1)Description
;    サンプルボードの仕様（２桁電子サイコロ）
;      P0～P5
;         (P1)　      (P2)　　　
;         (P5)  (P0)  (P5)
;         (P2)        (P1) 
;      P4:表示桁切り替え 
;      P3:SW入力
;******************************************************************************************
#DEFINE	PI_DT	H'3F'	; デモ用のダイナミック表示回数
#DEFINE	PI_DT2	H'10'	; デモ用のダイナミック表示回数
#DEFINE	PI_RLT	H'3F'	; L,Rのそれぞれの表示時間（時間ループ回数）
#DEFINE	PI_ANS	H'3F'	; 結果を表示(1桁)
#DEFINE	PI_ANS2	H'3F'	; 結果を表示(10桁)
#DEFINE	PI_ANS3	H'03'	; 結果を表示(100桁)
#DEFINE	PI_LPT	H'09'	; サイコロをまわす回数
;====================== 以下はPIC12F683用の記述 ======================
	LIST	P=PIC12F683,ST=OFF,R=DEC
	INCLUDE	"P12F683.inc"	;標準ヘッダ定義ファイル
	__CONFIG _MCLRE_OFF & _INTRC_OSC_NOCLKOUT & _WDT_OFF
IOCNT1	EQU	20H
IOCNT2	EQU	21H
IOCNTW	EQU	22H
LPCNT	EQU	23H
IOBUF	EQU	24H
RLCNT	EQU	25H
WATCNT	EQU	26H
MAINWT	EQU	27H
MAINWT2	EQU	28H
MAINWT3	EQU	29H
OCTIN	EQU	2AH
DEMOLP	EQU	2BH
DEMOL2	EQU	2CH
DEMOL3	EQU	2DH
	ORG	0
	GOTO	START
	ORG	4
	GOTO	START
START
	ORG	8
	BCF	STATUS,RP0
	MOVLW	07H		; BANK0でデジタルIO設定
	MOVWF	CMCON0		; BANK0でデジタルIO設定
	CLRF	GPIO		; BANK0でポート初期化
	BSF	STATUS,RP0
	CLRF	ANSEL		; BANK1でデジタルIO初期化
	MOVLW	B'001000'	; BANK1でPORT設定
	MOVWF	TRISIO		; BANK1でPORT設定
	BCF	STATUS,RP0
;
;
;====================== 以下はPIC12C509A用の記述 ======================
;	LIST	P=PIC12C509A,ST=OFF,R=DEC
;	INCLUDE	"P12C509A.inc"	
;	__CONFIG _MCLRE_OFF & _IntRC_OSC & _WDT_OFF
;IOCNT1	EQU	07H
;IOCNT2	EQU	08H
;IOCNTW	EQU	09H
;LPCNT	EQU	0AH
;IOBUF	EQU	0BH
;RLCNT	EQU	0CH
;WATCNT	EQU	0DH
;MAINWT	EQU	0EH
;MAINWT2	EQU	0FH
;MAINWT3	EQU	10H
;OCTIN	EQU	11H
;DEMOLP	EQU	12H
;DEMOL2	EQU	13H
;DEMOL3	EQU	14H
;	ORG	0
;	MOVLW	B'001000'
;	OPTION
;	MOVLW	B'001000'
;	TRIS	GPIO
;=====================================================================
; ========================
;  0.初期設定
; ========================
MAIN0
	MOVLW	H'00'
	MOVWF	IOCNT1
	MOVWF	IOCNT2
; ========================
;  1.スイッチが押される前
; ========================
MAIN1
; (1)Count1を６進でカウントアップ
	MOVFW	IOCNT1
	MOVWF	OCTIN
	CALL	CNTOCT
	MOVFW	OCTIN
	MOVWF	IOCNTW	; (2)でIOCNT1を使うため退避
;
; (2)1を表示	
	MOVLW	H'00'
	MOVWF	IOCNT1
	CALL	DSP1
;
; (3)(1)で退避したIOCNT1を戻す	
	MOVFW	IOCNTW
	MOVWF	IOCNT1
;
; (4)ボタンが押されていないなら、MAIN1ループを繰り返す	
	BTFSS	GPIO,3
	GOTO	MAIN1
; ========================
;  2.スイッチが押されている間
; ========================
MAIN2
; (1)Count2を６進でカウントアップ
	MOVFW	IOCNT2
	MOVWF	OCTIN
	CALL	CNTOCT
	MOVFW	OCTIN
	MOVWF	IOCNTW	; (2)でIOCNT2を使うため退避
;
; (2)1を表示	
	MOVLW	H'00'
	MOVWF	IOCNT2
	CALL	DSP2
;
; (3)(1)で退避したIOCNT2を戻す	
	MOVFW	IOCNTW
	MOVWF	IOCNT2
;
; (4)ボタンが押されているなら、MAIN2ループを繰り返す	
	BTFSC	GPIO,3
	GOTO	MAIN2
; ========================
;  3.スイッチが離された時の動作
; ========================
MAIN3
	MOVLW	PI_LPT
	MOVWF	LPCNT
D30
; (1)サイコロをまわす
;  a)表示
	MOVLW	PI_DT2
	MOVWF	DEMOL2
D31
	MOVLW	PI_DT
	MOVWF	DEMOLP
D32
	CALL	DSP1
	CALL	TIMRL
	CALL	DSP2
	CALL	TIMRL
	DECFSZ	DEMOLP,F
	GOTO	D32
	DECFSZ	DEMOL2,F
	GOTO	D31
;  b)IOCNT1をカウントアップ
	MOVFW	IOCNT1
	MOVWF	OCTIN
	CALL	CNTOCT
	MOVFW	OCTIN
	MOVWF	IOCNT1
;  c)IOCNT2をカウントダウン
	MOVFW	IOCNT2
	MOVWF	OCTIN
	CALL	DCNTOCT
	MOVFW	OCTIN
	MOVWF	IOCNT2
;  d)サイコロをまわす
	DECFSZ	LPCNT,F
	GOTO	D30
	
; (2)結果を表示する
MAIN4
	MOVLW	PI_ANS3
	MOVWF	MAINWT3
D40
	MOVLW	PI_ANS2
	MOVWF	MAINWT2
D41
	MOVLW	PI_ANS
	MOVWF	MAINWT
D42
	CALL	DSP1
	CALL	TIMRL
	CALL	DSP2
	CALL	TIMRL
;
	DECFSZ	MAINWT,F
	GOTO	D42
	DECFSZ	MAINWT2,F
	GOTO	D41
	DECFSZ	MAINWT3,F
	GOTO	D40
;
	GOTO	MAIN1

;*******************************************************************************************
;   関数名    : DCNTOCT　　　
;   機能      : ６進ダウンカウンタ
;   引数      :
;*******************************************************************************************
DCNTOCT
	MOVFW	OCTIN
	XORLW	H'00'
	BTFSC	STATUS,Z
	GOTO	DCNTO1
	DECF	OCTIN,F
	RETLW	0
DCNTO1
	MOVLW	H'05'
	MOVWF	OCTIN
	RETLW	0

;*******************************************************************************************
;   関数名    : CNTOCT　　　
;   機能      : ６進アップカウンタ
;   引数      :
;*******************************************************************************************
CNTOCT
	MOVLW	H'01'
	ADDWF	OCTIN,F
	MOVLW	H'06'
	SUBWF	OCTIN,W	
	BTFSS	STATUS,Z
	RETLW	0
	CLRF	OCTIN
	RETLW	0

;*******************************************************************************************
;   関数名    : WATDSP　　　
;   機能      : 表示しながら待つ
;   引数      :
;*******************************************************************************************
WATDSP
;	MOVLW	H'3F'
	MOVLW	H'01'
	MOVWF	WATCNT
WATDSP1
;	CALL	DSPALL

	CALL	DSP1
	CALL	TIMRL
	CALL	DSP2
	CALL	TIMRL
;
	DECFSZ	WATCNT,F
	GOTO	WATDSP1
	RETLW	0

;*******************************************************************************************
;   関数名    : TIMRL　　
;   機能      : 右左ダイナミック表示用間隔タイマー
;   引数      :
;*******************************************************************************************
TIMRL
	MOVLW	PI_RLT
	MOVWF	RLCNT
TIMRL1	DECFSZ	RLCNT,F
	GOTO	TIMRL1
	RETLW	0

;*******************************************************************************************
;   関数名    : DSP1　
;   機能      : 右LED表示
;   引数      :
;*******************************************************************************************
DSP1
	MOVFW	IOCNT1
	CALL	TBL1
	MOVWF	GPIO
	RETLW	0
TBL1
	ADDWF	PCL,F
	RETLW	B'000001'	;1(0)  
	RETLW	B'000010'	;2(1)
	RETLW	B'000011'	;3(2)
	RETLW	B'000110'	;4(3)
	RETLW	B'000111'	;5(4)
	RETLW	B'100110'	;6(5)
	RETLW	B'100111'	;ALL(6)
	RETLW	B'000000'	;DEL(7)

;*******************************************************************************************
;   関数名    : DSP2　
;   機能      : 左LED表示
;   引数      :
;*******************************************************************************************
DSP2
	MOVFW	IOCNT2
	CALL	TBL2
	MOVWF	GPIO
	RETLW	0
TBL2
	ADDWF	PCL,F
	RETLW	B'110110'	;1(0)  
	RETLW	B'110101'	;2(1)
	RETLW	B'110100'	;3(2)
	RETLW	B'110001'	;4(3)
	RETLW	B'110000'	;5(4)
	RETLW	B'010001'	;6(5)
	RETLW	B'010000'	;ALL(6)
	RETLW	B'110111'	;DEL(7)

	END
