;***** Clock7LEDII.asm ****************************************************
;
;	７セグメントＬＥＤ表示時計 II （ MAX7219 版）
;
;	Copyright (C) 2021   by M.Yamamoto. All rights reserved.
;
;     ( coding:  Ver. 0.00   2021/10/20 by M.Yamamoto )
;	coding:  Ver. 1.00   2021/10/28  初期バージョン
;	update:  Ver. 1.01   2021/11/08  輝度調節機能の追加
;	bugfix:  Ver. x.xx
;
;******************************************************* PicAsm 0261 ******

;	Device: PIC16F684	Clock: 8MHz (Internal OSC)

;==========================================================================

#ifdef comment

 <機能と使用法>

・本機の電源を投入すると、"ピポッ" と開始ブザー音を出力後、７セグメントＬＥＤの各桁セグメントＬＥＤの、点灯
　チェックを兼ねたデモ表示が十数秒間行われ、続いて 1 秒間全桁消灯の後、0.5秒間ずつ９から０までの数字をカウ
　ントダウンしながら、７セグメントＬＥＤ全６桁分の表示テストを計５秒間行う。（このとき、MODE / SET スイッチ
　を押しながら電源を投入すると、数十秒間のデモ表示だけを省略することができる。）

・次に、1 秒間全桁消灯の後、プログラムのバージョン番号が７セグメントＬＥＤに約５秒間表示される。

		バージョン番号		[ _x.xx___ ]

・その後 1 秒間全桁消灯の後、RTC（リアルタイムクロック）モジュールの状態がチェックされ、初めて電源を入れた
　ときや、バックアップ用バッテリーが異常なとき等に、次のエラーメッセージが７セグメントＬＥＤに表示されると
　ともに、"ブッブー" ブザー音が出力される。

		エラーメッセージ	[ Er.3231 ]

・ユーザはバックアップ用バッテリーの状態等を確認してその対処を行った後、５つのスイッチの内のどれかを押して
　応答をする。

・すると、RTC（リアルタイムクロック）モジュールが初期設定され、エラーフラグがクリアされるとともに、年月日、
　時分秒が本機をプログラミングしたときの初期値、"2021/01/01"、"00：00：00" に設定がされて時計機能が開始され
　る。この状態を NORMAL モード という。 しかし、これらは現在値とは異なるため、スイッチ操作による手順で現在
　の年月日、時分秒に設定をし直す必要がある。

		時間表示		[ xx:xx:xx ]

・その手順の説明の前に、本機における表示モードを先に説明をしておく。（このときのモードの意味は上述の NORMAL 
　モードと対比するものではなく、単に表示する内容の種類を表している）。本機には上述の時間表示の他に、年月日
　表示（年表示は西暦４桁の内、下２桁のみ表示）の機能を持っている。

		モード 0          	  		モード 1
		時間表示　[ xx:xx:xx ]			年月日表示　[ xx.xx.xx ]

・なお、上述のモード 0 、モード 1 の他にモード 2 もあって、これらは MODE / SET スイッチ を押すごとにモード
　番号が増加をし、７セグメントＬＥＤに表示される内容が切り替わる。そしてモード 2 の次は再びモード 0 に戻る。

		┌─→ 時間表示 ─→ 年月日表示 ─→ オートモード ──┐
		│　　(モード 0)　 　(モード 1)　　　 (モード 2)　　　│
		│　　　　　　　　　　　　　　　　　　　　　　　　　　│
		└──────────────────────────┘

・オートモード(モード 2) を選択したときには、モード 0 、モード 1 の個々の内容表示を、次図に示すように自動
　的に 10 秒ごとに内容を切り替えて、それぞれの表示を繰り返す。

      		毎 00 ～ 09, 20 ～ 29, 40 ～ 49 秒の間：	時間表示
      		毎 10 ～ 19, 30 ～ 39, 50 ～ 59 秒の間：	年月日表示

		 (_____: 時間表示、NNNNN: 年月日表示)

		00        10        20        30        40        50        00
		.    .    .    .    .    .    .    .    .    .    .    .    .
		__________NNNNNNNNNN__________NNNNNNNNNN__________NNNNNNNNNN

・本機では１２／２４時間の両表示機能を持ち、通常の NORMAL モード中であれば UP スイッチを押すことによって、
　いつでも切り替えることができる。すなわち、時間表示(モード 0) 中だけでなく、年月日表示(モード 1) 、オート
　モード(モード 2) 中であっても切り替えられる。ただし、年月日表示(モード 1) 中のときには切り替わったことを
　目で確認することはできない。

・次に、２４時間表示と１２時間表示の両者の対応を示すが、本機では、２４時間表示では "時" の表示に "xx" と常
　に２桁で表示するのに対して、１２時間表示では先頭が "０" であった場合には、ゼロサプレスをして表示しないよ
　うにしている。

		(24H)  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 
		(12H)  12  1  2  3  4  5  6  7  8  9 10 11 12  1  2  3  4  5  6  7  8  9 10 11
		       am am am am am am am am am am am am pm pm pm pm pm pm pm pm pm pm pm pm

・１２時間表示の場合には午前と午後との区別をさせるため、最左端の十時の桁の "Ｆ" セグメントを点灯させること
　で午前を表し、また "Ｅ" セグメントを点灯させることで午後を表している。次の写真は、１２時間表示での午前と
　午後、および２４時間表示でのそれぞれの表示例を示す。

・さて、ここで話を戻して、年月日、時分秒の設定を変更する手順としては、現在、時間表示(モード 0) ～ オートモ
　ード(モード 2) のどの内容が表示されている場合においても可能で、まず、表示内容（モード）を切り替えるときの
　ように "チョン押し" ではなく、同じ MODE / SET スイッチ を "長押し" することによって、年月日、時分秒を自由
　に変更することができる SET モード に移行をする。

・すなわち、MODE / SET スイッチを３秒以上 "長押し" をしていると、マトリクス LED に次のメッセージが表示され
　て、NORMAL モードから SET モード に移行をしたことを知らせる。（７セグメントＬＥＤ全６桁の "G" セグメント
　だけを点灯させる。）

		SET モード に移行	[ -- -- -- ]

・ユーザはそれを確認してスイッチから指を離すと、次には必ず年月日の表示パタンが表示される。そして、"年２桁" 
　のデシマルポイント（DP）がブリンク点灯（200 ミリ秒点、200 ミリ秒滅）をし、これから変更することが可能な対
　象項目であることを表している。（年表示は西暦４桁の内、下２桁のみ表示）

					  vv		... vv の位置 "年２桁" の DP がブリンク点灯
		年月日表示		[ xx.xx.xx ]

・ここで変更が必要であれば、UP スイッチを押すごとに現在値より１ずつ増加し、また DOWN スイッチを押すごとに１
　ずつ減少するので、適宜希望する値に変更をする。また、このときの増減幅を大きくしたい場合には、UP スイッチ、
　または DOWN スイッチを押したままにしていると、１秒当たり 4 ～ 5 の増減幅で更新をするようになる。

・"年２桁" の変更が済んだら、再び MODE / SET スイッチを押すと、次には "月２桁" のデシマルポイント（DP）がブ
　リンク点灯をし、変更の対象項目が次に移動したことを示す。同様に変更が必要であれば、UP スイッチ、または DOWN 
　スイッチを押すことによって、適宜希望する値に変更をする。

					     vv		... vv の位置 "月２桁" の DP がブリンク点灯
		年月日表示		[ xx.xx.xx ]

・同様に、SET スイッチを押すごとに "年"、"月"、"日"、"時"、"分"、"秒" と変更の対象項目（２桁ずつ）が移動す
　るので、該当の項目を選択後 UP または DOWN スイッチによって値を変更設定する。このとき、"日" から "時" に対
　象項目が移動すると、時間表示パタンに切り替わる。両者での見かけ上の違いは、各項目間の区切り記号表示が前者
　ではピリオド(．) 、後者ではコロン(：)となる。

・そして、最後の "秒" 設定後にもう一度 SET スイッチを押すことによって、年月日、時分秒の設定変更の処理が終了
　をし、SET モードから抜け出して再び NORMAL モードに移行をして、必ず時間表示(モード 0) に戻り、新たに設定し
　直した時分秒から時（とき）を刻み続ける。 

・この SET スイッチによって対象項目を選択中に、誤って希望する項目を通り過ぎてしまったような場合には、BACK 
　スイッチを押すごとに、ひとつずつ前の項目に戻ることができる。ZERO / BACK スイッチは、"年"、"月"、"日"、"時"、
　"分"、"秒" の設定中（SET モード）にはこのような機能を有する。

	　　　　　　　　　　　　　　 BACK  　BACK  　BACK  　BACK  　BACK
	　　　　　　　　　　　　　　 ←─ 　 ←─ 　 ←─ 　 ←─ 　 ←─
	　　　　　　　　　　 SET  　 SET  　 SET  　 SET  　 SET  　 SET  　 SET
	３つのどれかのモード ─→ 年 ─→ 月 ─→ 日 ─→ 時 ─→ 分 ─→ 秒 ─→ 時間表示モード(モード 0) 
	　　　　　　　　　　　　　│　　　　　　　　　　　　　　　　　　　↑
	　　　　　　　　　　　BACK└───────────────────┘

・なお、NORMAL モードのときに１２時間表示に設定がされている場合には、SET モードに移行後もその表示が反映され
　るため、SET スイッチによって項目の"時"、"分"、"秒" を選択時には、左列の :（コロン）の上側 LED点灯 + 下側 
　LED消灯で AM を、上側 LED消灯 + 下側 LED点灯で PM を、それぞれ表現をする。また、この場合には先頭の１桁目
　（左端）のゼロサプレスも行われる。

・ZERO／BACK スイッチは、SET モード中で "年"、"月"、"日"、"時"、"分"、"秒" の設定のときには、上述のように 
　BACK スイッチとして機能をするが、それ以外の NORMAL モード中には、毎正時プラス・マイナス５分以内に押された
　場合に限り、00分00秒に設定するための ZERO スイッチとして機能をする。

・また、このように NORMAL モード中で、毎正時プラス・マイナス５分以内には ZERO スイッチ機能が優先するが、毎
　正時プラス・マイナス５分以外のときに、ZERO／BACK スイッチを押しながら UP スイッチ、または DOWN スイッチを
　押すことによって、ＬＥＤの輝度調節として機能をする。

・本機では、輝度調節のレベルを 0 から 9 までの 10 段階 * を、変更設定することができる。すなわち、ZERO／BACK 
　スイッチを押しながら、UP スイッチを押すごとに現在値より１ずつ増加し、また DOWN スイッチを押すごとに１ずつ
　減少する。ただし、このときにそれぞれの限度値になってから尚も、UP スイッチ、または DOWN スイッチを押しても、
　それぞれの限度値を超えることはない。（デフォルト値 = 4）

　	* 本機で使用したＩＣ MAX7219 では 16 段階で変更することが可能であるが、ＬＥＤの安全性を考慮して
　	　上限を 9 までに制限をした。

・このとき設定された輝度調節のレベルの値を、"月２桁"、または "分２桁" の位置に同数字２桁で表示をするととも
　に、デシマルポイント（DP）をブリンク点灯させて知らせる。これらの表示は、スイッチ操作によって設定値が変更
　されるごとに、 １秒間だけ表示される。

					     vv	            vv	      ... vv の位置 "２桁" の DP がブリンク点灯
		輝度レベル表示		[ xx.xx.xx ] / [ xx:xx:xx ]

・年月日カレンダー機能について、うるう年の計算は 2001年～2399年までの範囲で対応をしている。ただし、年の表示
　は下２桁のみになる。

・SIGNAL スイッチ は、毎時の時報音出力のブザー音を、押すごとに有効／無効に交互に設定をする。このときの設定
　状態は視覚的な表示がないため、有効になったときには "ピピピッ" 音を、無効になったときには "ブー" 音を、そ
　れぞれ鳴らして知らせる。なお、電源を投入した直後は有効状態に設定がされている。また、有効に設定時には、時
　間表示(モード 0) 以外のモードにおいても、毎時の時報音は有効（鳴る）なので注意が必要である。

#endif

;==========================================================================

;	PIC16F684 のピンと用途

;	 (1) Vdd: 電源 +5V DC			(14) Vss: 電源 GND
;	 (2) RA5: SW4(ZERO/BACK) スイッチ入力	(13) RA0: SW1(MODE/SET) スイッチ入力
;	 (3) RA4: SW3(DOWN) スイッチ入力	(12) RA1: SW2(UP) スイッチ入力
;	 (4) RA3: SW5(SIGNAL) スイッチ入力	(11) RA2/INT: DS3231 SQW 入力
;	 (5) RC5: ブザー音 出力			(10) RC0: DS3231 SCL 出力
;	 (6) RC4: MAX7219 CLK 出力		 (9) RC1: DS3231 SDA 入出力
;	 (7) RC3: MAX7219 LOAD 出力		 (8) RC2: MAX7219 DIN 出力

;	*注.  RA3 は入力専用で、出力ポートには使えない。

;==========================================================================

	list		p=pic16f684		;デバイス情報
	include		p16f684.inc		;インクルードファイル
	errorlevel	-302			;Eliminate bank warning

;==========================================================================
;		コンフィギュレーションの設定
;==========================================================================
 
	__config 	_CP_OFF & _CPD_OFF & _BOREN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT

;==========================================================================
;		定数の定義と変数のレジスタ割付け
;==========================================================================

		radix	dec

ver_no		equ	h'101'		;バージョン番号: 1.01

tm0_h_val	equ	256 - 250	;ハードタイマー０カウント値（割り込み周期）(4/8Mz*16*250=2msec)
tm0_s_val	equ	100		;ソフトタイマー０カウント値                (2msec*100=200msec)

_swMOD		equ	0		;MODE スイッチ		;┐
_swSET		equ	0		;SET  スイッチ		;│
_swUP		equ	1		;UP   スイッチ		;│
_swSIG		equ	3		;SIGNAL スイッチ	;│PORTA
_swDWN		equ	4		;DOWN スイッチ		;│
_swZER		equ	5		;ZERO スイッチ		;│
_swBAK		equ	5		;BACK スイッチ		;┘

SCL		equ	0		;I2C SCL		;┐
SDA		equ	1		;I2C SDA		;│
maxDIN		equ	2		;MAX7219 DIN 制御	;│PORTC
maxLOAD		equ	3		;MAX7219 LOAD 制御	;│
maxCLK		equ	4		;MAX7219 CLK 制御	;│
_BZ		equ	5		;アラーム音 出力	;┘

f_rah		equ	65536 - 1136	;ラ (880.00 Hz)  at 8MHz
f_doh		equ	65536 - 1911	;ド (523.26 Hz)
f_ra		equ	65536 - 2273	;ラ (440.00 Hz)
f_so		equ	65536 - 2551	;ソ (392.00 Hz)
f_mi		equ	65536 - 3034	;ミ (329.63 Hz)
f_do		equ	65536 - 3822	;ド (261.63 Hz)
f_do_		equ	65536 - 7644	;ド (130.82 Hz)
po_tim		equ	100		;音長(ms)
pi_tim		equ	100		;音長
bu_tim		equ	100		;音長
buu_tim		equ	250		;音長

		cblock  h'20'		;(バンク 0)
tm0_s_cnt				;ソフトタイマー０カウンタ
int_flg					;外部(RA2/INT)割り込みフラグ
					;bit0: RTC DS3231 からデータ読み出し要求フラグ
bcd_yh					;年(上位2桁) BCD カウンタ
bcd_yl					;年(下位2桁) BCD カウンタ
;bcd_yy					;年 BCD カウンタ
bcd_nn					;月 BCD カウンタ
bcd_dd					;日 BCD カウンタ
bcd_hh					;時 BCD カウンタ
bcd_mm					;分 BCD カウンタ
bcd_ss					;秒 BCD カウンタ
bcd_ww					;曜日 BCD カウンタ
temp_hh					;仮の時 BCD カウンタ
temp_mm					;仮の分 BCD カウンタ
temp_ss					;仮の秒 BCD カウンタ
time_flg				;時間表示モードフラグ  bit1=0:24H/1:12H, bit0=0:am/1:pm
mod_flg					;bit7:   表示変更フラグ
					;bit1-0: 表示モードフラグ 0:時間, 1:年月日, 2:オート, (3:SET)
tg_point				;対象の位置ポインタ
chg_flg					;データ変更フラグ, bit0:対象の位置の変更, :bit1:対象の位置のデータ変更
alm_flg					;アラーム音出力フラグ, bit0:時報予報音, bit1:時報正報音,  bit7:出力許可
uru_flg					;0:平年 / 1:閏年
cur_yh					;年(上位2桁)(変) BCD カウンタ
cur_yl					;年(下位2桁)(変) BCD カウンタ
cur_nn					;月(変) BCD カウンタ
cur_week				;週位置カウンタ（曜日 1～7）
xxx_yh					;ワーク

work1					;ワーク
work2					;ワーク
work3					;ワーク
lp_cnt1					;汎用ループカウンタ
lp_cnt2					;汎用ループカウンタ

const_high				;音階用分周定数 high の保存
const_low				;音階用分周定数 low の保存
wt1cnt					;ウェイト用ループカウンタ
wt2cnt					;ウェイト用ループカウンタ
wt3cnt					;ウェイト用ループカウンタ

reg_addr				;MAX7219 のレジスタアドレス
reg_data				;レジスタへの書き込みデータ
maxtmp					;送信データの一時保存
mbit_cnt				;ループカウンタ
mlpcnt1					;ループカウンタ
mlpcnt2					;ループカウンタ
mlpcnt3					;ループカウンタ
segment					;Segment データ変数
digit					;Digit データ変数

addr_high				;テーブルデータの high アドレス
addr_low				;テーブルデータの low アドレス
intensity				;bit7: 輝度更新フラグ, bit3-0: 輝度調節値 ;
blk_cnt					;ブリンク時間カウンタ			  ; (Ver.1.01) で追加
blk_flg					;bit2: 輝度調節識別フラグ		  ;
					;bit1: 全桁強制表示フラグ, bit0: ブリンク表示フラグ
hhmmss_flg				;時分秒の変更フラグ
yynnddw_flg				;年月日曜日の変更フラグ

; (I2C_RTC.sub で使用)
seconds					;00h: Seconds: 00-59
minutes					;01h: Minutes: 00-59
hours					;02h: Hours:   1-12 + AM/PM, 00-23
day					;03h: Day:     1-7
date					;04h: Date:    01-31
month					;05h: Month/Century: 01-12 + Century
year					;06h: Year:    00-99
alarm1s					;07h: Alarm 1 Seconds: 00-59
alarm1m					;08h: Alarm 1 Minutes: 00-59
alarm1h					;09h: Alarm 1 Hours:   1-12 + AM/PM, 00-23
alarm1dy				;0Ah: Alarm 1 Day:     1-7
alarm1d					;0Bh: Alarm 1 Date:    1-31
alarm2h					;0Ch: Alarm 2 Hours:   1-12 + AM/PM, 00-23
alarm2d					;0Dh: Alarm 2 Day:     1-7, Alarm 2 Date:    1-31
control					;0Eh: Control
cont_stat				;0Fh: Control/Status
aging					;10h: Aging Offset
temp_m					;11h: MSB of Temp
temp_l					;12h: LSB of Temp

rtc_lpcnt				;ループカウンタ
rtc_addr_high				;読み出すデータの high アドレス
rtc_addr_low				;読み出すデータの low アドレス

; (I2C_XS.sub で使用)
i2ctmp					;送受信データの一時保存
bit_cnt					;ループカウンタ
		endc

		cblock	h'80' - 3
w_save					;W レジスタの退避用
s_save					;STATUS レジスタの退避用
f_save					;FSR レジスタの退避用
		endc

;==========================================================================
;		マクロ命令定義
;==========================================================================

;		maxRegSet マクロ

maxRegSet	macro	@reg,@dat
		movlw	@reg		;レジスタアドレス
		movwf	reg_addr
		movlw	@dat		;データ
		movwf	reg_data
		call	max_reg_cont	;MAX7219 のレジスタ制御
		endm

;		Sound_M マクロ

Sound_M		macro	@scale,@time
		movlw	high @scale	;出力音階
		movwf	const_high
		movlw	low @scale
		movwf	const_low
		movlw	@time		;出力時間(ms)
		call	buzzer_control	;ブザー音出力コントロール
		endm

;==========================================================================
;		プログラム開始
;==========================================================================

		org	h'0000'		;リセットベクタ
		goto	start

		org	h'0004'		;割り込みベクタ
		goto	interrupt

;==========================================================================
;		サブルーチンファイルのインクルード
;==========================================================================

#define 	TRISX	TRISC		;PORTC で I2C を行う場合、
#define 	PORTX	PORTC		;
#define 	_not_wait		;Fast mode で使用

		include		D:\Project\PIC\_sub\I2C_XS.sub		; 各自の開発環境に
		include		D:\Project\PIC\_sub\I2C_RTC.sub		; 合わせるように !!

;==========================================================================
;		初期化処理
;==========================================================================

#define 	bcd_yy	bcd_yl		;年(下位2桁) BCD カウンタ ***

start
		bcf	STATUS,RP1
		bcf	STATUS,RP0	;バンク 0

		movlw	h'20'
		movwf	bcd_yh		;年(上位2桁) BCD カウンタ ***

		clrf	STATUS		;STATUS クリア
	 	clrf	INTCON		;INTCON クリア

		; PORTA,PORTC をデジタルI/O に設定

		clrf	PORTA		;
		clrf	PORTC		;
		movlw	b'00000111'	;Digital I/O
		movwf	CMCON0

		bsf	STATUS,RP0	;バンク 1
		clrf	ANSEL		;Digital I/O
		movlw	b'00111111'
		movwf	TRISA		;ポートA の I/0 設定
		movlw	b'00000000'
		movwf	TRISC		;ポートC の I/0 設定

		movlw	b'00110111'	;RA5,4,2,1,0 を プルアップ
		movwf	WPUA

		; 内部クロックを 8 MHzに設定

		movlw	b'01110001'	;IRCF2-0: bit6-4=111: 内部クロック周波数選択=8MHz
					;OSTS:    bit3=0:     オシレータ起動タイムアウトステータスビット
					;HTS:     bit2=0:     HFINTOSCステータスビット
					;LTS:     bit1=0:     LFINTOSCステータスビット
					;SCS:     bit0=1:     システムクロック選択=内部クロック
		movwf	OSCCON

		; OPTION_REG の設定

		movlw	b'01000011'	;RABPU:  bit7=0:     PORTAプルアップ有効
					;INTEDG: bit6=1:     INTピンの立ち上がりエッジで割り込み
					;T0CS:   bit5=0:     タイマー０クロックソース選択 = 内部クロック
					;T0SE:   bit4=0:     タイマー０エッジ選択 = low-to-high
					;PSA:    bit3=0:     タイマー０でプリスケーラを使用
					;PS2-0:  bit2-0=011: プリスケーラのスケール値 = 1:16 
		movwf	OPTION_REG

		; 割り込みの設定

		bcf	PIE1,TMR1IE	;TMR1IE: タイマー１割り込みを禁止
		bcf	STATUS,RP0	;バンク 0

		movlw	b'00000001'	;T1GINV:    bit7=0:    Timer1ゲート反転ビット
					;TMR1GE:    bit6=0:    Timer1ゲートイネーブルビット
					;T1CKPS1-0: bit5-4=00: プリスケーラのスケール値 = 1:1
					;T1OSCEN:   bit3=0:    専用の発振器を使う場合に指定
					;T1SYNC:    bit2=0:    外部入力クロック指定時に有効
					;TMR1CS:    bit1=0:    内部クロックを使う
					;TMR1ON:    bit0=1:    タイマー１を動作
		movwf	T1CON

		movlw	b'11000000'	;GIE:   bit7=1: グローバル割り込みを許可
					;PEIE:  bit6=1: ペリフェラル割り込みを許可
					;T0IE:  bit5=0: TMR0オーバーフロー割り込みを禁止
					;INTE:  bit4=0: RA2 / INT外部割り込みを禁止
					;RABIE: bit3=0: PORTA / PORTB割り込みを禁止
					;T0IF:  bit2=0: TMR0オーバーフロー割り込みフラグ
					;INTF:  bit1=0: RA2 / INT外部割り込みフラグ
					;RABIF: bit0=0: PORTA / PORTB割り込みフラグ
		movwf	INTCON

;--------------------------------------------------------------------------

		movlw	b'00001011'	;bit0:SCL="H", bit1:SDA="H"
					;bit3:maxLOAD="H", bit4:maxCLK="L"
		movwf	PORTC		;DS3231 / MAX7219 制御の初期設定

		; ７セグメントLED のデモ表示

		call	max_reg_init	;MAX7219 LED ドライバの初期化
		call	buzzer_pipo	;"ピポッ" ブザー音出力
		btfss	PORTA,_swMOD	;MODE / SET スイッチ = ON か？		; (Ver.1.01) で追加
		goto	dxtst00		;Yes					;

		call	demo1_display	;７セグメントLED の点灯移行デモ-1
		call	demo2_display	;７セグメントLED の点灯移行デモ-2
		call	demo3_display	;７セグメントLED の点灯移行デモ-3
		call	led_1s_off	;LED を 1 秒間消灯

		; ７セグメントLED の９～０表示テスト

dxtst00		movlw	h'09'		;デコードモードレジスタ
		movwf	reg_addr
		movlw	b'11011011'	;Digit 5,2: デコードなし
		movwf	reg_data
		call	max_reg_cont	;MAX7219 のレジスタ制御

		movlw	10		;
		movwf	mlpcnt2		;ループカウンタ2 にセット

dxtst01		movlw	8		;
		movwf	digit		;ループカウンタ digit にセット

dxtst02		movf	digit,W		;レジスタアドレス
		movwf	reg_addr
		decf	mlpcnt2,W	;表示文字
		movwf	reg_data

		movlw	6
		subwf	digit,W
		btfsc	STATUS,Z	;digit = 6 か？
		clrf	reg_data	;Yes
		movlw	3
		subwf	digit,W
		btfsc	STATUS,Z	;digit = 3 か？
		clrf	reg_data	;Yes

		call	max_reg_cont	;MAX7219 のレジスタ制御
		decfsz	digit,F		;ループカウンタ digit - 1 = 0 か？
		goto	dxtst02		;No

	;;	call	wait_1sec	;1 秒 ウェイト
		call	wait_500ms	;500m 秒 ウェイト
		decfsz	mlpcnt2,F	;ループカウンタ2 - 1 = 0 か？
		goto	dxtst01		;No

		call	led_1s_off	;LED を 1 秒間消灯

		; バージョン番号の表示

		movlw	h'09'		;デコードモードレジスタ
		movwf	reg_addr
		movlw	b'01011000'	;Digit 7,5,2-0: デコードなし
		movwf	reg_data
		call	max_reg_cont	;MAX7219 のレジスタ制御
		call	digit_reg_clr	;全 Digit レジスタのクリア（デコードなしのみ）

		movlw	h'07'		;Digit 6 レジスタ
		movwf	reg_addr
		movlw	high ver_no	;バージョン番号 x.__
		movwf	reg_data
		call	max_reg_cont	;MAX7219 のレジスタ制御

		movlw	h'06'		;Digit 5 レジスタ
		movwf	reg_addr
		movlw	h'40'		;ピリオド（.）
		movwf	reg_data
		call	max_reg_cont	;MAX7219 のレジスタ制御

		movlw	h'05'		;Digit 4 レジスタ
		movwf	reg_addr
		movlw	(low ver_no) / 16 ;バージョン番号 _.x_
		movwf	reg_data
		call	max_reg_cont	;MAX7219 のレジスタ制御

		movlw	h'04'		;Digit 3 レジスタ
		movwf	reg_addr
		movlw	(low ver_no) % 16 ;バージョン番号 _._x
		movwf	reg_data
		call	max_reg_cont	;MAX7219 のレジスタ制御

		call	wait_5sec	;5 秒 ウェイト
		call	led_1s_off	;LED を 1 秒間消灯

;--------------------------------------------------------------------------

		; I2C RTC（DS3231）モジュールのチェック

rtcinit01	Rtc_Read_M	cont_stat,1	;0Fh: Control/Status 読み出し

		btfss	cont_stat,7	;OSF = 1 か？
		goto	varinit01	;No

;		[ Error DS3231 ]	;DS3231 RTC エラーメッセージ

		maxRegSet	h'09', b'00011011'	;デコードモード, Digit 7～5,2: デコードなし

		maxRegSet	h'08', b'01001111'	;Digit 7, "E"
		maxRegSet	h'07', b'10000101'	;Digit 6, "r."
		maxRegSet	h'06', 0		;Digit 5, " "
		maxRegSet	h'05', 3		;Digit 4, "3"
		maxRegSet	h'04', 2		;Digit 3, "2"
		maxRegSet	h'03', 0		;Digit 2, " "
		maxRegSet	h'02', 3		;Digit 1, "3"
		maxRegSet	h'01', 1		;Digit 0, "1"

		call	buzzer_bubuu	;"ブッブー" ブザー音出力

rtcinit02	movlw	h'3b'		;SW1～SW5 スイッチ
		andwf	PORTA,W
		xorlw	h'3b'
		btfsc	STATUS,Z	;どれかのスイッチ = ON か？
		goto	rtcinit02	;No

		; I2C RTC（DS3231）モジュールの初期設定

		call	I2cRtc_Init	;I2C RTC（DS3231）モジュールの初期設定
		goto	rtcinit01

;--------------------------------------------------------------------------

		; 各変数の初期設定

varinit01	clrf	mod_flg		;表示モードフラグの初期設定
		clrf	blk_flg		;ブリンク表示フラグの初期設定
		clrf	blk_cnt		;ブリンク時間カウンタの初期設定
		clrf	time_flg	;時間表示モードフラグ bit1=0:24H/1:12H, bit0=0:am/1:pm
		movlw	b'10000000'
		movwf	alm_flg		;アラーム音出力許可フラグ = ON

		Rtc_Read_M  seconds,7	;RTC DS3231 から年月日、時分秒を読み出し
		call	counter_new	;一番初めはすべてを強制コピー		; (Ver.1.01) で変更
		call	buffer_to_counter
		bsf	mod_flg,7	;表示変更フラグ = ON（初回強制表示）

		clrf	int_flg		;外部割り込みフラグの初期設定
		bsf	INTCON,INTE	;INTE: 外部(RA2/INT)割り込みを禁止解除
		goto	main

		; 強制コピー手続き						; (Ver.1.01) で変更
counter_new
		movlw	h'ff'		;
		movwf	bcd_yy		;
		movwf	bcd_nn		;
		movwf	bcd_dd		;buffer_to_counter で
		movwf	bcd_hh		;すべてをコピーさせるため
		movwf	bcd_mm		;h'ff' にしておく
		movwf	bcd_ss		;
		movwf	bcd_ww		;
		return		

;==========================================================================
;		MAX7219 レジスタの基本制御
;==========================================================================

		; MAX7219 LED ドライバの初期化

max_reg_init
		movlw	h'0f'		;ディスプレイテストレジスタ
		movwf	reg_addr
		movlw	h'00'		;通常動作
		movwf	reg_data
		call	max_reg_cont

		movlw	h'09'		;デコードモードレジスタ
		movwf	reg_addr
		movlw	h'00'		;デコードなし
		movwf	reg_data
		call	max_reg_cont

		movlw	h'0a'		;輝度レジスタ
		movwf	reg_addr
		movlw	h'04'		;9/32
		movwf	reg_data
		movwf	intensity	;輝度調節値: デフォルト設定		; (Ver.1.01) で追加
		call	max_reg_cont

		movlw	h'0b'		;スキャン制限レジスタ
		movwf	reg_addr
		movlw	h'07'		;スキャン対象 8桁
		movwf	reg_data
		call	max_reg_cont

		movlw	h'0c'		;シャットダウンレジスタ
		movwf	reg_addr
		movlw	h'01'		;通常動作
		movwf	reg_data
		call	max_reg_cont

		call	digit_reg_clr	;全 Digit レジスタのクリア
		return		

;--------------------------------------------------------------------------

;		MAX7219 のレジスタ制御

max_reg_cont
		bcf	PORTC,maxLOAD	;maxLOAD="L"
		movf	reg_addr,W	;レジスタアドレス
		call	max_byte_send
		movf	reg_data,W	;レジスタデータ
		call	max_byte_send
		bsf	PORTC,maxLOAD	;maxLOAD="H"
		return		

;		MAX7219 指定レジスタのクリア

max_reg_clr
		bcf	PORTC,maxLOAD	;maxLOAD="L"
		movf	reg_addr,W	;レジスタアドレス
		call	max_byte_send
;		movf	reg_data,W	;レジスタデータ
		clrw			;クリア
		call	max_byte_send
		bsf	PORTC,maxLOAD	;maxLOAD="H"
		return		

;--------------------------------------------------------------------------

;		データ 1 バイト送信 

max_byte_send
		movwf	maxtmp		;Wレジスタの内容を一時保存
		movlw	8
		movwf	mbit_cnt	;ループカウンタにセット

mbsend01	bcf	PORTC,maxDIN	;maxDIN="L"
		btfsc	maxtmp,7	;送り出しデータの 7ビット目 = 1 か？
		bsf	PORTC,maxDIN	;Yes, maxDIN="H"
		bsf	PORTC,maxCLK	;maxCLK="H"
		nop
		bcf	PORTC,maxCLK	;maxCLK="L"

		rlf	maxtmp,F	;送り出しデータを 1ビット左にシフト
		decfsz	mbit_cnt,F	;8ビット送信した か？
		goto	mbsend01	;No

		return		

;--------------------------------------------------------------------------

;		全 Digit レジスタのクリア

digit_reg_clr
		movlw	h'08'		;Digit レジスタ数
		movwf	reg_addr	;ループカウンタ にセット

dclr01		call	max_reg_clr	;指定レジスタのクリア
		decfsz	reg_addr,F	;ループカウンタ - 1 = 0 か？
		goto	dclr01		;No

		return

;--------------------------------------------------------------------------

;		LED を 1 秒間消灯

led_1s_off
		movlw	h'0c'		;シャットダウンレジスタ
		movwf	reg_addr
		clrf	reg_data	;シャットダウン（LED 消灯）
		call	max_reg_cont

		call	wait_1sec	;1 秒 ウェイト

		movlw	h'0c'		;シャットダウンレジスタ
		movwf	reg_addr
		movlw	h'01'		;通常動作
		movwf	reg_data
		call	max_reg_cont
		return		

;==========================================================================
;==========================================================================
;			メイン・ルーチン
;==========================================================================
;==========================================================================

;		mod_flg. bit7:   表示変更フラグ
;			 bit1-0: 表示モードフラグ: 0:時間, 1:年月日, 2:オート, (3:SET)

main
		btfsc	mod_flg,7	;表示変更フラグ = ON か？
		goto	main01		;Yes

		btfss	int_flg,0	;RTC DS3231 からデータ読み出し要求フラグ = ON（１秒周期） か？
		goto	main02		;No

main01		Rtc_Read_M  seconds,7	;RTC DS3231 から年月日、時分秒を読み出し
		call	buffer_to_counter

		; 各表示モードの処理

		bcf	mod_flg,7	;表示変更フラグ = OFF
		movf	mod_flg,W
		btfsc	STATUS,Z	;mod_flg = 0 か？
		call	time_display	;Yes. 時分秒の表示

		movlw	1
		subwf	mod_flg,W
		btfsc	STATUS,Z	;mod_flg = 1 か？
		call	date_display	;Yes. 年月日の表示

		movlw	2
		subwf	mod_flg,W
		btfsc	STATUS,Z	;mod_flg = 2 か？
		call	auto_display	;Yes. オートの表示

		bcf	int_flg,0	;RTC DS3231 からデータ読み出し要求フラグ = OFF

		call	time_signal	;時報音出力コントロール	
		call	alarm_sound	;アラームフラグの監視とアラーム音出力

		; 各スイッチの ON／OFF 状態のチェック

main02		btfss	PORTA,_swMOD	;MODE / SET スイッチ = ON か？
		call	mode_switch	;Yes

		btfss	PORTA,_swUP	;UP / TIME MODE スイッチ = ON か？
		call	tmode_switch	;Yes

		btfss	PORTA,_swZER	;ZERO スイッチ = ON か？
		call	zero_switch	;Yes

		btfss	PORTA,_swSIG	;SIGNAL スイッチ = ON か？
		call	signal_switch	;Yes
		goto	main

;==========================================================================

;--------------------------------------------------------------------------
;		バッファと BCD カウンタ間のデータ移動
;--------------------------------------------------------------------------

		; バッファからカウンタへコピー

buffer_to_counter
		clrf	hhmmss_flg	;時分秒の変更フラグの初期設定
		clrf	yynnddw_flg	;年月日曜日の変更フラグの初期設定

		; 秒 BCD カウンタのチェックとコピー
		movf	bcd_ss,W	;秒 BCD カウンタ(旧)
		movwf	work1
		movf	seconds,W	;Seconds
		movwf	bcd_ss		;秒 BCD カウンタ(新)
		bsf	hhmmss_flg,0	;秒下位フラグ = ON

		andlw	h'f0'		;seconds(上位)
		xorwf	work1,W		;比較
		andlw	h'f0'
		btfsc	STATUS,Z	;seconds(上位) = (旧)bcd_ss(上位) か？
		goto	btc01		;Yes

		bsf	hhmmss_flg,1	;秒上位フラグ = ON

		; 分 BCD カウンタのチェックとコピー
		movf	bcd_mm,W	;分 BCD カウンタ(旧)
		movwf	work1
		andlw	h'0f'		;bcd_mm(下位)
		xorwf	minutes,W	;比較
		andlw	h'0f'
		btfsc	STATUS,Z	;Minutes(下位) = (旧)bcd_mm(下位) か？
		goto	btc01		;Yes

		movf	minutes,W	;Minutes
		movwf	bcd_mm		;分 BCD カウンタ(新)
		bsf	hhmmss_flg,2	;分下位フラグ = ON

		andlw	h'f0'		;Minutes(上位)
		xorwf	work1,W		;比較
		andlw	h'f0'
		btfsc	STATUS,Z	;Minutes(上位) = (旧)bcd_mm(上位) か？
		goto	btc01		;Yes

		bsf	hhmmss_flg,3	;分上位フラグ = ON

		; 時 BCD カウンタのチェックとコピー
		movf	bcd_hh,W	;時 BCD カウンタ(旧)
		movwf	work1
		andlw	h'0f'		;bcd_hh(下位)
		xorwf	hours,W		;比較
		andlw	h'0f'
		btfsc	STATUS,Z	;Hours(下位) = (旧)bcd_hh(下位) か？
		goto	btc01		;Yes

		movf	hours,W		;Hours
		movwf	bcd_hh		;時 BCD カウンタ(新)
		bsf	hhmmss_flg,4	;時下位フラグ = ON

		andlw	h'f0'		;Hours(上位)
		xorwf	work1,W		;比較
		andlw	h'f0'
		btfsc	STATUS,Z	;Hours(上位) = (旧)bcd_hh(上位) か？
		goto	btc01		;Yes

		bsf	hhmmss_flg,5	;時上位フラグ = ON
;
		; 曜日 BCD カウンタのチェックとコピー
		movf	day,W		;Day
		xorwf	bcd_ww,W	;
		btfsc	STATUS,Z	;Day = bcd_ww か？
		goto	btc01		;Yes

		movf	day,W		;Day
		movwf	bcd_ww		;曜日 BCD カウンタ
		bsf	yynnddw_flg,0	;曜日フラグ = ON

		; 日 BCD カウンタのチェックとコピー
		movf	bcd_dd,W	;日 BCD カウンタ(旧)
		movwf	work1
		movf	date,W		;Date
		movwf	bcd_dd		;日 BCD カウンタ
		bsf	yynnddw_flg,1	;日下位フラグ = ON

		andlw	h'f0'		;Date(上位)
		xorwf	work1,W		;比較
		andlw	h'f0'
		btfsc	STATUS,Z	;Date(上位) = (旧)bcd_dd(上位) か？
		goto	btc01		;Yes

		bsf	yynnddw_flg,2	;日上位フラグ = ON

		; 月 BCD カウンタのチェックとコピー
		movf	bcd_nn,W	;月 BCD カウンタ(旧)
		movwf	work1
		andlw	h'0f'		;bcd_nn(下位)
		xorwf	month,W		;比較
		andlw	h'0f'
		btfsc	STATUS,Z	;Month(下位) = (旧)bcd_nn(下位) か？
		goto	btc01		;Yes

		movf	month,W		;Month
		andlw	h'1f'		;
		movwf	bcd_nn		;月 BCD カウンタ(新)
		bsf	yynnddw_flg,3	;月下位フラグ = ON

		andlw	h'f0'		;Month(上位)
		xorwf	work1,W		;比較
		andlw	h'f0'
		btfsc	STATUS,Z	;Month(上位) = (旧)bcd_nn(上位) か？
		goto	btc01		;Yes

		bsf	yynnddw_flg,4	;月上位フラグ = ON

		; 年 BCD カウンタのチェックとコピー
		movf	bcd_yy,W	;年 BCD カウンタ(旧)
		movwf	work1
		andlw	h'0f'		;bcd_yy(下位)
		xorwf	year,W		;比較
		andlw	h'0f'
		btfsc	STATUS,Z	;Year(下位) = (旧)bcd_yy(下位) か？
		goto	btc01		;Yes

		movf	year,W		;Year
		movwf	bcd_yy		;年 BCD カウンタ(新)
		bsf	yynnddw_flg,5	;年下位フラグ = ON

		andlw	h'f0'		;Year(上位)
		xorwf	work1,W		;比較
		andlw	h'f0'
		btfsc	STATUS,Z	;Year(上位) = (旧)bcd_yy(上位) か？
		goto	btc01		;Yes

		bsf	yynnddw_flg,6	;年上位フラグ = ON

btc01		btfss	mod_flg,7	;表示変更フラグ = ON か？
		goto	btc02		;No

		movlw	h'7e'		;全桁強制表示
		movwf	yynnddw_flg
		movlw	h'3f'		;全桁強制表示
		movwf	hhmmss_flg

btc02		return

;--------------------------------------------------------------------------

		; カウンタからバッファへコピー

counter_to_buffer
		movf	bcd_ss,W	;秒 BCD カウンタ
		movwf	seconds		;Seconds
		movf	bcd_mm,W	;分 BCD カウンタ
		movwf	minutes		;Minutes
		movf	bcd_hh,W	;時 BCD カウンタ
		movwf	hours		;Hours

		movf	bcd_ww,W	;曜日 BCD カウンタ
		movwf	day		;Day

		movf	bcd_dd,W	;日 BCD カウンタ
		movwf	date		;Date
		movf	bcd_nn,W	;月 BCD カウンタ
		movwf	month		;Month
		movf	bcd_yy,W	;年 BCD カウンタ
		movwf	year		;Year
		return

;==========================================================================
;	各スイッチのメイン・ルーチンでの処理と SET モードでの処理
;==========================================================================
;--------------------------------------------------------------------------
;	   MODE / SET スイッチの処理 ... メイン・ルーチンから CALL
;--------------------------------------------------------------------------

mode_switch
		call	wait_30ms	;チャッタリング吸収
		btfsc	PORTA,_swMOD	;再度 MODE スイッチ = ON か？
		goto	modsw10		;No

		movlw	60		;50ms x 60 = 3 秒間の監視
		movwf	lp_cnt1		;ループカウンタ

modsw01		call	wait_50ms	;50m 秒 ウエイト

		movlw	h'7f'
		andwf	mod_flg,W
		btfss	STATUS,Z	;mod_flg = 0 か？
		goto	modsw02		;No

		btfss	int_flg,0	;RTC DS3231 からデータ読み出し要求フラグ = ON か？	;
		goto	modsw02		;No							;
												;これらの命令がないと
		Rtc_Read_M  seconds,7	;RTC DS3231 から年月日、時分秒を読み出し		;表示が停止して違和感
		call	buffer_to_counter							;を感じたので挿入した
		call	time_display	;時分秒の表示						;
		bcf	int_flg,0	;RTC DS3231 からデータ読み出し要求フラグ = OFF		;
modsw02												;
		btfsc	PORTA,_swMOD	;MODEスイッチ = OFF か？
		goto	modsw03		;Yes

		decfsz	lp_cnt1,F	;ループカウンタ - 1 = 0 か？
		goto	modsw01		;No
		goto	modsw04		;Yes

		; 表示モードフラグの更新

modsw03		incf	mod_flg,F	;表示モードフラグの更新
		movlw	3
		subwf	mod_flg,W
		btfsc	STATUS,Z	;表示モードフラグ = 3 か？
		clrf	mod_flg		;Yes. mod_flg = 0 にクリア
		bsf	mod_flg,7	;表示変更フラグ = ON
		goto	modsw10

;--------------------------------------------------------------------------

		;;;;; SET モードに移行 ;;;;;

modsw04		bcf	INTCON,INTE	;INTE: 外部(RA2/INT)割り込みを禁止

		maxRegSet	h'09', b'11011011'	;デコードモード, Digit 5,2: デコードなし

		maxRegSet	h'08', h'0a'		;Digit 7, "-"
		maxRegSet	h'07', h'0a'		;Digit 6, "-"
		maxRegSet	h'06', h'00'		;Digit 5, " "
		maxRegSet	h'05', h'0a'		;Digit 4, "-"
		maxRegSet	h'04', h'0a'		;Digit 3, "-"
		maxRegSet	h'03', h'00'		;Digit 2, " "
		maxRegSet	h'02', h'0a'		;Digit 1, "-"
		maxRegSet	h'01', h'0a'		;Digit 0, "-"

		btfss	PORTA,_swSET	;MODE/SET スイッチ = OFF か？
		goto	$ - 1		;No

;		movlw	3		;(SET モード)
;		movwf	mod_flg		;表示モードフラグ = 3
		clrf	tg_point	;対象の位置ポインタ = 0
		clrf	chg_flg		;データ変更フラグの初期設定
		clrf	int_flg		;

		movlw	tm0_h_val	;ハードタイマー０カウント値を
		movwf	TMR0		;TMR0 に設定
		movlw	tm0_s_val	;ソフトタイマー０カウント値を
		movwf	tm0_s_cnt	;ソフトタイマー０カウンタに設定
		bsf	INTCON,T0IE	;bit5(T0IE)=1: タイマー０割り込み許可

		; SET モード中の LED 表示

modsw05		bcf	chg_flg,0	;対象の位置の変更フラグ = 0
		movlw	3		;
		subwf	tg_point,W	;
		btfsc	STATUS,C	;対象の位置ポインタ < 3 か？
		goto	modsw06		;No

		movlw	h'7e'		;全桁強制表示
		movwf	yynnddw_flg
		incf	tg_point,F	;LED 表示のときだけ +1 する
		call	date_display	;年月日の表示
		decf	tg_point,F	;元に戻す
		goto	modsw07

modsw06		movlw	h'3f'		;全桁強制表示
		movwf	hhmmss_flg
		incf	tg_point,F	;LED 表示のときだけ +1 する
		call	time_display	;時分秒の表示
		decf	tg_point,F	;元に戻す

		; 各スイッチの入力処理

modsw07		btfss	PORTA,_swSET	;SET スイッチ = ON か？
		call	set_switch	;Yes

		btfss	PORTA,_swUP	;UP スイッチ = ON か？
		call	up_switch	;Yes

		btfss	PORTA,_swDWN	;DOWN スイッチ = ON か？
		call	down_switch	;Yes

		btfss	PORTA,_swBAK	;BACK スイッチ = ON か？
		call	back_switch	;Yes

		movlw	6
		subwf	tg_point,W
		btfsc	STATUS,Z	;終了 tg_point = 6 か？
		goto	modsw08		;Yes

		movlw	h'03'
		andwf	chg_flg,W
		btfss	STATUS,Z	;どれかのキー操作があった か？
		goto	modsw05		;Yes

		btfss	blk_flg,1	;全桁強制表示フラグ(200 mS 毎に ON) = ON か？
		goto	modsw07		;No

		bcf	blk_flg,1	;全桁強制表示フラグ = OFF
		goto	modsw05

		; SET モードの終了処理

modsw08		bcf	INTCON,T0IE	;タイマー０割り込みを禁止
		clrf	blk_flg		;ブリンク表示フラグをクリア

		btfss	PORTA,_swSET	;SET スイッチ = OFF か？
		goto	$ - 1		;No

		btfss	chg_flg,1	;対象の位置のデータ変更があった か？
		goto	modsw09		;No

		call	counter_to_buffer
		Rtc_Write_M  seconds,7	;RTC DS3231 へ年月日、時分秒を書き込み

modsw09		clrf	tg_point	;対象の位置ポインタをクリア
		clrf	chg_flg		;データ変更フラグをクリア
		clrf	mod_flg		;表示モードフラグをクリア
		bsf	mod_flg,7	;表示変更フラグ = ON
		bsf	INTCON,INTE	;INTE: 外部(RA2/INT)割り込みを禁止解除

modsw10		btfss	PORTA,_swMOD	;MODE スイッチ = OFF か？
		goto	$ - 1		;No

		return

;--------------------------------------------------------------------------
;	      SET スイッチの処理 ... SET モードから CALL
;--------------------------------------------------------------------------

set_switch
		call	wait_30ms	;チャッタリング吸収
		btfsc	PORTA,_swSET	;再度 SET スイッチ = ON か？
		goto	setsw01		;No

		bsf	chg_flg,0	;対象の位置の変更フラグ = ON
		incf	tg_point,F	;対象の位置ポインタ + 1

setsw01		btfss	PORTA,_swSET	;SET スイッチ = OFF か？
		goto	$ - 1		;No

		call	wait_30ms	;チャッタリング吸収
		return

;--------------------------------------------------------------------------
;	      UP スイッチの処理 ... SET モードから CALL
;--------------------------------------------------------------------------

up_switch
		call	wait_30ms	;チャッタリング吸収
		btfsc	PORTA,_swUP	;再度 UP スイッチ = ON か？
		goto	upsw07		;No

		bsf	chg_flg,1	;対象の位置のデータ変更フラグ = ON
		movf	tg_point,W
		btfss	STATUS,Z	;tg_point = 0 か？
		goto	upsw01		;No

		call	bcd_yl_inc	;年 BCD カウンタのインクリメント
		goto	upsw03

upsw01		movlw	1
		subwf	tg_point,W
		btfss	STATUS,Z	;tg_point = 1 か？
		goto	upsw02		;No

		call	bcd_nn_inc	;月 BCD カウンタのインクリメント
		goto	upsw03

upsw02		movlw	2
		subwf	tg_point,W
		btfss	STATUS,Z	;tg_point = 2 か？
		goto	upsw04		;No

		call	bcd_dd_inc	;日 BCD カウンタのインクリメント

upsw03		call	day_week	;該当日の曜日を取得
		movwf	bcd_ww		;曜日 BCD カウンタ
		goto	upsw07

upsw04		movlw	3
		subwf	tg_point,W
		btfss	STATUS,Z	;tg_point = 3 か？
		goto	upsw05		;No

		call	bcd_hh_inc	;時 BCD カウンタのインクリメント
		goto	upsw07

upsw05		movlw	4
		subwf	tg_point,W
		btfss	STATUS,Z	;tg_point = 4 か？
		goto	upsw06		;No

		call	bcd_mm_inc	;分 BCD カウンタのインクリメント
		goto	upsw07

upsw06	;	movlw	5
	;	subwf	tg_point,W
	;	btfss	STATUS,Z	;tg_point = 5 か？
	;	goto	upsw07		;No

		call	bcd_ss_inc	;秒 BCD カウンタのインクリメント

upsw07	;	btfss	PORTA,_swUP	;UP スイッチ = OFF か？
	;	goto	$ - 1		;No

		call	wait_200ms	;早送りの速度調整
		return

;--------------------------------------------------------------------------
;	     DOWN スイッチの処理 ... SET モードから CALL
;--------------------------------------------------------------------------

down_switch
		call	wait_30ms	;チャッタリング吸収
		btfsc	PORTA,_swDWN	;再度 DOWN スイッチ = ON か？
		goto	dwnsw07		;No

		bsf	chg_flg,1	;対象の位置のデータ変更フラグ = ON
		movf	tg_point,W
		btfss	STATUS,Z	;tg_point = 0 か？
		goto	dwnsw01		;No

		call	bcd_yl_dec	;年 BCD カウンタのデクリメント
		goto	dwnsw03

dwnsw01		movlw	1
		subwf	tg_point,W
		btfss	STATUS,Z	;tg_point = 1 か？
		goto	dwnsw02		;No

		call	bcd_nn_dec	;月 BCD カウンタのデクリメント
		goto	dwnsw03

dwnsw02		movlw	2
		subwf	tg_point,W
		btfss	STATUS,Z	;tg_point = 2 か？
		goto	dwnsw04		;No

		call	bcd_dd_dec	;日 BCD カウンタのデクリメント

dwnsw03		call	day_week	;該当日の曜日を取得
		movwf	bcd_ww		;曜日 BCD カウンタ
		goto	dwnsw07

dwnsw04		movlw	3
		subwf	tg_point,W
		btfss	STATUS,Z	;tg_point = 3 か？
		goto	dwnsw05		;No

		call	bcd_hh_dec	;時 BCD カウンタのデクリメント
		goto	dwnsw07

dwnsw05		movlw	4
		subwf	tg_point,W
		btfss	STATUS,Z	;tg_point = 4 か？
		goto	dwnsw06		;No

		call	bcd_mm_dec	;分 BCD カウンタのデクリメント
		goto	dwnsw07

dwnsw06	;	movlw	5
	;	subwf	tg_point,W
	;	btfss	STATUS,Z	;tg_point = 5 か？
	;	goto	dwnsw07		;No

		call	bcd_ss_dec	;秒 BCD カウンタのデクリメント

dwnsw07	;	btfss	PORTA,_swDWN	;DWN スイッチ = OFF か？
	;	goto	$ - 1		;No

		call	wait_200ms	;早送りの速度調整
		return

;--------------------------------------------------------------------------
;	     BACK スイッチの処理 ... SET モードから CALL
;--------------------------------------------------------------------------

back_switch
		call	wait_30ms	;チャッタリング吸収
		btfsc	PORTA,_swBAK	;再度 BACK スイッチ = ON か？
		goto	baksw01		;No

		bsf	chg_flg,0	;対象の位置の変更フラグ = ON
		decf	tg_point,F	;対象の位置ポインタ - 1
		incf	tg_point,W
		btfss	STATUS,Z	;対象の位置ポインタ = 0 か？
		goto	baksw01		;No

		movlw	5		;
		movwf	tg_point	;最大値 tg_point = 5 に設定

baksw01		btfss	PORTA,_swBAK	;BACK スイッチ = OFF か？
		goto	$ - 1		;No

		call	wait_30ms	;チャッタリング吸収
		return

;--------------------------------------------------------------------------
;	UP / TIME MODE スイッチの処理 ... メイン・ルーチンから CALL
;--------------------------------------------------------------------------

tmode_switch
		call	wait_30ms	;チャッタリング吸収
		btfsc	PORTA,_swUP	;再度 UP スイッチ = ON か？
		goto	tmodsw01	;No

		movlw	b'00000010'
		xorwf	time_flg,F	;時間表示モードフラグ bit1=0:24H/1:12H, bit0=0:am/1:pm
		bsf	mod_flg,7	;表示変更フラグ = ON

tmodsw01	btfss	PORTA,_swUP	;UP スイッチ = OFF か？
		goto	$ - 1		;No

		call	wait_30ms	;チャッタリング吸収
		return

;--------------------------------------------------------------------------
;	     ZERO スイッチの処理 ... メイン・ルーチンから CALL
;--------------------------------------------------------------------------

zero_switch
		call	wait_30ms	;チャッタリング吸収
		btfsc	PORTA,_swZER	;再度 ZERO スイッチ = ON か？
		goto	zersw04		;No

		movlw	h'05'
		subwf	bcd_mm,W
		btfss	STATUS,C	;分 BCD カウンタ < h'05' か？
		goto	zersw02		;Yes

		movlw	h'55'
		subwf	bcd_mm,W
		btfss	STATUS,C	;分 BCD カウンタ >= h'55' か？
	;;	goto	zersw04		;No. 無視
		goto	zersw11		;No					; (Ver.1.01 で機能追加)

		bcf	INTCON,INTE	;INTE: 外部(RA2/INT)割り込みを禁止
		call	bcd_hh_inc	;時 BCD カウンタのインクリメント
		movf	bcd_hh,W
		btfss	STATUS,Z	;時 BCD カウンタ = h'00' か？
		goto	zersw03		;No

		call	bcd_dd_inc	;日 BCD カウンタのインクリメント
		movlw	h'01'
		subwf	bcd_dd,W
		btfss	STATUS,Z	;日 BCD カウンタ = h'01' か？
		goto	zersw01		;No

		call	bcd_nn_inc	;月 BCD カウンタのインクリメント
		movlw	h'01'
		subwf	bcd_nn,W
		btfss	STATUS,Z	;月 BCD カウンタ = h'01' か？
		goto	zersw01		;No

		call	bcd_yl_inc	;年(下位2桁) BCD カウンタのインクリメント

zersw01		call	day_week	;該当日の曜日を取得
		movwf	bcd_ww		;曜日 BCD カウンタ
		goto	zersw03

zersw02		bcf	INTCON,INTE	;INTE: 外部(RA2/INT)割り込みを禁止

zersw03		clrf	bcd_mm		;分 BCD カウンタのクリア
		clrf	bcd_ss		;秒 BCD カウンタのクリア
		call	counter_to_buffer
		Rtc_Write_M  seconds,7	;RTC DS3231 へ年月日、時分秒を書き込み

		bsf	INTCON,INTE	;INTE: 外部(RA2/INT)割り込みを禁止解除
		bsf	mod_flg,7	;表示変更フラグ = ON, （強制再表示）

zersw04		btfss	PORTA,_swZER	;ZERO スイッチ = OFF か？
		goto	$ - 1		;No

		call	wait_30ms	;チャッタリング吸収
		return

;--------------------------------------------------------------------------

		;;;;; 輝度調節機能の追加 (Ver.1.01) ;;;;;

		; intensity		;bit7: 輝度更新フラグ, bit3-0: 輝度調節値 (h'00' ～ h'09')
		; blk_flg		;bit2: 輝度調節識別フラグ
		;			;bit1: 全桁強制表示フラグ
		;			;bit0: ブリンク表示フラグ

zersw11		btfss	int_flg,0	;RTC DS3231 からデータ読み出し要求フラグ = ON（１秒周期） か？
		goto	zersw12		;No

		Rtc_Read_M  seconds,7	;RTC DS3231 から年月日、時分秒を読み出し
		call	buffer_to_counter
		bcf	int_flg,0	;RTC DS3231 からデータ読み出し要求フラグ = OFF
		goto	zersw15

		; 輝度調節中の LED 表示

zersw12		btfss	blk_flg,2	;輝度調節識別フラグ = ON か？
		goto	zersw13		;No

		btfss	blk_flg,1	;全桁強制表示フラグ = ON か？
		goto	zersw16		;No

		bcf	blk_flg,1	;全桁強制表示フラグ = OFF
		goto	zersw14

zersw13		movf	tg_point,W	;対象の位置ポインタ
		btfsc	STATUS,Z	;tg_point = 0 か？
		goto	zersw16		;Yes

		clrf	tg_point	;対象の位置ポインタをクリア

zersw14		movlw	h'3f'		;時分秒の全桁強制表示
		movwf	hhmmss_flg
		movlw	h'7e'		;年月日の全桁強制表示
		movwf	yynnddw_flg

zersw15		movf	mod_flg,W
		btfsc	STATUS,Z	;mod_flg = 0 か？
		call	time_display	;Yes. 時分秒の表示

		movlw	1
		subwf	mod_flg,W
		btfsc	STATUS,Z	;mod_flg = 1 か？
		call	date_display	;Yes. 年月日の表示

		movlw	2
		subwf	mod_flg,W
		btfsc	STATUS,Z	;mod_flg = 2 か？
		call	auto_display	;Yes. オートの表示

		; 各スイッチの入力と輝度調節

zersw16		btfss	PORTA,_swUP	;UP スイッチ = ON か？
		call	z_up_switch	;Yes

		btfss	PORTA,_swDWN	;DOWN スイッチ = ON か？
		call	z_down_switch	;Yes

		btfss	intensity,7	;輝度更新フラグ = ON か？
		goto	zersw17		;No

		bcf	intensity,7	;輝度更新フラグ = OFF
		movlw	h'0a'		;輝度レジスタ
		movwf	reg_addr
		movf	intensity,W	;輝度調節値
		movwf	reg_data
		call	max_reg_cont

		; 輝度更新の表示（DP のブリンク表示等）手続き

		movlw	5		;200 mS x 5 = 1000 mS = 1 秒
		movwf	blk_cnt		;ブリンク時間カウンタに設定
		movlw	b'00000111'	;(bit2, 1, 0 = ON にする)
		movwf	blk_flg		;(1秒間で3回点灯させるため)

		movlw	tm0_h_val	;ハードタイマー０カウント値を
		movwf	TMR0		;TMR0 に設定
		movlw	tm0_s_val	;ソフトタイマー０カウント値を
		movwf	tm0_s_cnt	;ソフトタイマー０カウンタに設定
		bsf	INTCON,T0IE	;bit5(T0IE)=1: タイマー０割り込み許可
		goto	zersw12

zersw17		btfss	PORTA,_swZER	;ZERO スイッチ = ON か？
		goto	zersw11		;Yes

		; 輝度調節処理の終了

		clrf	tg_point	;対象の位置ポインタをクリア
		clrf	blk_flg		;ブリンク表示フラグをクリア
		bsf	mod_flg,7	;表示変更フラグ = ON
		call	counter_new	;強制コピー手続き
		goto	zersw04

;--------------------------------------------------------------------------
;	      UP スイッチの処理 ... 輝度調節機能から CALL			; (Ver.1.01) で追加
;--------------------------------------------------------------------------

z_up_switch
		call	wait_30ms	;チャッタリング吸収
		btfsc	PORTA,_swUP	;再度 UP スイッチ = ON か？
		goto	zupsw01		;No

		incf	intensity,F	;+1 更新
		movlw	h'0a'		;MAX h'0f' を h'09' に制限した
		subwf	intensity,W
		btfsc	STATUS,C	;intensity >= h'0a' か？
		decf	intensity,F	;Yes. MAX 値(= h'09') にする
		bsf	intensity,7	;輝度更新フラグ = ON

zupsw01		btfss	PORTA,_swUP	;UP スイッチ = OFF か？
		goto	$ - 1		;No

		call	wait_30ms	;チャッタリング吸収
		return

;--------------------------------------------------------------------------
;	     DOWN スイッチの処理 ... 輝度調節機能から CALL			; (Ver.1.01) で追加
;--------------------------------------------------------------------------

z_down_switch
		call	wait_30ms	;チャッタリング吸収
		btfsc	PORTA,_swDWN	;再度 DOWN スイッチ = ON か？
		goto	zdwsw01		;No

		decf	intensity,F	;-1 更新
		incf	intensity,W	;
		btfsc	STATUS,Z	;intensity = h'00' か？
		clrf	intensity	;Yes. MIN 値(= h'00') にする
		bsf	intensity,7	;輝度更新フラグ = ON

zdwsw01		btfss	PORTA,_swDWN	;DOWN スイッチ = OFF か？
		goto	$ - 1		;No

		call	wait_30ms	;チャッタリング吸収
		return

;--------------------------------------------------------------------------
;	     SIGNAL スイッチの処理 ... メイン・ルーチンから CALL
;--------------------------------------------------------------------------

;出力:	alm_flg: アラーム音出力フラグ ( bit0:時報予報音, bit1:時報正報音, bit7:出力許可 )

signal_switch
		call	wait_30ms	;チャッタリング吸収
		btfsc	PORTA,_swSIG	;再度 SIGNAL スイッチ = ON か？
		goto	sigsw01		;No

		movlw	b'10000000'
		xorwf	alm_flg,F	;アラーム音出力許可フラグの更新

		btfsc	alm_flg,7	;アラーム音出力許可フラグ = ON か？
		call	buzzer_pipipi	;Yes. 許可  "ピピピッ" ブザー音出力
		btfss	alm_flg,7	;アラーム音出力許可フラグ = OFF か？
		call	buzzer_buu	;Yes. 禁止  "ブー" ブザー音出力

sigsw01		btfss	PORTA,_swSIG	;SIGNAL スイッチ = OFF か？
		goto	$ - 1		;No

		call	wait_30ms	;チャッタリング吸収
		return

;==========================================================================
;	    各 BCD カウンタのインクリメント / デクリメント計算
;==========================================================================
;--------------------------------------------------------------------------
;		日 BCD カウンタのインクリメント
;--------------------------------------------------------------------------

bcd_dd_inc
		call	month_days	;各月の日数計算
		subwf	bcd_dd,W
		btfss	STATUS,Z	;日 BCD カウンタ = 各月の最終日 か？
		goto	ddinc01		;No

		movlw	h'01'
		movwf	bcd_dd		;日 BCD カウンタ = h'01' 設定
		goto	ddinc02

ddinc01		movlw	bcd_dd		;日 BCD カウンタの番地
		movwf	FSR		;間接アドレスに設定
		call	inc_bcd		;BCD インクリメント

ddinc02		return

;--------------------------------------------------------------------------

;		各月の日数計算

month_days
		movlw	h'02'
		subwf	bcd_nn,W
		btfss	STATUS,Z	;月 BCD カウンタ = h'02' か？
		goto	mday02		;No

		movf	bcd_yl,W	;年(下位2桁) BCD カウンタ
		movwf	cur_yl
		movf	bcd_yh,W	;年(上位2桁) BCD カウンタ
		movwf	cur_yh
		call	uruu_check	;平年／閏年の判定
		btfss	uru_flg,0	;閏年 か？
		goto	mday01		;No

		movlw	h'29'		;閏年 2月
		goto	mday04

mday01		movlw	h'28'		;平年 2月
		goto	mday04

mday02		movlw	h'04'
		subwf	bcd_nn,W
		btfsc	STATUS,Z	;月 BCD カウンタ = h'04' か？
		goto	mday03		;Yes

		movlw	h'06'
		subwf	bcd_nn,W
		btfsc	STATUS,Z	;月 BCD カウンタ = h'06' か？
		goto	mday03		;Yes

		movlw	h'09'
		subwf	bcd_nn,W
		btfsc	STATUS,Z	;月 BCD カウンタ = h'09' か？
		goto	mday03		;Yes

		movlw	h'11'
		subwf	bcd_nn,W
		btfsc	STATUS,Z	;月 BCD カウンタ = h'11' か？
		goto	mday03		;Yes

		movlw	h'31'		;h'01', h'03', h'05', h'07', h'08', h'10', h'12'
		goto	mday04

mday03		movlw	h'30'		;h'04', h'06', h'09', h'11'

mday04		return

;--------------------------------------------------------------------------

;		平年／閏年の判定

uruu_check
		clrf	uru_flg		;平年に設定

		movf	cur_yl,W	;年(下位2桁)(変) BCD カウンタ
		call	bcd2_to_binary	;BCD (2桁) からバイナリ変換
		andlw	h'03'		;下位2ビット
		btfss	STATUS,Z	;下位2ビット = b'00' か？
		goto	uru02		;No. 平年 ... 4で割れない

		movf	cur_yl,W
		btfss	STATUS,Z	;年(下位2桁)(変) BCD カウンタ = h'00' か？
		goto	uru01		;No. 閏年 ... 100で割れない

		movf	cur_yh,W	;年(上位2桁)(変) BCD カウンタ
		call	bcd2_to_binary	;BCD (2桁) からバイナリ変換
		andlw	h'03'		;下位2ビット
		btfss	STATUS,Z	;下位2ビット = b'00' か？
		goto	uru02		;No. 平年 ... 400で割れない

uru01		bsf	uru_flg,0	;閏年に設定

uru02		return

;--------------------------------------------------------------------------

;		BCD (2桁) からバイナリ変換

bcd2_to_binary
		movwf	work2		;退避
		swapf	work2,W		;上位4ビット(10位)を BCD からバイナリ変換
		andlw	h'0f'
		movwf	work1
		bcf	STATUS,C
		rlf	work1,F		;2倍
		rlf	work1,F		;4倍
		addwf	work1,F		;5倍
		rlf	work1,F		;10倍

		movf	work2,W		;下位4ビット(単位)
		andlw	h'0f'
		addwf	work1,W		;10位 + 単位 = W レジスタ
		return

;--------------------------------------------------------------------------
;		月 BCD カウンタのインクリメント
;--------------------------------------------------------------------------

bcd_nn_inc
		movlw	bcd_nn		;月 BCD カウンタの番地
		movwf	FSR		;間接アドレスに設定
		call	inc_bcd		;BCD インクリメント

		movlw	h'13'
		subwf	bcd_nn,W
		btfss	STATUS,Z	;月 BCD カウンタ = h'13' か？
		goto	nninc01		;No

		movlw	h'01'
		movwf	bcd_nn		;月 BCD カウンタ = h'01' 設定

nninc01		return

#ifdef comment
;--------------------------------------------------------------------------
;		年(4桁) BCD カウンタのインクリメント
;--------------------------------------------------------------------------

bcd_yyyy_inc
		call	bcd_yl_inc	;年(下位2桁) BCD カウンタのインクリメント
		btfss	STATUS,C	;年(下位2桁) BCD カウンタ >= 'a0' か？
		goto	yyinc01		;No

		call	bcd_yh_inc	;年(上位2桁) BCD カウンタのインクリメント
		btfss	STATUS,C	;年(上位2桁) BCD カウンタ >= 'a0' か？
		goto	yyinc01		;No

		movlw	h'01'
		movwf	bcd_yl		;9999 → (0000) → 0001

yyinc01		return
#endif

;--------------------------------------------------------------------------
;		年(下位2桁) BCD カウンタのインクリメント
;--------------------------------------------------------------------------

bcd_yl_inc
		movlw	bcd_yl		;年(下位2桁) BCD カウンタの番地
		movwf	FSR		;間接アドレスに設定
		call	inc_bcd		;BCD インクリメント

		movlw	h'a0'
		subwf	bcd_yl,W
		btfss	STATUS,Z	;年(下位2桁) BCD カウンタ = 'a0' か？
		goto	ylinc01		;No

		clrf	bcd_yl		;年(下位2桁) BCD カウンタ = h'00' 設定

ylinc01		return

#ifdef comment
;--------------------------------------------------------------------------
;		年(上位2桁) BCD カウンタのインクリメント
;--------------------------------------------------------------------------

bcd_yh_inc
		movlw	bcd_yh		;年(上位2桁) BCD カウンタの番地
		movwf	FSR		;間接アドレスに設定
		call	inc_bcd		;BCD インクリメント

		movlw	h'a0'
		subwf	bcd_yh,W
		btfss	STATUS,Z	;年(上位2桁) BCD カウンタ = 'a0' か？
		goto	yhinc01		;No

		clrf	bcd_yh		;年(上位2桁) BCD カウンタ = h'00' 設定

yhinc01		return
#endif

;--------------------------------------------------------------------------
;		日 BCD カウンタのデクリメント
;--------------------------------------------------------------------------

bcd_dd_dec
		decf	bcd_dd,F	;日 BCD カウンタ -1 更新
		btfss	STATUS,Z	;日 BCD カウンタ = h'00' か？
		goto	dddec01		;No

		call	month_days	;各月の日数計算
		movwf	bcd_dd		;日 BCD カウンタ 設定
		goto	dddec02

dddec01		movf	bcd_dd,W
		andlw	h'0f'		;下位4ビット
		sublw	h'0f'
		btfss	STATUS,Z	;下位4ビット = h'0f' か？
		goto	dddec02		;No

		movlw	h'06'
		subwf	bcd_dd,F	;日 BCD カウンタ 更新

dddec02		return

;--------------------------------------------------------------------------
;		月 BCD カウンタのデクリメント
;--------------------------------------------------------------------------

bcd_nn_dec
		decf	bcd_nn,F	;月 BCD カウンタ -1 更新
		btfss	STATUS,Z	;月 BCD カウンタ = h'00' か？
		goto	nndec01		;No

		movlw	h'12'
		goto	nndec02

nndec01		movlw	h'0f'
		subwf	bcd_nn,W
		btfss	STATUS,Z	;月 BCD カウンタ = h'0f' か？
		goto	nndec03		;No

		movlw	h'09'

nndec02		movwf	bcd_nn		;月 BCD カウンタの設定

nndec03		return

#ifdef comment
;--------------------------------------------------------------------------
;		年(4桁) BCD カウンタのデクリメント
;--------------------------------------------------------------------------

bcd_yyyy_dec
		call	bcd_yl_dec	;年(下位2桁) BCD カウンタのデクリメント
		movf	bcd_yl,W
		btfsc	STATUS,Z	;年(下位2桁) BCD カウンタ <> '00' か？
		goto	yydec01		;No
		
		movlw	h'99'
		subwf	bcd_yl,W
		btfss	STATUS,Z	;年(下位2桁) BCD カウンタ = '99' か？
		goto	yydec02		;No

		call	bcd_yh_dec	;年(上位2桁) BCD カウンタのデクリメント
		goto	yydec02

yydec01		movf	bcd_yh,W
		btfss	STATUS,Z	;年(上位2桁) BCD カウンタ = '00' か？
		goto	yydec02		;No

		movlw	h'99'
		movwf	bcd_yh
		movwf	bcd_yl		;0001 → (0000) → 9999

yydec02		return
#endif

;--------------------------------------------------------------------------
;		年(下位2桁) BCD カウンタのデクリメント
;--------------------------------------------------------------------------

bcd_yl_dec
		decf	bcd_yl,F	;年(下位2桁) BCD カウンタ -1 更新
		incf	bcd_yl,W
		btfss	STATUS,Z	;年(下位2桁) BCD カウンタ = h'ff' か？
		goto	yldec01		;No

		movlw	h'66'
		subwf	bcd_yl,F	;年(下位2桁) BCD カウンタ 更新
		goto	yldec02

yldec01		movf	bcd_yl,W
		andlw	h'0f'		;下位4ビット
		sublw	h'0f'
		btfss	STATUS,Z	;下位4ビット = h'0f' か？
		goto	yldec02		;No

		movlw	h'06'
		subwf	bcd_yl,F	;年(下位2桁) BCD カウンタ 更新

yldec02		return

#ifdef comment
;--------------------------------------------------------------------------
;		年(上位2桁) BCD カウンタのデクリメント
;--------------------------------------------------------------------------

bcd_yh_dec
		decf	bcd_yh,F	;年(上位2桁) BCD カウンタ -1 更新
		incf	bcd_yh,W
		btfss	STATUS,Z	;年(上位2桁) BCD カウンタ = h'ff' か？
		goto	yhdec01		;No

		movlw	h'66'
		subwf	bcd_yh,F	;年(上位2桁) BCD カウンタ 更新
		goto	yhdec02

yhdec01		movf	bcd_yh,W
		andlw	h'0f'		;下位4ビット
		sublw	h'0f'
		btfss	STATUS,Z	;下位4ビット = h'0f' か？
		goto	yhdec02		;No

		movlw	h'06'
		subwf	bcd_yh,F	;年(上位2桁) BCD カウンタ 更新

yhdec02		return	
#endif

;--------------------------------------------------------------------------
;		秒 BCD カウンタのインクリメント
;--------------------------------------------------------------------------

bcd_ss_inc
		movlw	bcd_ss		;秒 BCD カウンタの番地
		movwf	FSR		;間接アドレスに設定
		call	inc_bcd		;BCDインクリメント
		movlw	h'60'
		subwf	bcd_ss,W
		btfsc	STATUS,C	;秒 BCD カウンタ < h'60' か？
		clrf	bcd_ss		;No. 秒 BCD カウンタのクリア
		return

;--------------------------------------------------------------------------
;		分 BCD カウンタのインクリメント
;--------------------------------------------------------------------------

bcd_mm_inc
		movlw	bcd_mm		;分 BCD カウンタの番地
		movwf	FSR		;間接アドレスに設定
		call	inc_bcd		;BCDインクリメント
		movlw	h'60'
		subwf	bcd_mm,W
		btfsc	STATUS,C	;分 BCD カウンタ < h'60' か？
		clrf	bcd_mm		;No. 分 BCD カウンタのクリア
		return

;--------------------------------------------------------------------------
;		時 BCD カウンタのインクリメント
;--------------------------------------------------------------------------

bcd_hh_inc
		movlw	bcd_hh		;時 BCD カウンタの番地
		movwf	FSR		;間接アドレスに設定
		call	inc_bcd		;BCDインクリメント
		movlw	h'24'
		subwf	bcd_hh,W
		btfsc	STATUS,C	;時 BCD カウンタ < h'24' か？
		clrf	bcd_hh		;No. 時 BCD カウンタのクリア
		return

;--------------------------------------------------------------------------
;		秒 BCD カウンタのデクリメント
;--------------------------------------------------------------------------

bcd_ss_dec
		movlw	bcd_ss		;秒 BCD カウンタの番地
		movwf	FSR		;間接アドレスに設定
		call	dec_bcd		;BCDデクリメント
		movlw	h'f9'		;h'00' - h'01' - h'06'
		subwf	bcd_ss,W
		btfss	STATUS,Z	;秒 BCD カウンタ = h'f9' か？
		goto	ssdec01		;No

		movlw	h'59'
		movwf	bcd_ss		;秒 BCD カウンタ = h'59' 設定

ssdec01		return

;--------------------------------------------------------------------------
;		分 BCD カウンタのデクリメント
;--------------------------------------------------------------------------

bcd_mm_dec
		movlw	bcd_mm		;分 BCD カウンタの番地
		movwf	FSR		;間接アドレスに設定
		call	dec_bcd		;BCDデクリメント
		movlw	h'f9'		;h'00' - h'01' - h'06'
		subwf	bcd_mm,W
		btfss	STATUS,Z	;分 BCD カウンタ = h'f9' か？
		goto	mmdec01		;No

		movlw	h'59'
		movwf	bcd_mm		;分 BCD カウンタ = h'59' 設定

mmdec01		return

;--------------------------------------------------------------------------
;		時 BCD カウンタのデクリメント
;--------------------------------------------------------------------------

bcd_hh_dec
		movlw	bcd_hh		;時 BCD カウンタの番地
		movwf	FSR		;間接アドレスに設定
		call	dec_bcd		;BCDデクリメント
		movlw	h'f9'		;h'00' - h'01' - h'06'
		subwf	bcd_hh,W
		btfss	STATUS,Z	;時 BCD カウンタ = h'f9' か？
		goto	hhdec01		;No

		movlw	h'23'
		movwf	bcd_hh		;時 BCD カウンタ = h'23' 設定

hhdec01		return

;--------------------------------------------------------------------------

;		BCD インクリメント

inc_bcd
		incf	INDF,F		;BCD カウンタ +1 更新
		movf	INDF,W
		andlw	h'0f'		;下位4ビット
		sublw	h'0a'
		btfss	STATUS,Z	;下位4ビット = d'10' か？
		return			;No

		movlw	h'06'
		addwf	INDF,F		;下位4ビット = 0, 上位4ビット = +1
		return

;--------------------------------------------------------------------------

;		BCD デクリメント

dec_bcd
		movf	INDF,W
		andlw	h'0f'		;下位4ビット
		btfsc	STATUS,Z	;下位4ビット <> h'00' か？
		goto	dec01		;No

		decf	INDF,F		;-1 更新
		return

dec01		decf	INDF,F		;-1 更新
		movlw	h'06'
		subwf	INDF,F		;下位4ビット = 9
		return

;--------------------------------------------------------------------------
;		該当日の曜日を取得
;--------------------------------------------------------------------------

; 入力:		bcd_yh: 年(上位2桁)_BCD カウンタ, bcd_yl: 年(下位2桁)_BCD カウンタ,
;		bcd_nn: 月_BCD カウンタ, bcd_dd: 日_BCD カウンタ

; 出力:		cur_week: ( 0:日, 1:月, 2:火, 3:水, 4:木, 5:金, 6:土 )
;  (+1して出力)	cur_week: ( 1:日, 2:月, 3:火, 4:水, 5:木, 6:金, 7:土 )

; ワーク:	cur_yh, cur_yl, xxx_yh, work2
; call:		bcd2_to_binary, uruu_check, inc_bcd, month_day2

day_week
		movlw	h'01'
		movwf	cur_yl		;西暦元年 = '0001' とする
		clrf	cur_yh		;

		movlw	h'01'
		movwf	cur_week	;初期設定 (西暦元年1月1日 = 月曜日 とする)

		; 年の変換 (400年後毎の同月同日は同じ曜日)

		movf	bcd_yh,W	;年(上位2桁)_BCD カウンタ
		call	bcd2_to_binary	;バイナリ変換
		movwf	xxx_yh		;
					;
dweek01		movlw	4		;
		subwf	xxx_yh,W	;
		btfss	STATUS,C	;xxx_yh < 4 か？
		goto	dweek03		;Yes
					;
		btfss	STATUS,Z	;xxx_yh = 4 か？
		goto	dweek02		;No
					;
		movf	bcd_yl,W	;
		btfsc	STATUS,Z	;bcd_yl = 0 か？
		goto	dweek03		;Yes
					;
dweek02		movlw	4		;
		subwf	xxx_yh,F	;
		goto	dweek01		;

		; 年の計算

dweek03		movf	bcd_yl,W	;年(下位2桁)_BCD カウンタ
		subwf	cur_yl,W
		btfss	STATUS,Z	;cur_yl = bcd_yl か？
		goto	dweek04		;No

		movf	xxx_yh,W	;xxx_yh =< 4 (400年以下に変換)
		subwf	cur_yh,W
		btfsc	STATUS,Z	;cur_yh = xxx_yh か？
		goto	dweek05		;Yes

dweek04		movlw	365 % 7		;365 % 7 = 365 - 7 * 52 = 1
		addwf	cur_week,F
		call	uruu_check	;平年／閏年の判定
		btfsc	uru_flg,0	;平年 か？
		incf	cur_week,F	;No. 閏年

		movlw	7
		subwf	cur_week,W
		btfsc	STATUS,C	;cur_week < 7 か？
		movwf	cur_week	;No

		movlw	cur_yl		;年(下位2桁)(変) BCD カウンタの番地
		movwf	FSR		;間接アドレスに設定
		call	inc_bcd		;BCD インクリメント

		movlw	h'a0'
		subwf	cur_yl,W
		btfss	STATUS,Z	;年(下位2桁)(変) BCD カウンタ = h'a0' か？
		goto	dweek03		;No

		clrf	cur_yl		;年(下位2桁)(変) BCD カウンタ = h'00' 設定

		movlw	cur_yh		;年(上位2桁)(変) BCD カウンタの番地
		movwf	FSR		;間接アドレスに設定
		call	inc_bcd		;BCD インクリメント
		goto	dweek03

		; 月の計算

dweek05		movlw	h'01'
		movwf	cur_nn		;月(変) BCD カウンタ

dweek06		movf	bcd_nn,W	;月_BCD カウンタ
		subwf	cur_nn,W
		btfsc	STATUS,Z	;cur_nn = bcd_nn か？
		goto	dweek08		;Yes

		movf	cur_nn,W
		call	bcd2_to_binary	;BCD (2桁) からバイナリ変換
		movwf	work2		;退避
		call	month_day2	;月データのテーブル読み出し	;;;;;
		addwf	cur_week,F
		movlw	h'02'
		subwf	cur_nn,W
		btfss	STATUS,Z	;cur_nn = 2 か？
		goto	dweek07		;No

		call	uruu_check	;平年／閏年の判定
		btfsc	uru_flg,0	;平年 か？
		incf	cur_week,F	;No. 閏年

dweek07		movlw	7
		subwf	cur_week,W
		btfsc	STATUS,C	;cur_week < 7 か？
		movwf	cur_week	;No

		movlw	cur_nn		;月(変) BCD カウンタの番地
		movwf	FSR		;間接アドレスに設定
		call	inc_bcd		;BCD インクリメント
		goto	dweek06

		; 日の計算

dweek08		movf	bcd_dd,W	;日_BCD カウンタ
		call	bcd2_to_binary	;BCD (2桁) からバイナリ変換
		addwf	cur_week,F
		decf	cur_week,F	;-1（当日分）

dweek09		movlw	7
		subwf	cur_week,W
		btfss	STATUS,C	;cur_week < 7 か？
		goto	dweek10		;Yes

		movwf	cur_week	;No
		goto	dweek09

dweek10		incf	cur_week,F	;0～6 → 1～7 に変換

		movf	cur_week,W	;;
		return

;--------------------------------------------------------------------------

month_day2
		decf	work2,W
		movwf	addr_low
		movlw	high day_tbl
		movwf	addr_high	;high アドレス
		movlw	low day_tbl
		addwf	addr_low,F	;low アドレス
		btfsc	STATUS,C	;オーバーフローした場合は
		incf	addr_high,F	;high アドレスの更新

		movf	addr_high,W	;テーブルデータの high アドレス
		movwf	PCLATH
		movf	addr_low,W	;テーブルデータの low アドレス
		movwf	PCL

day_tbl		retlw	31 % 7		; 1:  31 % 7 = 3
		retlw	28 % 7		; 2:  28 % 7 = 0
		retlw	31 % 7		; 3:  31 % 7 = 3
		retlw	30 % 7		; 4:  30 % 7 = 2
		retlw	31 % 7		; 5:  31 % 7 = 3
		retlw	30 % 7		; 6:  30 % 7 = 2
		retlw	31 % 7		; 7:  31 % 7 = 3
		retlw	31 % 7		; 8:  31 % 7 = 3
		retlw	30 % 7		; 9:  30 % 7 = 2
		retlw	31 % 7		;10:  31 % 7 = 3
		retlw	30 % 7		;11:  30 % 7 = 2
;		retlw	31 % 7		;12:  31 % 7 = 3  (使用しない)

;==========================================================================
;		モード 0： 時分秒を７セグメントＬＥＤに表示
;==========================================================================

time_display
		movlw	5		;対象の位置ポインタ = 5			;
		btfsc	blk_flg,2	;輝度調節識別フラグ = ON か？		; (Ver.1.01) で追加
		movwf	tg_point	;Yes					; 特殊処理
										;
;		btfss	hhmmss_flg,0	;秒下位フラグ = ON か？		;;毎秒 強制表示
;		goto	tmdsp04		;No

		movlw	h'09'		;デコードモードレジスタ
		movwf	reg_addr
		movlw	b'11011011'	;     Digit 5,2: デコードなし
		btfsc	time_flg,1	;時間表示モードフラグ = 12H か？
		movlw	b'01011011'	;Yes. Digit 7,5,2: デコードなし
		movwf	reg_data
		call	max_reg_cont

		; 秒下位 "SL" 桁 LED の制御
		movlw	h'01'		;Digit 0 レジスタ
		movwf	reg_addr
		movf	bcd_ss,W
		andlw	h'0f'
		movwf	reg_data
		movlw	6		;SET モードのとき: tg_point = 6
		call	dp_blink	;桁表示と DP のブリンク表示

		; 秒上位 "SH" 桁 LED の制御
		btfss	hhmmss_flg,1	;秒上位フラグ = ON か？
		goto	tmdsp03		;No

		movlw	h'02'		;Digit 1 レジスタ
		movwf	reg_addr
		swapf	bcd_ss,W
		andlw	h'0f'
		movwf	reg_data
		movlw	6		;SET モードのとき: tg_point = 6
		call	dp_blink	;桁表示と DP のブリンク表示

		; 分下位 "ML" 桁 LED の制御
		btfss	hhmmss_flg,2	;分下位フラグ = ON か？
		goto	tmdsp03		;No

		movlw	h'04'		;Digit 3 レジスタ
		movwf	reg_addr
		movf	bcd_mm,W
		andlw	h'0f'
		movwf	reg_data
		movf	intensity,W	;輝度調節値				;
		btfsc	blk_flg,2	;輝度調節識別フラグ = ON か？		; (Ver.1.01) で追加
		movwf	reg_data	;Yes					;
		movlw	5		;SET モードのとき: tg_point = 5
		call	dp_blink	;桁表示と DP のブリンク表示

		; 分上位 "MH" 桁 LED の制御
		btfss	hhmmss_flg,3	;分上位フラグ = ON か？
		goto	tmdsp03		;No

		movlw	h'05'		;Digit 4 レジスタ
		movwf	reg_addr
		swapf	bcd_mm,W
		andlw	h'0f'
		movwf	reg_data
		movf	intensity,W	;輝度調節値				;
		btfsc	blk_flg,2	;輝度調節識別フラグ = ON か？		; (Ver.1.01) で追加
		movwf	reg_data	;Yes					;
		movlw	5		;SET モードのとき: tg_point = 5
		call	dp_blink	;桁表示と DP のブリンク表示

		; 時下位 "HL" 桁 LED の制御
		btfss	hhmmss_flg,4	;時下位フラグ = ON か？
		goto	tmdsp03		;No

		movf	bcd_hh,W
		movwf	temp_hh

		btfsc	time_flg,1	;時間表示モードフラグ = 12H か？ (bit1=0:24H/1:12H, bit0=0:am/1:pm)
		call	cnv_24to12	;Yes. 24時間表示を12時間表示に変換

		movlw	h'07'		;Digit 6 レジスタ
		movwf	reg_addr
		movf	temp_hh,W
		andlw	h'0f'
		movwf	reg_data
		movlw	4		;SET モードのとき: tg_point = 4
		call	dp_blink	;桁表示と DP のブリンク表示

		; 時上位 "HH" 桁 LED の制御
;		btfss	hhmmss_flg,5	;時上位フラグ = ON か？		;;毎時 00 分 00 秒には強制表示
;		goto	tmdsp03		;No

		movlw	h'08'		;Digit 7 レジスタ
		movwf	reg_addr
		btfsc	time_flg,1	;時間表示モードフラグ = 12H か？
		goto	tmdsp01		;Yes

		swapf	temp_hh,W	;(Digit 7: デコードあり)
		andlw	h'0f'
		movwf	reg_data
		goto	tmdsp02

tmdsp01		movf	temp_hh,W	;(Digit 7: デコードなし)
		andlw	h'f0'		;    "0": ゼロサプレス
		btfss	STATUS,Z	;時上位 = "0" か？
		movlw	h'30'		;No. "1": セグメント B,C
		movwf	reg_data
		movlw	h'02'		;     AM表示: セグメント F
		btfsc	time_flg,0	;時間表示モードフラグ = pm か？
		movlw	h'04'		;Yes. PM表示: セグメント E
		iorwf	reg_data,F

tmdsp02		movlw	4		;SET モードのとき: tg_point = 4
		call	dp_blink	;桁表示と DP のブリンク表示

		; 左右コロン(：) LED の制御
tmdsp03		btfss	hhmmss_flg,3	;分上位フラグ = ON か？
		goto	tmdsp04		;No
					;10 分ごとにコロン（：）を再表示
		movlw	h'03'		;Digit 2 レジスタ
		movwf	reg_addr
		movlw	b'01100000'	;セグメント A,B: コロン(：)
		movwf	reg_data
		call	max_reg_cont

		movlw	h'06'		;Digit 5 レジスタ
		movwf	reg_addr
;		movlw	b'01100000'	;セグメント A,B: コロン(：)
;		movwf	reg_data
		call	max_reg_cont

tmdsp04		return		

;--------------------------------------------------------------------------

		; 各桁表示と DP のブリンク表示
dp_blink
		movf	tg_point,F
		btfsc	STATUS,Z	;SET モード(tg_point != 0) か？
		goto	blk01		;No. (tg_point = 0)

		btfss	blk_flg,0	;ブリンク表示フラグ = ON か？
		goto	blk01		;No

		; (dp_blink 入力時の W reg 値)
		subwf	tg_point,W	;
		btfss	STATUS,Z	;対象の位置ポインタ = 1 ～ 6 か？
		goto	blk01		;No

		movlw	h'80'		;bit7 = DP
		iorwf	reg_data,F	;Yes

blk01		call	max_reg_cont	;MAX7219 のレジスタ制御
		return		

;--------------------------------------------------------------------------
;		24時間表示を12時間表示に変換
;--------------------------------------------------------------------------

;(24H) 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 
;(12H) 12  1  2  3  4  5  6  7  8  9 10 11 12  1  2  3  4  5  6  7  8  9 10 11
;      am am am am am am am am am am am am pm pm pm pm pm pm pm pm pm pm pm pm
;                                          -----------------------------------
;     +12                                 -12
;    ( 12 ef f0 f1 f2 f3 f4 f5 f6 f7 fe ff 00 01 02 03 04 05 06 07 0e 0f 10 11 )

cnv_24to12
		; (am)
		bcf	time_flg,0	;時間表示モードフラグ.bit0=0: am に設定

		movf	temp_hh,W
		btfss	STATUS,Z	;仮の時 BCD カウンタ = h'00' か？
		goto	cnv01		;No

		movlw	h'12'
		movwf	temp_hh		;仮の時 BCD カウンタ temp_hh = h'12'
		goto	cnv02

cnv01		movlw	h'12'
		subwf	temp_hh,W
		btfss	STATUS,C	;仮の時 BCD カウンタ < h'12' か？
		goto	cnv02		;Yes

		; (pm)
		bsf	time_flg,0	;時間表示モードフラグ.bit0=1: pm に設定

		btfsc	STATUS,Z	;仮の時 BCD カウンタ = h'12' か？
		goto	cnv02		;Yes

		movwf	temp_hh		;仮の時 BCD カウンタ temp_hh = temp_hh - 12
		movlw	h'0e'
		subwf	temp_hh,W
		btfss	STATUS,C	;仮の時 BCD カウンタ < h'0e' か？
		goto	cnv02		;Yes

		movlw	h'10'
		subwf	temp_hh,W
		btfsc	STATUS,C	;仮の時 BCD カウンタ < h'10' か？
		goto	cnv02		;No

		movlw	h'06'
		subwf	temp_hh,F	;補正

cnv02		return

;==========================================================================
;		モード 1： 年月日を７セグメントＬＥＤに表示
;==========================================================================

date_display
		movlw	2		;対象の位置ポインタ = 2			;
		btfsc	blk_flg,2	;輝度調節識別フラグ = ON か？		; (Ver.1.01) で追加
		movwf	tg_point	;Yes					; 特殊処理
										;
		btfss	yynnddw_flg,1	;日下位フラグ = ON か？
		goto	dtdsp02		;No

		movlw	h'09'		;デコードモードレジスタ
		movwf	reg_addr
		movlw	b'11011011'	;Digit 5,2: デコードなし
		movwf	reg_data
		call	max_reg_cont

		; 日下位 "SL" 桁 LED の制御
		movlw	h'01'		;Digit 0 レジスタ
		movwf	reg_addr
		movf	bcd_dd,W
		andlw	h'0f'
		movwf	reg_data
		movlw	3		;SET モードのとき: tg_point = 3
		call	dp_blink	;桁表示と DP のブリンク表示

		; 日上位 "SH" 桁 LED の制御
		btfss	yynnddw_flg,2	;日上位フラグ = ON か？
		goto	dtdsp01		;No

		movlw	h'02'		;Digit 1 レジスタ
		movwf	reg_addr
		swapf	bcd_dd,W
		andlw	h'0f'
		movwf	reg_data
		movlw	3		;SET モードのとき: tg_point = 3
		call	dp_blink	;桁表示と DP のブリンク表示

		; 月下位 "ML" 桁 LED の制御
		btfss	yynnddw_flg,3	;月下位フラグ = ON か？
		goto	dtdsp01		;No

		movlw	h'04'		;Digit 3 レジスタ
		movwf	reg_addr
		movf	bcd_nn,W
		andlw	h'0f'
		movwf	reg_data
		movf	intensity,W	;輝度調節値				;
		btfsc	blk_flg,2	;輝度調節識別フラグ = ON か？		; (Ver.1.01) で追加
		movwf	reg_data	;Yes					;
		movlw	2		;SET モードのとき: tg_point = 2
		call	dp_blink	;桁表示と DP のブリンク表示

		; 月上位 "MH" 桁 LED の制御
		btfss	yynnddw_flg,4	;月上位フラグ = ON か？
		goto	dtdsp01		;No

		movlw	h'05'		;Digit 4 レジスタ
		movwf	reg_addr
		swapf	bcd_nn,W
		andlw	h'0f'
		movwf	reg_data
		movf	intensity,W	;輝度調節値				;
		btfsc	blk_flg,2	;輝度調節識別フラグ = ON か？		; (Ver.1.01) で追加
		movwf	reg_data	;Yes					;
		movlw	2		;SET モードのとき: tg_point = 2
		call	dp_blink	;桁表示と DP のブリンク表示

		; 年下位 "HL" 桁 LED の制御
		btfss	yynnddw_flg,5	;年下位フラグ = ON か？
		goto	dtdsp01		;No

		movlw	h'07'		;Digit 6 レジスタ
		movwf	reg_addr
		movf	bcd_yy,W
		andlw	h'0f'
		movwf	reg_data
		movlw	1		;SET モードのとき: tg_point = 1
		call	dp_blink	;桁表示と DP のブリンク表示

		; 年上位 "HH" 桁 LED の制御
		btfss	yynnddw_flg,6	;年上位フラグ = ON か？
		goto	dtdsp01		;No

		movlw	h'08'		;Digit 7 レジスタ
		movwf	reg_addr
		swapf	bcd_yy,W
		andlw	h'0f'
		movwf	reg_data
		movlw	1		;SET モードのとき: tg_point = 1
		call	dp_blink	;桁表示と DP のブリンク表示

		; 左右コロン(：) LED の制御
dtdsp01		movlw	h'03'		;Digit 2 レジスタ
		movwf	reg_addr
		movlw	b'01000000'	;セグメント A: ピリオド(．) 
		movwf	reg_data
		call	max_reg_cont

		movlw	h'06'		;Digit 5 レジスタ
		movwf	reg_addr
;		movlw	b'01000000'	;セグメント A: ピリオド(．)
;		movwf	reg_data
		call	max_reg_cont

dtdsp02		return

;==========================================================================
;		モード 2： オートモード時の７セグメントＬＥＤの表示
;==========================================================================

;		 (_____: 時間表示、NNNNN: 年月日表示)

;		00        10        20        30        40        50        00
;		.    .    .    .    .    .    .    .    .    .    .    .    .
;		__________NNNNNNNNNN__________NNNNNNNNNN__________NNNNNNNNNN

auto_display
		movlw	h'10'		;
		subwf	bcd_ss,W	;秒 BCD カウンタ
		btfss	STATUS,C	;bcd_ss < h'10' か？
		goto	adsp02		;Yes

		movlw	h'20'		;
		subwf	bcd_ss,W	;秒 BCD カウンタ
		btfss	STATUS,C	;bcd_ss < h'20' か？
		goto	adsp01		;Yes

		movlw	h'30'		;
		subwf	bcd_ss,W	;秒 BCD カウンタ
		btfss	STATUS,C	;bcd_ss < h'30' か？
		goto	adsp02		;Yes

		movlw	h'40'		;
		subwf	bcd_ss,W	;秒 BCD カウンタ
		btfss	STATUS,C	;bcd_ss < h'40' か？
		goto	adsp01		;Yes

		movlw	h'50'		;
		subwf	bcd_ss,W	;秒 BCD カウンタ
		btfss	STATUS,C	;bcd_ss < h'50' か？
		goto	adsp02		;Yes

adsp01		movf	bcd_ss,W
		andlw	h'0f'
		movlw	h'7e'		;全桁強制表示
		btfsc	STATUS,Z	;秒下位 = h'0' か？
		movwf	yynnddw_flg	;Yes
		call	date_display	;年月日の表示
		goto	adsp03

adsp02		movf	bcd_ss,W
		andlw	h'0f'
		movlw	h'3f'		;全桁強制表示
		btfsc	STATUS,Z	;秒下位 = h'0' か？
		movwf	hhmmss_flg	;Yes
		call	time_display	;時分秒の表示

adsp03		return

;==========================================================================
		org	h'0600'		;;;;; リンクエラーの回避策
;==========================================================================

; PIC16F684 と MPLAB IDE v8.92 のリンクエラーについて
; ---------------------------------------------------

; 5FFh 番地を超えて連続で 600h 番地以降に続く（両番地の境を跨ぐ）とリンクエラーが発生する。

; 詳細は http://xyama.sakura.ne.jp/hp/FM_StereoRadioII.html#link_err で述べているので、
;        -----------------------------------------------------------
; 興味のある方はそちらをご覧になってみてください。

;==========================================================================
;		時報音出力コントロール
;==========================================================================

;  NHKの時報は、1000ミリ秒以上の無音、予報音3回、正報音1回、1000ミリ秒以上の無音という構成になっている。 
;  予報音は、一定音量の440Hzの正弦波を100ミリ秒発振させ、その後900ミリ秒の無音を置く。
;  これを1セットとして、正時の3秒前から3回繰り返している。
;  正報音は、880Hzの正弦波を発振させ、1000ミリ秒間一定の音量に保ち、次の2000ミリ秒で減衰させている。
;  出典: フリー百科事典『ウィキペディア（Wikipedia）』 ( http://ja.wikipedia.org/wiki/%E6%99%82%E5%A0%B1 )

;		時報音出力コントロール	

time_signal
		btfss	alm_flg,7	;アラーム音出力許可フラグ = ON か？
		goto	ts102		;No

		movlw	h'59'
		subwf	bcd_mm,W	;分 BCD カウンタ
		btfss	STATUS,Z	;bcd_mm = h'59' か？
		goto	ts101		;No

		movlw	h'57'
		subwf	bcd_ss,W	;秒 BCD カウンタ
		btfss	STATUS,C	;bcd_ss >= h'57' か？
		goto	ts101		;No

		; "プッ"		;予報音 (440Hz)
;		call	buzzer_pu	;"プッ"
		bsf	alm_flg,2	;予報音フラグのセット
		goto	ts102

ts101		movf	bcd_ss,W
		iorwf	bcd_mm,W
		btfss	STATUS,Z	;bcd_ss = bcd_mm = h'00' か？
		goto	ts102		;No

		; "ポッ～～ン"		;正報音 (880Hz)
;		call	buzzer_poon	;"ポッ～～ン"
		bsf	alm_flg,3	;正報音フラグのセット

ts102		return

;--------------------------------------------------------------------------

;		アラームフラグの監視とアラーム音出力

; alm_flg: アラームフラグ
;		┌───────────  signal_switch で設定
;		│　　　　 ┌────── time_signal で設定	
;		│　　　　 │　┌──── 未使用
;		│　　　　┌┐┌┐
;		ｘ０００．ｘｘｘｘ
;		│　　　　││││
;		│　　　　│││└─── 未使用			;"ピポッピポッ"
;		│　　　　││└──── 未使用			;"ブーー"
;		│　　　　│└───── 時報予報音フラグ	;"プッ"
;		│　　　　└────── 時報正報音フラグ	;"ポッ～～ン"
;		└─────────── アラーム音出力許可フラグ

alarm_sound
;		btfss	alm_flg,7	;アラーム音出力許可フラグ = ON か？
;		goto	alarm05		;（このフラグ = OFF のときは、
					;４つのフラグ = ON になることはない）
		movlw	h'7f'
		andwf	alm_flg,W
		btfsc	STATUS,Z	;どれかアラームフラグ = ON か？
		goto	alarm05		;No

		btfss	alm_flg,0	;リレー ON フラグ = ON か？
		goto	alarm01		;No

		call	buzzer_pipo2	;"ピポッピポッ" ブザー音出力 (490 mS)
		goto	alarm04

alarm01		btfss	alm_flg,1	;リレー OFF フラグ = ON か？
		goto	alarm02		;No

		call	buzzer_buu	;"ブー" ブザー音出力 (250 mS)
		call	buzzer_buu	;"ブー" ブザー音出力 (250 mS)
		goto	alarm04

alarm02		btfss	alm_flg,2	;時報予報音フラグ = ON か？
		goto	alarm03		;No

		call	buzzer_pu	;"プッ" ブザー音出力 (100 mS)
		goto	alarm04

alarm03	;	btfss	alm_flg,3	;時報正報音フラグ = ON か？
	;	goto	alarm04		;No

		call	buzzer_poon	;"ポッ～～ン" ブザー音出力 (1000 mS)
	;	goto	alarm04

alarm04		movlw	h'80'
		andwf	alm_flg,F	;アラームフラグをクリア

alarm05		return

;==========================================================================
;		アラーム（ブザー）音出力ルーチン
;==========================================================================

		; 時報予報音 "プッ" ブザー音出力 (100 mS)
buzzer_pu
		Sound_M		f_ra, 100
		return

		; 時報正報音 "ポッ～～ン" ブザー音出力 (1000 mS)
buzzer_poon
		call	buzzer_po_1_4
		call	buzzer_po_1_4
		call	buzzer_po_1_4

		; "ポッ～～ン" 1/4 ブザー音出力
buzzer_po_1_4
		Sound_M		f_rah, 250
		return

		;"ピピピッ" ブザー音 (360 mS)
buzzer_pipipi
		call	buzzer_pi	;"ピッ" ブザー音出力
		call	wait_30ms

		;"ピピッ" ブザー音 (230 mS)
buzzer_pipi
		call	buzzer_pi	;"ピッ" ブザー音出力
		call	wait_30ms

		; "ピッ" ブザー音出力
buzzer_pi
		Sound_M		f_so, pi_tim
		return

		; "ピポッピポッ" ブザー音出力 (490 mS)
buzzer_pipo2
		call	buzzer_pipo	;"ピポッ" ブザー音出力
		call	wait_30ms

		; "ピポッ" ブザー音出力 (230 mS)
buzzer_pipo
		call	buzzer_pi	;"ピッ" ブザー音出力
		call	wait_30ms

		; "ポッ" ブザー音出力
buzzer_po
		Sound_M		f_doh, po_tim
		return

		; "ブッ" ブザー音出力
buzzer_bu
		Sound_M		f_do, bu_tim
		return

		; "ブー" ブザー音出力
buzzer_buu
		Sound_M		f_do, buu_tim
		return

		; "ブッブー" ブザー音出力 (450 mS)
buzzer_bubuu
		call	buzzer_bu	;"ブッ" ブザー音出力
		call	wait_100ms
		call	buzzer_buu	;"ブー" ブザー音出力
		return

		; ブザー音出力コントロール
buzzer_control
		bsf	STATUS,RP0	;バンク 1
		bsf	PIE1,TMR1IE	;タイマー１割り込みを許可
		bcf	STATUS,RP0	;バンク 0

		call	wait_xxms	;入力 W: 音長（ループカウンタ）

		bsf	STATUS,RP0	;バンク 1
		bcf	PIE1,TMR1IE	;タイマー１割り込みを禁止
		bcf	STATUS,RP0	;バンク 0
		return

;==========================================================================
;		ウェイト・ルーチン (8 MHz)
;==========================================================================

		; 10μ秒 ウェイトルーチン
wait_10us
		movlw	4		;1
		movwf	wt1cnt		;1
wu03		nop			;1
		decfsz	wt1cnt,F	;1,2
		goto	wu03		;2,0	1+1+(1+1+2)*3+(1+2+0)=17
		nop			;1
		return			;2	17+1+2=20
					;Total	20/8MHz*4 = 10 μS

		; 40μ秒 ウェイトルーチン
wait_40us
		movlw	15		;1
		movwf	wt1cnt		;1
wu01		goto	$+1		;2
		decfsz	wt1cnt,F	;1,2
		goto	wu01		;2,0	1+1+(2+1+2)*14+(2+2+0)=76
		goto	$+1		;2
		return			;2	76+2+2=80
					;Total	80/8MHz*4 = 40 μS

		; 100μ秒 ウェイトルーチン
wait_100us
		movlw	39		;1
		movwf	wt1cnt		;1
wu02		goto	$+1		;2
		decfsz	wt1cnt,F	;1,2
		goto	wu02		;2,0	1+1+(2+1+2)*38+(2+2+0)=196
		goto	$+1		;2
		return			;2	196+2+2=200
					;Total	200/8MHz*4 = 100 μS = 0.1 mS

		; 10m 秒 ウェイトルーチン
wait_10ms
		movlw	10
		goto	wait_xxms

		; 30m 秒 ウェイトルーチン
wait_30ms
		movlw	30
		goto	wait_xxms

		; 50m 秒 ウエイト
wait_50ms
		movlw	50
		goto	wait_xxms

		; 100m 秒 ウェイトルーチン
wait_100ms
		movlw	100
		goto	wait_xxms

		; 200m 秒 ウェイトルーチン
wait_200ms
		movlw	200
		goto	wait_xxms

		; 1m 秒 ウェイトルーチン
wait_1ms
		movlw	1

		; xx m 秒（ 1m 秒 x W ）ウェイトルーチン
wait_xxms
		movwf	wt2cnt		;1

w1m01		movlw	221		;1
		movwf	wt1cnt		;1

w1m02		goto	$ + 1		;2
		goto	$ + 1		;2
		goto	$ + 1		;2
		decfsz	wt1cnt,F	;1,2
		goto	w1m02		;2,0	(2+2+2+1+2)*220+(2+2+2+2+0)=1988

		nop			;1
		goto	$ + 1		;2
		goto	$ + 1		;2
		decfsz	wt2cnt,F	;1,2
		goto	w1m01		;2,0	(1+1+1988+1+2+2+1+2)*(W-1)+(1+1+1988+1+2+2+2+0)=1998*W-1

		return			;2	1+(1998*W-1)+2=1998*W+2
					;Total	(1998*W+2)/8MHz*4 = (999*W + 1) μS

		; 500m 秒 ウェイトルーチン
wait_500ms
		movlw	5
		goto	w1s01

		; 1 秒 ウェイトルーチン
wait_1sec
		movlw	10
		goto	w1s01

		; 5 秒 ウェイトルーチン
wait_5sec
		movlw	50
w1s01		movwf	wt3cnt

w1s02		call	wait_100ms
		decfsz	wt3cnt,F
		goto	w1s02
		return

;==========================================================================
;		割り込み処理
;==========================================================================

interrupt
		; レジスタの保存

		movwf	w_save		;W レジスタの保存
		swapf	STATUS,W
		movwf	s_save		;STATUS レジスタの保存
		movf	FSR,W
		movwf	f_save		;FSR レジスタの保存

		bcf	STATUS,RP0	;バンク 0

		btfsc	INTCON,INTF	;外部(RA2/INT)割り込み か？
		goto	ra2_int		;Yes

		btfsc	INTCON,T0IF	;タイマー０割り込み か？
		goto	t0_int		;Yes

		btfsc	PIR1,TMR1IF	;タイマー１割り込み か？
		goto	t1_int		;Yes
		goto	int_end		;(Illegal interrupt)

;---------------- 外部(RA2/INT)割り込み処理 -------------------------------

ra2_int		bcf	INTCON,INTF	;外部(RA2/INT)割り込みフラグをクリア
		bsf	int_flg,0	;bit0: RTC DS3231 から年月日、時分秒の読み出し要求フラグ = ON
		goto	int_end

;---------------- タイマー０割り込み処理 ----------------------------------
					;（タイマー０を許可したときのみ: 割り込み周期 = 4/8Mz*16*250=2msec）

t0_int		bcf	INTCON,T0IF	;タイマー０割込みフラグをクリア
		movlw	tm0_h_val	;ハードタイマー０カウント値 = 250 を
		movwf	TMR0		;TMR0 に設定

		decfsz	tm0_s_cnt,F	;ソフトタイマー０カウンタ - 1 = 0 か？
		goto	int_end		;No

		movlw	1
		xorwf	blk_flg,F	;bit 0: ブリンク表示フラグ = 200 mS 毎に 反転
		bsf	blk_flg,1	;bit 1: 全桁強制表示フラグ = 200 mS 毎に ON

		movf	blk_cnt,F	;ブリンク時間カウンタ			;
		btfsc	STATUS,Z	;blk_cnt = 0 か？			;
		goto	int01		;Yes					;
										;
		decf	blk_cnt,F	;blk_cnt - 1				; (Ver.1.01) で追加
		btfss	STATUS,Z	;blk_cnt = 0 か？			;
		goto	int01		;No					;
										;
		bcf	INTCON,T0IE	;Yes. タイマー０割り込みを禁止		;
		clrf	blk_flg		;ブリンク表示フラグをクリア		;

int01		movlw	tm0_s_val	;ソフトタイマー０カウント値 = 100 を
		movwf	tm0_s_cnt	;ソフトタイマー０カウンタに設定
		goto	int_end

;---------------- タイマー１割り込み処理 ----------------------------------

t1_int		bcf	PIR1,TMR1IF	;タイマー１割込みフラグをクリア

		movf	const_high,W	;音階用分周定数 high を
		movwf	TMR1H		;TMR1H に設定
		movf	const_low,W	;音階用分周定数 low を
		movwf	TMR1L		;TMR1L に設定

		movlw	1 << _BZ	;対象ビットをセット
		xorwf	PORTC,F		;出力をビット反転
;		goto	int_end

		; レジスタの復帰

int_end		movf	f_save,W
		movwf	FSR		;FSR レジスタの復帰
		swapf	s_save,W
		movwf	STATUS		;STATUS レジスタの復帰
		swapf	w_save,F
		swapf	w_save,W	;W レジスタの復帰

		retfie

;==========================================================================
;		MAX7219 レジスタ制御の７セグメントLED のデモ表示
;==========================================================================

;		７セグメントLED の点灯移行デモ-1

demo1_display
		movlw	2		;繰り返し回数
		movwf	mlpcnt1		;ループカウンタ1 に設定

demo11		movlw	h'08'		;桁レジスタ初期値 = Digit 7 : "HH" 桁
		movwf	reg_addr	;ループ(桁)カウンタ にを設定

demo12		movlw	6
		subwf	reg_addr,W
		btfsc	STATUS,Z	;reg_addr = 6 か？
		decf	reg_addr,F	;Yes
		movlw	3
		subwf	reg_addr,W
		btfsc	STATUS,Z	;reg_addr = 3 か？
		decf	reg_addr,F	;Yes

		movlw	h'40'		;セグメント初期値 = A
		movwf	reg_data

		movlw	7		;セグメント A ～ G 
		movwf	segment		;ループ(セグメント)カウンタ に設定

demo13		call	max_reg_cont	;MAX7219 のレジスタ制御
		call	wait_200ms	;200 m秒 ウェイトルーチン
		call	max_reg_clr	;点灯セグメントをクリア

		bcf	STATUS,C
		rrf	reg_data,F
		decfsz	segment,F	;ループ(セグメント)カウンタ - 1 = 0 か？
		goto	demo13		;No

		movlw	h'80'		;セグメント = DP
		movwf	reg_data
		call	max_reg_cont	;MAX7219 のレジスタ制御
		call	wait_200ms	;200 m秒 ウェイトルーチン
		call	max_reg_clr	;点灯セグメントをクリア

		decfsz	reg_addr,F	;ループ(桁)カウンタ - 1 = 0 か？
		goto	demo12		;No

		decfsz	mlpcnt1,F	;ループカウンタ1 - 1 = 0 か？
		goto	demo11		;No

		return		

;--------------------------------------------------------------------------

;		７セグメントLED の点灯移行デモ-2

demo2_display
		movlw	3		;繰り返し回数
		movwf	mlpcnt1		;ループカウンタ1 に設定

demo21		movlw	h'08'		;桁レジスタ初期値 = Digit 7 : "HH" 桁
		movwf	reg_addr	;

		movlw	3		;"HH""HL" 桁,"MH""ML" 桁,"SH""SL" 桁
		movwf	mlpcnt2		;ループカウンタ2 に設定

demo22		movlw	h'40'		;セグメント初期値 = A
		movwf	reg_data

		movlw	2		;
		movwf	mlpcnt3		;ループカウンタ3 に設定

demo23		call	max_reg_cont	;MAX7219 のレジスタ制御
		call	wait_100ms	;100 m秒 ウェイトルーチン
		call	max_reg_clr	;点灯セグメントをクリア

		decf	reg_addr,F	;桁レジスタを -1 更新
		decfsz	mlpcnt3,F	;ループカウンタ3 - 1 = 0 か？
		goto	demo23		;No

		incf	reg_addr,F	;桁レジスタを +1 更新

		movlw	2		;
		movwf	mlpcnt3		;ループカウンタ3 に設定

demo24		bcf	STATUS,C
		rrf	reg_data,F	;セグメント = B,C

		call	max_reg_cont	;MAX7219 のレジスタ制御
		call	wait_100ms	;100 m秒 ウェイトルーチン
		call	max_reg_clr	;点灯セグメントをクリア

		decfsz	mlpcnt3,F	;ループカウンタ3 - 1 = 0 か？
		goto	demo24		;No

		bcf	STATUS,C
		rrf	reg_data,F	;セグメント = D

		movlw	2		;
		movwf	mlpcnt3		;ループカウンタ3 に設定

demo25		call	max_reg_cont	;MAX7219 のレジスタ制御
		call	wait_100ms	;100 m秒 ウェイトルーチン
		call	max_reg_clr	;点灯セグメントをクリア

		incf	reg_addr,F	;桁レジスタを +1 更新
		decfsz	mlpcnt3,F	;ループカウンタ3 - 1 = 0 か？
		goto	demo25		;No

		decf	reg_addr,F	;桁レジスタを -1 更新

		movlw	2		;
		movwf	mlpcnt3		;ループカウンタ3 に設定

demo26		bcf	STATUS,C
		rrf	reg_data,F	;セグメント = E,F

		call	max_reg_cont	;MAX7219 のレジスタ制御
		call	wait_100ms	;100 m秒 ウェイトルーチン
		call	max_reg_clr	;点灯セグメントをクリア

		decfsz	mlpcnt3,F	;ループカウンタ3 - 1 = 0 か？
		goto	demo26		;No

		bcf	STATUS,C
		rrf	reg_data,F	;セグメント = G

		movlw	2		;
		movwf	mlpcnt3		;ループカウンタ3 に設定

demo27		call	max_reg_cont	;MAX7219 のレジスタ制御
		call	wait_200ms	;200 m秒 ウェイトルーチン
		call	max_reg_clr	;点灯セグメントをクリア

		decf	reg_addr,F	;桁レジスタを -1 更新
		decfsz	mlpcnt3,F	;ループカウンタ3 - 1 = 0 か？
		goto	demo27		;No

		incf	reg_addr,F	;桁レジスタを +1 更新
		bsf	STATUS,C	;(ここだけは bcf ではない !!)
		rrf	reg_data,F	;セグメント = DP

		movlw	2		;
		movwf	mlpcnt3		;ループカウンタ3 に設定

demo28		call	max_reg_cont	;MAX7219 のレジスタ制御
		call	wait_200ms	;200 m秒 ウェイトルーチン
		call	max_reg_clr	;点灯セグメントをクリア

		incf	reg_addr,F	;桁レジスタを +1 更新
		decfsz	mlpcnt3,F	;ループカウンタ3 - 1 = 0 か？
		goto	demo28		;No

		movlw	4
		subwf	reg_addr,F	;桁レジスタを -4 更新
		decfsz	mlpcnt2,F	;ループカウンタ2 - 1 = 0 か？
		goto	demo22		;No

		decfsz	mlpcnt1,F	;ループカウンタ1 - 1 = 0 か？
		goto	demo21		;No

		return

;--------------------------------------------------------------------------

;		７セグメントLED の点灯移行デモ-3

demo3_display
		movlw	3		;繰り返し回数
		movwf	mlpcnt1		;ループカウンタ1 に設定

demo31		movlw	h'08'		;桁レジスタ初期値 = Digit 7 : "HH" 桁
		movwf	reg_addr	;

		movlw	h'40'		;セグメント初期値 = A
		movwf	reg_data

		movlw	6		;
		movwf	mlpcnt3		;ループカウンタ3 に設定

demo32		call	max_reg_cont	;MAX7219 のレジスタ制御
		call	wait_100ms	;100 m秒 ウェイトルーチン
		call	max_reg_clr	;点灯セグメントをクリア

		decf	reg_addr,F	;桁レジスタを -1 更新
		movlw	5		;
		subwf	mlpcnt3,W
		btfsc	STATUS,Z	;mlpcnt3 = 5 か？
		decf	reg_addr,F	;Yes. 桁レジスタを -1 更新
		movlw	3		;
		subwf	mlpcnt3,W
		btfsc	STATUS,Z	;mlpcnt3 = 3 か？
		decf	reg_addr,F	;Yes. 桁レジスタを -1 更新

		decfsz	mlpcnt3,F	;ループカウンタ3 - 1 = 0 か？
		goto	demo32		;No

		incf	reg_addr,F	;桁レジスタを +1 更新

		movlw	2		;
		movwf	mlpcnt3		;ループカウンタ3 に設定

demo33		bcf	STATUS,C
		rrf	reg_data,F	;セグメント = B,C

		call	max_reg_cont	;MAX7219 のレジスタ制御
		call	wait_100ms	;100 m秒 ウェイトルーチン
		call	max_reg_clr	;点灯セグメントをクリア

		decfsz	mlpcnt3,F	;ループカウンタ3 - 1 = 0 か？
		goto	demo33		;No

		bcf	STATUS,C
		rrf	reg_data,F	;セグメント = D

		movlw	6		;
		movwf	mlpcnt3		;ループカウンタ3 に設定

demo34		call	max_reg_cont	;MAX7219 のレジスタ制御
		call	wait_100ms	;100 m秒 ウェイトルーチン
		call	max_reg_clr	;点灯セグメントをクリア

		incf	reg_addr,F	;桁レジスタを +1 更新
		movlw	3		;
		subwf	mlpcnt3,W
		btfsc	STATUS,Z	;mlpcnt3 = 3 か？
		incf	reg_addr,F	;Yes. 桁レジスタを +1 更新
		movlw	5		;
		subwf	mlpcnt3,W
		btfsc	STATUS,Z	;mlpcnt3 = 5 か？
		incf	reg_addr,F	;Yes. 桁レジスタを +1 更新

		decfsz	mlpcnt3,F	;ループカウンタ3 - 1 = 0 か？
		goto	demo34		;No

		decf	reg_addr,F	;桁レジスタを -1 更新

		movlw	2		;
		movwf	mlpcnt3		;ループカウンタ3 に設定

demo35		bcf	STATUS,C
		rrf	reg_data,F	;セグメント = E,F

		call	max_reg_cont	;MAX7219 のレジスタ制御
		call	wait_100ms	;100 m秒 ウェイトルーチン
		call	max_reg_clr	;点灯セグメントをクリア

		decfsz	mlpcnt3,F	;ループカウンタ3 - 1 = 0 か？
		goto	demo35		;No

		bcf	STATUS,C
		rrf	reg_data,F	;セグメント = G

		movlw	6		;
		movwf	mlpcnt3		;ループカウンタ3 に設定

demo36		call	max_reg_cont	;MAX7219 のレジスタ制御
		call	wait_100ms	;100 m秒 ウェイトルーチン
		call	max_reg_clr	;点灯セグメントをクリア

		decf	reg_addr,F	;桁レジスタを -1 更新
		movlw	5		;
		subwf	mlpcnt3,W
		btfsc	STATUS,Z	;mlpcnt3 = 5 か？
		decf	reg_addr,F	;Yes. 桁レジスタを -1 更新
		movlw	3		;
		subwf	mlpcnt3,W
		btfsc	STATUS,Z	;mlpcnt3 = 3 か？
		decf	reg_addr,F	;Yes. 桁レジスタを -1 更新

		decfsz	mlpcnt3,F	;ループカウンタ3 - 1 = 0 か？
		goto	demo36		;No

		incf	reg_addr,F	;桁レジスタを +1 更新
		bsf	STATUS,C	;(ここだけは bcf ではない !!)
		rrf	reg_data,F	;セグメント = DP

		movlw	6		;
		movwf	mlpcnt3		;ループカウンタ3 に設定

demo37		call	max_reg_cont	;MAX7219 のレジスタ制御
		call	wait_200ms	;200 m秒 ウェイトルーチン
		call	max_reg_clr	;点灯セグメントをクリア

		incf	reg_addr,F	;桁レジスタを +1 更新
		movlw	3		;
		subwf	mlpcnt3,W
		btfsc	STATUS,Z	;mlpcnt3 = 3 か？
		incf	reg_addr,F	;Yes. 桁レジスタを +1 更新
		movlw	5		;
		subwf	mlpcnt3,W
		btfsc	STATUS,Z	;mlpcnt3 = 5 か？
		incf	reg_addr,F	;Yes. 桁レジスタを +1 更新

		decfsz	mlpcnt3,F	;ループカウンタ3 - 1 = 0 か？
		goto	demo37		;No

		decfsz	mlpcnt1,F	;ループカウンタ1 - 1 = 0 か？
		goto	demo31		;No

		return		

;==========================================================================
;		EEPROM エリア
;==========================================================================

		org	h'2100'

eep_st		de	"Copyright (C) 2021 by M.Yamamoto"

		de	h'ff'

;==========================================================================

		end			;プログラムの終了
