コイン不要機+出玉カウンタ(プログラム編)

 少し仕事が忙しく、遅くなりましたが本体プログラム編です。←言い訳
プログラムソースには注釈を入れわかりやすく解説していますが、後で補足説明をいたします。

;****************************************************
;	Filename:		main.asm						*
;	Programname:	スロットコインレスカウンター					*
;	Version:		Ver 3.2.9						*
;	Assembler:		MPLAB Ver7.50.00.0				*
;****************************************************
	INCLUDE"p16F648a.inc"
	list p=16F648A
	__CONFIG _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF

;******************************プログラム初期設定***************************
;ファイルレジスタの定義
COUNT	EQU		0x20			;ウェイトループ用
COUNT15	EQU		0x21			;ウェイトループ用
MEM_1	EQU		0x22			;ウェイト用レジスタ
MEM_2	EQU		0x23			;カウント0フラグ用
SEG_1	EQU		0x24			;1桁目クレジット
SEG_2	EQU		0x25			;2桁目クレジット
SEG_3	EQU		0x26			;3桁目クレジット
SEG_4	EQU		0x27			;4桁目クレジット
SEG_5	EQU		0x28			;5桁目クレジット
S_FLG	EQU		0x29			;seg表示フラグ
C_SEG_1	EQU		0x2A			;1桁目クレジット設定
C_SEG_2	EQU		0x2B			;2桁目クレジット設定
C_SEG_3	EQU		0x2C			;3桁目クレジット設定
C_SEG_4	EQU		0x2D			;4桁目クレジット設定
C_SEG_5	EQU		0x2E			;5桁目クレジット設定
DE_CNT	EQU		0x2F			;デコードカウンタ
DE_WORK	EQU		0x30			;一時余り格納場所(デコードで使用)
DE_VAL	EQU		0x31			;デコードしたい値(変換後は壊れる)
CREDIT	EQU		0x32			;クレジット
OP_FLG	EQU		0x33			;オプション接続フラグ
MEM_3	EQU		0x34			;長押判定用
CR_MEM	EQU		0x35			;クレジットメモリ

;RAポート割り当て
SENS0	SET		0				;センサー0
SENS1	SET		1				;センサー1
SENS2	SET		2				;センサー2
SENS3	SET		3				;センサー3
HOP_E	SET		4				;ホッパー・イネーブル端子
RST_E	SET		5				;リセット・イネーブル端子
BET_B	SET		6				;ベットボタン入力
SEL_E	SET		7				;セレクタ・イネーブル端子
;RBポート割り当て
DIGIT	SET		4				;桁端子
CRE_SET	SET		5				;クレジット・セット端子
CRE_E	SET		6				;クレジット・イネーブル端子
CRE_UP	SET		7				;クレジット・アップ端子
;
		ORG		0x2124			;ポインタ処理の為0x2100+1桁目のFレジスタ位置
		DE		D'8',D'8',D'8',D'8',D'8'
		ORG		0x2132			;ポインタ処理の為0x2100+CREDITのFレジスタ位置
		DE		D'50'
;
		ORG		0				;リセットベクタ
;
START
;入出力ポートの設定
		CLRF	OP_FLG			;クリア
P_INI	
		MOVLW	B'00000111'		;コンパレータ不使用
		MOVWF	CMCON			;コンパレータI/O設定
        BSF     STATUS,RP0      ;バンク1に切り替え
        MOVLW   B'11110000'		;RA<0-3>出力
        MOVWF   TRISA           ;ポートA方向(入出力)設定
        MOVLW   B'11110000'		;RB<0-3>出力
        MOVWF   TRISB           ;ポートB方向(入出力)設定
        MOVLW   B'10000000'		;オプションレジスタの設定
        MOVWF   OPTION_REG		;タイマ不使用
        BCF     STATUS,RP0      ;バンク0に切り替え
		BTFSC	PORTB,DIGIT		;PORTB<4> → (0)?
		BSF		OP_FLG,0		;OP_FLG → (1)オプション接続有り
        BSF     STATUS,RP0      ;バンク1に切り替え
        MOVLW   B'11100000'		;RB<0-4>出力
        MOVWF   TRISB           ;ポートB方向(入出力)設定
        BCF     STATUS,RP0      ;バンク0に切り替え

;出力ポート初期設定
		CLRF	PORTA			;クリア
		CLRF	PORTB			;クリア

;ファイルレジスタ初期化
F_INI	CLRF	MEM_1			;クリア
		CLRF	MEM_2			;クリア
		MOVLW   B'11111111'		;FF
		MOVWF	C_SEG_4			;4桁目クレジットクリア
		MOVWF	C_SEG_5			;5桁目クレジットクリア
		BSF		PORTA,SENS3		;PORTA<3> → (1)ホッパーセンサー2 オン
		MOVLW  	D'255'			;ms設定
		MOVWF  	COUNT15			;
		CALL	LOOP_15			;ウェイト
		MOVLW	S_FLG			;
		CALL	RD_ADR			;カウントデータ読み込み
		MOVLW	CREDIT			;
		MOVWF	FSR				;FSRセット
		CALL	EE_RE			;クレジットデータ読み込み
		MOVWF	CREDIT			;クレジットデータセット

;******************************プログラム本文***************************
;入力ポートの読み取り
;-------------------------------セレクタ端子----------------------------
SE_E	BTFSS	PORTA,SEL_E		;PORTA<7> → (1)? セレクタ・イネーブル端子
		BTFSC	PORTA,BET_B		;PORTA<6> → (0)? BET入力端子
		GOTO	HP_E			;ホッパー・イネーブルチェックへ
		GOTO	SEL_OUT			;セレクタアウトへ		(65.406mSec)
;-------------------------------ホッパー端子----------------------------
HP_E	BTFSS	PORTA,HOP_E		;PORTA<4> → (1)? ホッパー・イネーブル端子
		GOTO	HOP_OUT			;ホッパーアウトへ		(80.475mSec)
		BTFSS	OP_FLG,0		;OP_FLG<0> → (1)? オプション接続チェック
		GOTO	SE_E			;セレクタイネーブルチェックへ
;----------------------------クレジット入力端子-------------------------
CR_E_H	BTFSC	PORTB,CRE_E		;PORTB<6> → (0)? クレジット・イネーブル端子
		GOTO	CR_SET			;クレジット・セットチェックへ
CR_E_L	BTFSC	PORTB,CRE_E		;PORTB<6> → (0)? クレジット・イネーブル端子
		GOTO	CR_IN			;クレジットインへ
		GOTO	CR_E_L			;クレジット・イネーブルLチェックへ
;----------------------------クレジット設定端子-------------------------
CR_SET	MOVLW  	D'67'			;判定回数設定
		MOVWF  	MEM_3			;
		BTFSS	OP_FLG,1		;クレジット・セット アクティブフラグ → (1)?
		GOTO	CR_ST_L			;
		BTFSS	PORTB,CRE_SET	;PORTB<5> → (1)? クレジット・セット端子
		GOTO	RS_E			;リセット・イネーブルチェックへ
		BCF		OP_FLG,1		;クレジット・セット アクティブフラグクリア
CR_ST_L	BTFSC	PORTB,CRE_SET	;PORTB<5> → (0)? クレジット・セット端子
		GOTO	RS_E			;リセット・イネーブルチェックへ
		MOVLW	S_FLG			;
		CALL	LED_OUT			;LEDアウトへ		(15.084mSec)
		DECFSZ	MEM_3,F			;
		GOTO	CR_ST_L			;クレジット・セットチェックLへ
		BSF		OP_FLG,1		;クレジット・セット アクティブフラグセット
		GOTO	CR_UP			;クレジット・アップへ
;------------------------------リセット検出-----------------------------
RS_E	BTFSS	PORTA,RST_E		;PORTA<5> → (1)? リセット・イネーブル端子
		GOTO	RST_CNT			;リセットコントロールへ
		MOVLW	S_FLG			;
		CALL	LED_OUT			;LEDアウトへ		(15.084mSec)
		GOTO	SE_E			;セレクタイネーブルチェックへ		

;+++++++++++++++++++++++++++++++クレジットアップ++++++++++++++++++++++++++++++
CR_UP	MOVLW  	D'67'			;判定回数設定
		MOVWF  	MEM_3			;
		MOVF	CREDIT,W		;
		MOVWF	DE_VAL			;デコード変数に代入
		MOVLW	S_FLG			;
		CALL	HEXDEC			;デコードへ
		MOVLW	DE_CNT			;
		CALL	LED_OUT			;LEDアウトへ		(15.084mSec)
		BTFSS	OP_FLG,1		;クレジット・セット アクティブフラグ → (1)?
		GOTO	CR_ST_H			;
		BTFSS	PORTB,CRE_SET	;PORTB<5> → (1)? クレジット・セット端子
		GOTO	CR_UP			;クレジット・アップへ
		BCF		OP_FLG,1		;クレジット・セット アクティブフラグクリア
CR_ST_H	BTFSC	PORTB,CRE_SET	;PORTB<5> → (0)? クレジット・セット端子
		GOTO	CR_UP_A			;クレジット・アップチェックへ
		MOVLW	DE_CNT			;
		CALL	LED_OUT			;LEDアウトへ		(15.084mSec)
		DECFSZ	MEM_3,F			;
		GOTO	CR_ST_H			;クレジット・セットチェックへ
		BSF		OP_FLG,1		;クレジット・セット アクティブフラグセット
		GOTO	SE_E			;セレクタイネーブルチェックへ
CR_UP_A	BTFSS	OP_FLG,2		;クレジット・アップ アクティブフラグ → (1)?
		GOTO	CR_UP_L			;
		BTFSS	PORTB,CRE_UP	;PORTB<7> → (1)? クレジット・アップ端子
		GOTO	CR_UP			;クレジット・アップへ
		BCF		OP_FLG,2		;クレジット・アップ アクティブフラグクリア
CR_UP_L	BTFSC	PORTB,CRE_UP	;PORTB<7> → (0)? クレジット・アップ端子
		GOTO	CR_RST			;クレジット・リセットチェックへ
		INCF	CREDIT,F		;クレジット・インクリメント
		BSF		OP_FLG,2		;クレジット・アップ アクティブフラグセット
		GOTO	CR_WR			;クレジット書き込み
CR_RST	BTFSC	PORTA,RST_E		;PORTA<5> → (0)? リセット・イネーブル端子
		GOTO	CR_UP			;クレジット・アップチェックへ
		CLRF	CREDIT			;クリア
CR_WR	BTFSC	STATUS,Z		;if CREDIT=0
		INCF	CREDIT,F		;then CREDIT++
		MOVLW	CREDIT			;
		MOVWF	FSR				;FSRセット
		CALL	EE_WR			;EEPROM書き込み	(4.018mSec)
		GOTO	CR_UP			;クレジット・アップチェックへ

;#############################サブルーチン郡############################
;セレクタ・ポート出力
SEL_OUT	BTFSC	OP_FLG,0		;OP_FLG<0> → (0)?
		CALL	D_COUNT			;カウントダウン		(00.032Sec)
		MOVLW	S_FLG			;
		BTFSC	OP_FLG,0		;OP_FLG<0> → (0)?
		CALL	WR_ADR			;EEPROM書き込み	(20.111mSec)
		MOVF	MEM_2,F			;
		BTFSS	STATUS,Z		;値の0判断
		GOTO	SE_E			;
		BSF		PORTA,SENS0		;PORTA<0> → (1)セレクタセンサー1 オン
		MOVLW	S_FLG			;
		CALL	LED_OUT			;LEDアウトへ		(15.084mSec)
		BSF		PORTA,SENS1		;PORTA<1> → (1)セレクタセンサー2 オン
		MOVLW	S_FLG			;
		CALL	LED_OUT			;LEDアウトへ		(15.084mSec)
		BCF		PORTA,SENS0		;PORTA<0> → (0)セレクタセンサー1 オフ
		MOVLW	S_FLG			;
		CALL	LED_OUT			;LEDアウトへ		(15.084mSec)
		BCF		PORTA,SENS1		;PORTA<1> → (0)セレクタセンサー2 オフ
		MOVLW	S_FLG			;
		CALL	LED_OUT			;LEDアウトへ		(15.084mSec)
		GOTO	SE_E			;セレクタイネーブルチェックへ

;ホッパー・ポート出力
HOP_OUT	BTFSC	OP_FLG,0		;OP_FLG<0> → (0)?
		CALL	U_COUNT			;カウントアップ		(00.032mSec)
		MOVLW	S_FLG			;
		BTFSC	OP_FLG,0		;OP_FLG<0> → (0)?
		CALL	WR_ADR			;EEPROM書き込み	(20.111mSec)
		BSF		PORTA,SENS2		;PORTA<2> → (1)ホッパーセンサー1 オン
		MOVLW	S_FLG			;
		CALL	LED_OUT			;LEDアウトへ		(15.084mSec)
		BCF		PORTA,SENS3		;PORTA<3> → (0)ホッパーセンサー2 オフ
		MOVLW	S_FLG			;
		CALL	LED_OUT			;LEDアウトへ		(15.084mSec)
		BSF		PORTA,SENS3		;PORTA<3> → (1)ホッパーセンサー2 オン
		BCF		PORTA,SENS2		;PORTA<2> → (0)ホッパーセンサー1 オフ
		MOVLW	S_FLG			;
		CALL	LED_OUT			;LEDアウトへ		(15.084mSec)
		CALL	WAIT_15			;ウェイト15ms
		GOTO	SE_E			;セレクタイネーブルチェックへ

;クレジットイン
CR_IN	MOVF	CREDIT,W		;クレジット設定値読み出し
		MOVWF	CR_MEM			;
CR_LOOP	CALL	U_COUNT			;
		DECFSZ	CR_MEM,F		;
		GOTO	CR_LOOP			;
		MOVLW	S_FLG			;
		CALL	LED_OUT			;LEDアウトへ		(15.084mSec)
		MOVLW	S_FLG			;
		CALL	WR_ADR			;EEPROM書き込み	(20.111mSec)
		GOTO	SE_E			;リターン

;リセットコントロール
RST_CNT	CLRF	SEG_1			;クリア
		CLRF	SEG_2			;クリア
		CLRF	SEG_3			;クリア
		CLRF	SEG_4			;クリア
		CLRF	SEG_5			;クリア
		MOVLW	S_FLG			;
		CALL	WR_ADR			;EEPROM書き込み	(20.111mSec)
		GOTO	SE_E			;リターン

;LED出力						(15.082mSec)
LED_OUT	MOVWF	FSR				;FSRセット
		MOVLW	B'00001111'		;
		MOVWF	S_FLG			;フラグセット
		CALL	SEG_OUT			;5桁目
		CALL	SEG_OUT			;4桁目
		CALL	SEG_OUT			;3桁目
		CALL	SEG_OUT			;2桁目
		CLRF	S_FLG			;フラグリセット
		CALL	SEG_OUT			;1桁目
		RETURN					;リターン

;桁単位出力						(3.013mSec)
SEG_OUT	DECF	FSR,F			;Fレジスタのポインタ処理
		MOVF	INDF,W			;Fレジスタの値取り出し
		BTFSS	STATUS,Z		;値の0判断
		CLRF	S_FLG			;0以外ならフラグリセット
		IORWF	S_FLG,W			;OR演算
		MOVWF	PORTB			;ポート出力
		BSF		PORTB,DIGIT		;桁選択出力
		CALL	WAIT			;ウェイト
		CALL	WAIT			;ウェイト
		CALL	WAIT			;ウェイト
		BCF		PORTB,DIGIT		;
		RETURN					;リターン

;10進5桁アップカウンタ				(0.030mSec)
U_COUNT	INCF	SEG_1, F		;1桁目カウントアップ
		MOVF	SEG_1, W		;SEG_1 → (W)
		SUBLW	D'10'			;(10)-(W)
		BTFSS	STATUS, Z		;=(0)?
		GOTO	WAIT_4			;ウェイト(24サイクル)
		MOVWF	SEG_1			;(W) → SEG_1
		INCF	SEG_2, F		;2桁目カウントアップ
		MOVF	SEG_2, W		;SEG_2 → (W)
		SUBLW	D'10'			;(10)-(W)
		BTFSS	STATUS, Z		;=(0)?
		GOTO	WAIT_3			;ウェイト(18サイクル)
		MOVWF	SEG_2			;(W) → SEG_2
		INCF	SEG_3, F		;3桁目カウントアップ
		MOVF	SEG_3, W		;SEG_3 → (W)
		SUBLW	D'10'			;(10)-(W)
		BTFSS	STATUS, Z		;=(0)?
		GOTO	WAIT_2			;ウェイト(12サイクル)
		MOVWF	SEG_3			;(W) → SEG_3
		INCF	SEG_4, F		;4桁目カウントアップ
		MOVF	SEG_4, W		;SEG_4 → (W)
		SUBLW	D'10'			;(10)-(W)
		BTFSS	STATUS, Z		;=(0)?
		GOTO	WAIT_1			;ウェイト(6サイクル)
		MOVWF	SEG_4			;(W) → SEG_4
		INCF	SEG_5, F		;5桁目カウントアップ
		MOVF	SEG_5, W		;SEG_5 → (W)
		SUBLW	D'10'			;(10)-(W)
		BTFSS	STATUS, Z		;=(0)?
		GOTO	STEP_2			;カウント終了
		MOVWF	SEG_5			;(W) → SEG_5
		GOTO	OVER			;オーバーフロー

;10進5桁ダウンカウンタ				(0.030mSec)
D_COUNT	DECF	SEG_1, F		;1桁目カウントダウン
		MOVF	SEG_1, W		;SEG_1 → (W)
		ADDLW	D'10'			;(10)+(W)
		BTFSS	STATUS, C		;=(255↑)?
		GOTO	WAIT_4			;ウェイト(24サイクル)
		MOVWF	SEG_1			;(W) → SEG_1
		DECF	SEG_2, F		;2桁目カウントダウン
		MOVF	SEG_2, W		;SEG_2 → (W)
		ADDLW	D'10'			;(10)+(W)
		BTFSS	STATUS, C		;=(255↑)?
		GOTO	WAIT_3			;ウェイト(18サイクル)
		MOVWF	SEG_2			;(W) → SEG_2
		DECF	SEG_3, F		;3桁目カウントダウン
		MOVF	SEG_3, W		;SEG_3 → (W)
		ADDLW	D'10'			;(10)+(W)
		BTFSS	STATUS, C		;=(255↑)?
		GOTO	WAIT_2			;ウェイト(12サイクル)
		MOVWF	SEG_3			;(W) → SEG_3
		DECF	SEG_4, F		;4桁目カウントダウン
		MOVF	SEG_4, W		;SEG_4 → (W)
		ADDLW	D'10'			;(10)+(W)
		BTFSS	STATUS, C		;=(255↑)?
		GOTO	WAIT_1			;ウェイト(6サイクル)
		MOVWF	SEG_4			;(W) → SEG_4
		DECF	SEG_5, F		;5桁目カウントダウン
		MOVF	SEG_5, W		;SEG_5 → (W)
		ADDLW	D'10'			;(10)+(W)
		BTFSS	STATUS, C		;=(255↑)?
		GOTO	STEP_1			;カウント終了
		CLRF	SEG_1			;クリア
		CLRF	SEG_2			;クリア
		CLRF	SEG_3			;クリア
		CLRF	SEG_4			;クリア
		CLRF	SEG_5			;クリア
		CLRF	MEM_2			;クリア
		MOVLW	S_FLG			;
		CALL	LED_OUT			;LEDアウトへ		(15.084mSec)
		INCF	MEM_2, F		;
		GOTO	STEP_2			;カウント終了

;EEPROM書き込み					(20.109mSec)
WR_ADR	MOVWF	FSR				;FSRセット
		DECF	FSR,F			;Fレジスタのポインタ処理
		CALL	EE_WR			;5桁目書き込み		
		DECF	FSR,F			;Fレジスタのポインタ処理
		CALL	EE_WR			;4桁目書き込み
		DECF	FSR,F			;Fレジスタのポインタ処理
		CALL	EE_WR			;3桁目書き込み
		DECF	FSR,F			;Fレジスタのポインタ処理
		CALL	EE_WR			;2桁目書き込み
		DECF	FSR,F			;Fレジスタのポインタ処理
		CALL	EE_WR			;1桁目書き込み
		RETURN					;リターン

;桁単位EEPROM書き込み			(4.018mSec)
EE_WR	BSF		STATUS,RP0		;ページ1
		MOVF	FSR,W			;FSR → (W)
		MOVWF	EEADR			;アドレスセット
		MOVF	INDF,W			;Fレジスタの値取り出し
		MOVWF	EEDATA			;データセット
		BSF		EECON1,WREN		;セットWRイネーブル
		MOVLW	H'55'			;書き込みシーケンス
		MOVWF	EECON2			;書き込みシーケンス
		MOVLW	H'AA'			;書き込みシーケンス
		MOVWF	EECON2			;書き込みシーケンス
		BSF		EECON1,WR		;書き込み
WR_LP	BTFSC	EECON1,WR		;確認待ちループ
		GOTO	WR_LP			;ループ
		BCF		STATUS,RP0		;ページ0
		RETURN					;リターン

;EEPROM読み込み					(0.064mSec)
RD_ADR	MOVWF	FSR				;FSRセット
		DECF	FSR,F			;Fレジスタのポインタ処理
		CALL	EE_RE			;5桁目読み込み
		MOVWF	SEG_5			;5桁目セット
		DECF	FSR,F			;Fレジスタのポインタ処理
		CALL	EE_RE			;4桁目読み込み
		MOVWF	SEG_4			;4桁目セット
		DECF	FSR,F			;Fレジスタのポインタ処理
		CALL	EE_RE			;3桁目読み込み
		MOVWF	SEG_3			;3桁目セット
		DECF	FSR,F			;Fレジスタのポインタ処理
		CALL	EE_RE			;2桁目読み込み
		MOVWF	SEG_2			;2桁目セット
		DECF	FSR,F			;Fレジスタのポインタ処理
		CALL	EE_RE			;1桁目読み込み
		MOVWF	SEG_1			;1桁目セット
		RETURN					;リターン

;桁単位EEPROM読み込み
EE_RE	BSF		STATUS,RP0		;ページ1
		MOVF	FSR,W			;FSR → (W)
		MOVWF	EEADR			;アドレスセット
		BSF		EECON1,RD		;読み出し
		MOVF	EEDATA,W		;データ → (W)
		BCF		STATUS,RP0		;ページ0
		RETURN					;リターン

;デコードサブルーチン					(0.319mSec)
HEXDEC:	MOVWF	FSR				;FSRセット
		CALL	DECODE			;最下位変換
		CALL	DECODE			;
		CALL	DECODE			;最上位変換
		RETURN

;桁単位デコードサブルーチン
DECODE:	MOVLW	D'8'			;8ビットくり返し
		MOVWF	DE_CNT			;
		CLRF	DE_WORK			;ワークエリア初期化
DEC_0:	BCF		STATUS,C		;キャリフラグ・クリア
		RLF		DE_VAL,F		;左シフト
		RLF		DE_WORK,F		;ワークエリア・ローテート
		MOVLW	B'11110110'		;
		ADDWF	DE_WORK,W		;
		BTFSC	STATUS,C		;
		MOVWF	DE_WORK			;
		BTFSC	STATUS,C		;
		INCF	DE_VAL,F		;
		DECFSZ	DE_CNT,F		;
		GOTO	DEC_0			;
		INCF	FSR,F			;FSRインクリメント
		MOVF	DE_WORK,W		;
		MOVWF	INDF			;
		RETURN

;カウントオーバーフロー
OVER	BTFSS	PORTA,RST_E		;PORTA<5> → (1)? リセット・イネーブル端子
		GOTO	RST_CNT			;リセットコントロールへ
		CLRF	S_FLG			;フラグクリア
		MOVLW	S_FLG			;
		MOVWF	FSR				;FSRセット
		CALL	SEG_OUT			;5桁目
		CALL	SEG_OUT			;4桁目
		CALL	SEG_OUT			;3桁目
		CALL	SEG_OUT			;2桁目
		CALL	SEG_OUT			;1桁目
		GOTO	OVER			;無限ループ

;戻り時間調整ウェイト
WAIT_4	INCF	MEM_1, F		;ウェイト(24サイクル)
		NOP
WAIT_3	INCF	MEM_1, F		;ウェイト(18サイクル)
		NOP
WAIT_2	INCF	MEM_1, F		;ウェイト(12サイクル)
		NOP
WAIT_1	INCF	MEM_1, F		;ウェイト(6サイクル)
LOOP_1	NOP
		DECFSZ	MEM_1, F		;(MEM_1)-(1) → (0)?
		GOTO	LOOP_1			;
STEP_1	CLRF	MEM_2			;クリア
STEP_2	RETURN					;リターン

;15msウェイトサブルーチン
WAIT_15	MOVLW  	D'15'			;ms設定
		MOVWF  	COUNT15			;
LOOP_15	CALL  	WAIT			;
		DECFSZ	COUNT15,F		;
		GOTO	LOOP_15			;
		RETURN					;リターン

;1msウェイトサブルーチン
WAIT	MOVLW  	D'249'			;
		MOVWF  	COUNT			;
LOOP	NOP						;
		DECFSZ 	COUNT,F			;
		GOTO	LOOP			;
		RETURN					;リターン

;プログラム終了
		END
	
私の場合、フロー図を書かずいきなりプログラムに入るので時間が経つと忘れがちですがw
覚えている範囲で説明いたします。
ポートの設定で表示部分の接続を確認し→初期化→レジスタの初期化でウェイト時間を置き表示部との同期に備えてからEEPROMに書き込んだ以前のデータ(クレジット数とクレジット上げ設定)を読み出す。
次に入力ポートの読み取り待ち状態のループに入りますが、LEDダイナミック表示でそれほど正確さの要らない物なので割り込みは使わず定期的にLED表示をリフレッシュしています。
入力に従い各サブルーチンに飛びシーケンスに従い出力するだけの単純な構造です。
BETボタンが押されれば「セレクタ・ポート出力」に飛びカウントをダウンさせる
ホッパーがイネーブルになれば「ホッパー・ポート出力」に飛びカウントをアップさせる
クレジット入力があれば設定数分のクレジットを加算する
クレジット設定端子が押されれば1秒以上の長押しかを判定し設定モードに移行する

カウント数などの変化があればその都度EEPROMに書き込むので電源を切っても以前の数値が記録されます。
カウントが99999以上になればオーバーフローで無限ループに入りホッパーエラーでスロット機が停止するようになりリセットボタンで復帰できます。
クレジット上げ設定は1〜255まで可能で1バイトレジスタを使用しているので表示させるためには10進デコードをして一桁ずつ表示しています。

改造などをするのにわかりにくい部分があればメールをくださればサポートいたします。

これで最終回なので今までの全てのデータを以下からダウンロードしていただけます。↓
回路図
パターン図
プログラムソース
ケース加工図面
部品表
マニュアル

ダウンロード

余談ですが、ここで紹介した今までのスロット関係は「株式会社 遊競」という所で数年前まで実際に販売されていた物です。

ジャンク箱に戻る