'$prog &HFF , &H62 , &HDF , &HFF 'ヒューズ設定。(工場出荷状態) ' ' ****************************************** ' * AS3935 [雷]検知・時計 プログラム * ' * * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2015. 9.14 * ' ****************************************** ' ' Ver 0.34 テスト・バージョン。2015. 9.14 ' ' Const Prgver = "00.34" 'プログラム・バージョン。 ' ' $regfile = "ATtiny861.DAT" '使用するAVRを設定。 $crystal = 1000000 'AVRクロックを設定。 ' $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 10 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 ' ' * ポート名の定義 * ' Sw_1 Alias Pinb.4 'スイッチ[1]の接続ポート。 Sw_1pu Alias Portb.4 'スイッチ[1]のプルアップポート。 Sw_2 Alias Pinb.5 'スイッチ[2]の接続ポート。 Sw_2pu Alias Portb.5 'スイッチ[2]のプルアップポート。 Sw_3 Alias Pina.4 'スイッチ[3]の接続ポート。 Sw_3pu Alias Porta.4 'スイッチ[3]のプルアップポート。 Sp_out Alias Porta.7 'スピーカー出力の接続ポート。 As3935_irq Alias Pinb.6 '[AS3935]の[IRQ]ピンの接続ポート。 Rtc_1s Alias Pina.2 'RTC [RX-8025NB]の1秒出力接続ポート。 Rtc_1spu Alias Porta.2 'RTC [RX-8025NB]の1秒出力接続ポート(プルアップ用)。 ' ' * 変数の宣言 * ' Dim Dispmode As Byte '時計の表示モード。 Dim Hourmode As Byte '12/24時間制表示選択。(0:12時間制 , 1:24時間制) Dim Time1sf As Byte '1秒ごとの時刻更新フラグ。 Dim Intchkcun As Byte '割り込み起動後のループ回数。 Dim Swoffchkf As Byte 'スイッチOFF確認フラグ。 Dim I2cbuff(20) As Byte 'I2C送受信バッファー。 Dim Timebuff(7) As Byte '時刻データバッファー。 Dim Litmempoi As Byte '[雷]検知データメモリーのポインター。 Dim Litmemval As Byte '[雷]検知データメモリーの記録数。 Dim Litmemnum As Byte '[雷]検知データメモリーのLCD表示番号。 Dim Lightningbuzzer As Byte '[雷]検知時のブザー音の長さ。(0:50ms, 1:200ms, 2:500ms) Dim Noisebuzzer As Byte 'ノイズ検出時のブザー音。(0:OFF , 1:ON) Dim Noiseseriout As Byte 'ノイズ検出時のシリアル出力。(0:OFF , 1:ON) ' Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Temp2 As Byte '汎用テンポラリ変数 Byte型 No.2 Dim Temp3 As Byte '汎用テンポラリ変数 Byte型 No.3 Dim Temp4 As Byte '汎用テンポラリ変数 Byte型 No.4 Dim Temp5 As Byte '汎用テンポラリ変数 Byte型 No.5 Dim Temp6 As Byte '汎用テンポラリ変数 Byte型 No.6 Dim Temp7 As Byte '汎用テンポラリ変数 Byte型 No.7 Dim Temp8 As Byte '汎用テンポラリ変数 Byte型 No.8 Dim Temp9 As Byte '汎用テンポラリ変数 Byte型 No.9 Dim Tempw1 As Word '汎用テンポラリ変数 Word型 No.1 Dim Tempi1 As Integer '汎用テンポラリ変数 Integer型 No.1 Dim Tempi2 As Integer '汎用テンポラリ変数 Integer型 No.2 Dim Tempstr As String * 20 '汎用テンポラリ変数 String型 Dim Tempstr2 As String * 20 '汎用テンポラリ変数 String型 ' Dim Dummy As Eram Long 'EEPROM 4バイトのダミーエリア。 Dim Eephourmode As Eram Byte 'EEPROM 12/24時間制表示選択。(0:12時間制 , 1:24時間制) Dim Eepdispmode As Eram Byte 'EEPROM 時計の表示モード。 Dim Eepdigioffset As Eram Byte 'EEPROM [RX-8025NB] Digital Offset値。 Dim Eeplightningbuzzer As Eram Byte 'EEPROM [雷]検知時のブザー音の長さ。(0:50ms, 1:200ms, 2:500ms) Dim Eepnoisebuzzer As Eram Byte 'EEPROM ノイズ検出時のブザー音。(0:OFF , 1:ON) Dim Eepnoiseseriout As Eram Byte 'EEPROM ノイズ検出時のシリアル出力。(0:OFF , 1:ON) Dim Eeplcdcontrast As Eram Byte 'EEPROM LCDのコントラスト設定。(0〜63) Dim Eepas3935reg(3) As Eram Byte 'EEPROM AS3935のレジスター設定値。 Dim Eeplitmempoi As Eram Byte 'EEPROM [雷]検知データメモリーのポインター。 Dim Eeplitmemval As Eram Byte 'EEPROM [雷]検知データメモリーの記録数。 Dim Eeplightmem(480) As Eram Byte 'EEPROM [雷]検知データメモリー。 ' ' * ポートの初期設定 * ' Set Sw_1pu 'スイッチ[1]の接続ポートをプルアップする。 Set Sw_2pu 'スイッチ[2]の接続ポートをプルアップする。 Set Sw_3pu 'スイッチ[3]の接続ポートをプルアップする。 Config Sp_out = Output 'スピーカー出力の接続ポートを出力に設定する。 Set Rtc_1spu 'RTC [RX-8025NB]の1秒出力接続ポートをプルアップ。 ' Set Prr.prusi '電力削減 USI回路の停止。 Config Aci = Off 'アナログ比較器の電源を切る。 Open "comA.6:9600,8,N,1" For Output As #1 'シリアル出力用のポートと通信フォーマットを設定する。 ' Set Porta.3 '未使用ポートをプルアップする。 Set Porta.5 '未使用ポートをプルアップする。 Set Portb.0 '未使用ポートをプルアップする。 Set Portb.1 '未使用ポートをプルアップする。 Set Portb.2 '未使用ポートをプルアップする。 Set Portb.3 '未使用ポートをプルアップする。 ' ' * ピン変化割り込みの設定 * ' Pcmsk0 = &B0000_0000 'PCINT割り込みマスクを初期化する。 Pcmsk1 = &B0000_0000 Set Pcmsk1.pcint12 '[SW1] PB4[PCINT12]を許可する。 Set Pcmsk1.pcint13 '[SW2] PB5[PCINT13]を許可する。 Set Pcmsk0.pcint4 '[SW3] PA4[PCINT4]を許可する。 Set Pcmsk1.pcint14 '[AS3935]の[IRQ] PB6[PCINT14]を許可する。 On Pcint Pinchgint Nosave 'ピン変化割り込みルーチンのラベルを設定。 Set Gimsk.pcie1 'ピン変化割り込み[1]を許可する。 ###"Enable Pcint1"にBASCOMのバグ有り### ' ' * INT1 [RX-8025NB]の/INTA割り込みの設定 * ' Config Int1 = Low Level '外部割り込み[INT1]ピンの[L]レベルで割り込みが発生。 On Int1 Exint1 '外部割り込み[INT1]ルーチンのラベルを設定。 Enable Int1 '外部割り込み[INT1]を許可する。 ' ' * I2Cの初期設定 * ' Config Scl = Porta.0 'I2CバスのSCLラインを接続するポートピンを設定。 Config Sda = Porta.1 'I2CバスのSDAラインを接続するポートピンを設定。 I2cinit 'I2Cバスを初期化する。 ' ' * LCDの初期設定 * ' Const Vmode = 3 '[AQM1602A]の電源電圧。(3.5V以下 = 3 , 3.5V以上 = 5) Config Lcd = 16x2 , Chipset = St7032 'LCD表示を16文字2行に設定。 $lib "Lcd_AQMxx02.LBX" 'I2C LCD用のライブラリを組み込む。 Initlcd 'LCDを初期化する。 Deflcdchar 0 , &H02 , &H03 , &H02 , &H00 , &H00 , &H00 , &H00 , &H00 'カスタム文字[AM]をLCDへ書き込む。 Deflcdchar 1 , &H00 , &H00 , &H00 , &H00 , &H02 , &H03 , &H02 , &H00 'カスタム文字[PM]をLCDへ書き込む。 Deflcdchar 2 , &H02 , &H04 , &H0C , &H1E , &H0F , &H06 , &H04 , &H08 'カスタム文字[雷]をLCDへ書き込む。 Deflcdchar 3 , &H00 , &H1F , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 'カスタム文字[バー1bit]をLCDへ書き込む。 Deflcdchar 4 , &H00 , &H00 , &H1F , &H00 , &H00 , &H00 , &H00 , &H00 'カスタム文字[バー2bit]をLCDへ書き込む。 Deflcdchar 5 , &H00 , &H00 , &H00 , &H00 , &H1F , &H00 , &H00 , &H00 'カスタム文字[バー4bit]をLCDへ書き込む。 Deflcdchar 6 , &H00 , &H00 , &H00 , &H00 , &H00 , &H1F , &H00 , &H00 'カスタム文字[バー5bit]をLCDへ書き込む。 Deflcdchar 7 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H1F 'カスタム文字[バー7bit]をLCDへ書き込む。 Cursor Off 'LCDのカーソルをオフにする。 Temp1 = Eeplcdcontrast 'EEPROM LCDのコントラスト設定。(0〜63) If Temp1 > 63 Then 'If EEPROMが初期値か? Then Temp1 = 40 Eeplcdcontrast = Temp1 'EEPROM LCDのコントラスト設定。(0〜63) End If Lcdcontrast Temp1 'LCDのコントラストを設定する。(0〜63) Cls 'LCD表示をすべて消去。 ' ' * RTC [RX-8025NB]の初期設定 * ' Wait 1 '[RX-8025NB]のパワーオン時間を待つ。 I2cbuff(1) = &HF0 '[F] Control 2 レジスタのアドレスを指定する。 I2creceive &H64 , I2cbuff(1) , 1 , 1 'I2Cバスで、1バイトのコマンドを送信し、1バイトのデータを受信する。 If Err <> 0 Then Gosub Errordisp1 'If [RX-8025NB]の応答が無いか? Then If I2cbuff(1).6 = 1 Then Gosub Errordisp2 'If [RX-8025NB]バッテリー切れか? Then If I2cbuff(1).4 = 1 Then Goto Inital1 'If [RX-8025NB]がパワーオン状態か? Then Temp1 = Sw_1 Or Sw_3 If Temp1 = 0 Then 'If [SW1]と[SW3]が同時に押されているか? Then Inital1: Gosub Rx8025init '[RX-8025NB]を初期化する。 Eepdigioffset = 0 'EEPROM [RX-8025NB] Digital Offset値。 Gosub Swoffchk 'スイッチが離されるのを待つ。 Cls 'LCD表示をすべて消去。 End If Gosub Buzzer1khz '1KHzの音を50mS鳴らす。 ' ' * プログラム・バージョンの表示 * ' If Sw_1 = 0 Then 'If [SW1]が押されているか? Then Locate 1 , 1 'プログラム・バージョンを表示。 Lcd "AS3935 Lightning" Locate 2 , 2 Lcd "Clock Ver." ; Prgver End If ' ' * [雷]検知データメモリーの消去 * ' If Sw_3 = 0 Then 'If [SW3]が押されているか? Then Locate 1 , 1 Lcd "Lightning Memory" Locate 2 , 7 Lcd "Clear" Eeplitmempoi = 1 'EEPROM [雷]検知データメモリーのポインター。 Eeplitmemval = 0 'EEPROM [雷]検知データメモリーの記録数。 End If Gosub Swoffchk 'スイッチが離されるのを待つ。 Cls 'LCD表示をすべて消去。 ' ' * EEPROMのデータを確認する * ' If Eephourmode > 1 Then 'If EEPROMが初期値か? Then Eephourmode = 0 'EEPROM 12/24時間制表示選択。(0:12時間制 , 1:24時間制) Eepdispmode = 0 '時計の表示モード。 Eepdigioffset = 0 'EEPROM [RX-8025NB] Digital Offset値。 Eeplightningbuzzer = 1 'EEPROM [雷]検知時のブザー音の長さ。(0:50ms, 1:200ms, 2:500ms) Eepnoisebuzzer = 1 'EEPROM ノイズ検出時のブザー音。(0:OFF , 1:ON) Eepnoiseseriout = 0 'EEPROM ノイズ検出時のシリアル出力。(0:OFF , 1:ON) Eepas3935reg(1) = &H24 'EEPROM AS3935のレジスター[00h]設定値。 Eepas3935reg(2) = &H22 'EEPROM AS3935のレジスター[01h]設定値。 Eepas3935reg(3) = &HC2 'EEPROM AS3935のレジスター[02h]設定値。 Eeplitmempoi = 1 'EEPROM [雷]検知データメモリーのポインター。 Eeplitmemval = 0 'EEPROM [雷]検知データメモリーの記録数。 End If Hourmode = Eephourmode Dispmode = Eepdispmode Lightningbuzzer = Eeplightningbuzzer 'EEPROM [雷]検知時のブザー音の長さ。(0:50ms, 1:200ms, 2:500ms) Noisebuzzer = Eepnoisebuzzer 'EEPROM ノイズ検出時のブザー音。(0:OFF , 1:ON) Noiseseriout = Eepnoiseseriout 'EEPROM ノイズ検出時のシリアル出力。(0:OFF , 1:ON) Litmempoi = Eeplitmempoi '[雷]検知データメモリーのポインター。 Litmemval = Eeplitmemval '[雷]検知データメモリーの記録数。 ' ' * AS3935の500KHz共振器を較正する * ' I2cbuff(1) = &H3C 'レジスター[3C]のアドレスを指定する。 I2cbuff(2) = &H96 '[AS3935]のレジスターを初期化する。 Gosub As3935comtr '[AS3935]にコマンドを送信する。 ' Tccr0a = &B1000_0000 'Timer0を16bit動作にする。 Tccr0b = &B0000_0111 'Timer0のクロックを外部クロック[T0]の上昇端にする。 ' I2cbuff(1) = &H70 '[RX-8025NB]レジスタのスタートアドレス+転送モード。[7] Digital Offset I2cbuff(2) = &B0000_0000 '[Digital Offset]をOFFにする。 Gosub Rx8025nbcomtr '[RX-8025NB]にコマンドを送信する。 I2cbuff(1) = &HE0 '[RX-8025NB]レジスタのスタートアドレス+転送モード。[E] Control-1 I2cbuff(2) = &B0010_0010 '[RX-8025NB]の/INTA出力を2Hzのパルスモードに設定。[CT2〜CT0] Gosub Rx8025nbcomtr '[RX-8025NB]にコマンドを送信する。 ' Lcd "500K Calibration" Print #1 , "" : Print #1 , "500KHz Calibration" Bitwait Rtc_1s , Set '[RX-8025NB]の/INTAが[H]になるまで待つ。 Bitwait Rtc_1s , Reset '[RX-8025NB]の/INTAが[L]になるまで待つ。 Tempi2 = 32767 '周波数偏差値を上限値にしておく。 ' For Temp1 = 0 To 15 I2cbuff(1) = &H08 'レジスター[08]のアドレスを指定する。 I2cbuff(2) = &H80 + Temp1 '[AS3935]の内部コンデンサー容量を設定する。 Gosub As3935comtr '[AS3935]にコマンドを送信する。 ' Bitwait Rtc_1s , Set '[RX-8025NB]の/INTAが[H]になるまで待つ。 Tcnt0h = 0 'Timer0の上位バイトに書き込む。 Tcnt0l = 0 'Timer0の下位バイトに書き込む。 Bitwait Rtc_1s , Reset '[RX-8025NB]の/INTAが[L]になるまで待つ。 Temp2 = Tcnt0l 'Timer0の下位バイトを読み込む。 Temp3 = Tcnt0h 'Timer0の上位バイトを読み込む。 Tempw1 = Makeint(temp2 , Temp3) '2byteを16bitにする。 Shift Tempw1 , Left , 1 '測定値を2倍する。 Tempi1 = Tempw1 Shift Tempw1 , Left , 1 '測定値を2倍する。 Locate 2 , 2 Gosub Zerosupbin 'バイナリー値の上位桁をゼロサプレスしてLCDに表示する。 Lcd " " ; Tempw1 'LCDに測定周波数を表示する。 ' Tempi1 = 15625 - Tempi1 '周波数の差分を計算する。 Tempi1 = Abs(tempi1) '絶対値を求める。 Locate 2 , 11 Lcd Tempi1 ; " " If Tempi2 > Tempi1 Then 'If 周波数偏差の最小値か? Then Tempi2 = Tempi1 '最小値に更新する。 Temp4 = Temp1 '内部コンデンサー容量の設定値を保管する。 End If Locate 2 , 15 Lcd Temp4 ; " " 'LCDにコンデンサー容量設定値を表示する。 Next Temp1 ' Tccr0b = &B0000_0000 'Timer0を停止させる。 I2cbuff(1) = &HE0 '[RX-8025NB]レジスタのスタートアドレス+転送モード。[E] Control-1 I2cbuff(2) = &B0010_0100 '[RX-8025NB]の/INTA出力を1秒のレベルモードに設定。[CT2〜CT0] Gosub Rx8025nbcomtr '[RX-8025NB]にコマンドを送信する。 I2cbuff(1) = &H70 '[RX-8025NB]レジスタのスタートアドレス+転送モード。[7] Digital Offset I2cbuff(2) = Eepdigioffset '[Digital Offset]を設定する。 Gosub Rx8025nbcomtr '[RX-8025NB]にコマンドを送信する。 ' I2cbuff(1) = &H08 'レジスター[08]のアドレスを指定する。 I2cbuff(2) = &H00 + Temp4 '[AS3935]の内部コンデンサー容量を設定する。 Gosub As3935comtr '[AS3935]にコマンドを送信する。 Waitms 2 '2mSの待機時間。 ' ' * AS3935の内部クロック発振器を較正する * ' I2cbuff(1) = &H3D 'レジスター[3D]のアドレスを指定する。 I2cbuff(2) = &H96 '[AS3935]の内部クロックを較正する。 Gosub As3935comtr '[AS3935]にコマンドを送信する。 I2cbuff(1) = &H08 'レジスター[08]のアドレスを指定する。 I2cbuff(2) = &H40 + Temp4 '[AS3935]の[SRCO]出力をONにする。 Gosub As3935comtr '[AS3935]にコマンドを送信する。 Waitms 2 '2mSの待機時間。 I2cbuff(1) = &H08 'レジスター[08]のアドレスを指定する。 I2cbuff(2) = &H00 + Temp4 '[AS3935]の[SRCO]出力をOFFにする。 Gosub As3935comtr '[AS3935]にコマンドを送信する。 ' ' * AS3935のレジスターを設定する * ' Gosub As3935regwr 'AS3935のレジスターへ書き込む。 ' ' * 起動時の設定 * ' Cls 'LCD表示をすべて消去。 Gosub Rx8025timeread '[RX-8025NB]から時刻データを読み出す。 Sound Sp_out , 100 , 42 '2KHzの音を50mS鳴らす。 Waitms 50 Gosub Buzzer1khz '1KHzの音を50mS鳴らす。 Print #1 , "[AS3935] Ready!" ' Litmemnum = 1 '[雷]検知データメモリーのLCD表示番号。 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: If Intchkcun = 0 Then '起動後のループ回数を処理したか? Then Enable Interrupts 'すべての割り込みを許可する。 Config Powermode = Powerdown 'スリープモードへ移行する。(ピン変化割り込みで再起動する) Disable Interrupts 'すべての割り込みを禁止する。 Intchkcun = 3 Else Intchkcun = Intchkcun - 1 End If ' ' ********************** ' * スイッチの検出処理 * ' ********************** ' Temp1 = Sw_1 And Sw_2 Temp1 = Temp1 And Sw_3 If Temp1 = 0 Then 'If スイッチが押されているか? Then If Swoffchkf = 0 Then 'If スイッチOFF確認中でないか? Then Swoffchkf = 1 Waitms 50 'チャタリングの待ち時間。 Temp1.0 = Not Sw_1 'スイッチのデータをビット並びに変える。 Temp1.1 = Not Sw_2 Temp1.2 = Not Sw_3 Select Case Temp1 Case &B0000_0001 '[SW1]が押された場合。 Dispmode = Dispmode + 1 If Dispmode > 2 Then 'If 表示モードの上限か? Then Dispmode = 0 End If Eepdispmode = Dispmode 'EEPROMに保存する。 Gosub Clockdisp 'LCDに時計を表示する。 ' Case &B0000_0010 '[SW2]が押された場合。 If Litmemval <> 0 Then 'If [雷]検知データメモリーに記録が有るか? Then Gosub Litmemds2 '[雷]検知データメモリー表示[SW2]。 End If ' Case &B0000_0100 '[SW3]が押された場合。 If Litmemval <> 0 Then 'If [雷]検知データメモリーに記録が有るか? Then Gosub Litmemds3 '[雷]検知データメモリー表示[SW3]。 End If ' Case &B0000_0011 '[SW1+SW2]が押された場合。 Gosub Optionset '機能設定処理。 ' Case &B0000_0110 '[SW2+SW3]が押された場合。 If Litmemnum <> 0 Then 'If 数値表示か? Then Toggle Hourmode.0 '12/24時間制表示を切り替える。 Eephourmode = Hourmode 'EEPROMに保存する。 Gosub Clockdisp 'LCDに時計を表示する。 Else Gosub Memseriout 'EEPROMの[雷]検知データメモリー内容をシリアル出力する。 End If 'LCDに時計を表示する。 ' Case &B0000_0101 '[SW1+SW3]が押された場合。 Gosub Timeset '時刻設定処理。 ' End Select End If Else 'スイッチが押されていない場合。 If Swoffchkf <> 0 Then 'If スイッチOFF確認中か? Then Swoffchkf = 0 Waitms 30 'チャタリングの待ち時間。 End If End If ' ' *********************** ' * LCDに時刻を表示する * ' *********************** ' If Time1sf <> 0 Then '1秒経過したか? Then Time1sf = 0 Gosub Rx8025timeread '[RX-8025NB]から時刻データを読み出す。 Gosub Clockdisp 'LCDに時計を表示する。 End If ' ' ************************** ' * [雷]発生状況を表示する * ' ************************** ' If As3935_irq = 1 Then 'If [IRQ]ピンが[Hi]か? Then ' ' * LCDに[AS3935]の[INT]情報を表示する * ' Waitms 2 '[AS3935]のレジスター[03]INTを読み出す待ち時間。 I2cbuff(1) = &H03 'レジスター[03]INTのアドレスを指定する。 I2creceive &H00 , I2cbuff(1) , 1 , 1 'I2Cバスで、1バイトのアドレスを送信し、1バイトのデータを受信する。 I2cbuff(1) = I2cbuff(1) And &B0000_1111 '[INT]bit以外をマスクする。 ' Select Case I2cbuff(1) ' 割り込み情報[INT]による判別。 Case &B0000_0001 : '[INT_NH] ノイズレベルが高すぎる。 Sound Sp_out , 40 , 417 '200Hzの音を200mS鳴らす。 ' Case &B0000_0100 : '[INT_D] ノイズを検出した。 If Noisebuzzer <> 0 Then 'If ノイズ検出時のブザー音がONか? Then Sound Sp_out , 10 , 417 '200Hzの音を50mS鳴らす。 End If ' Case &B0000_1000 : '[INT_L] 「雷」を検出した。 Locate 2 , 1 Lcd Chr(2) ; " " ; '[雷]マークを表示する。 ' Lcd Hex(timebuff(4)) ; " "; '発生[日]を表示する。 Lcd Hex(timebuff(3)) ; '発生[時分秒]を表示する。 Lcd Hex(timebuff(2)) ; Lcd Hex(timebuff(1)) ; " "; ' ' * 距離情報を表示する * ' I2cbuff(2) = &H07 'レジスター[07]DISTANCEのアドレスを指定する。 I2creceive &H00 , I2cbuff(2) , 1 , 1 'I2Cバスで、1バイトのアドレスを送信し、1バイトのデータを受信する。 Temp1 = I2cbuff(2) Gosub Zerosupbin 'バイナリー値の上位桁をゼロサプレスしてLCDに表示する。 Lcd "k" ' ' * EEPROMの[雷]検知データメモリーに格納する * ' Tempw1 = Litmempoi - 1 Shift Tempw1 , Left , 3 '[雷]検知データメモリーの位置を計算する。 For Temp1 = 6 To 1 Step -1 Tempw1 = Tempw1 + 1 Temp2 = Timebuff(temp1) EepLightmem(tempw1) = Temp2 'EEPROMの[雷]検知データメモリーに発生時刻を格納する。 Next Temp1 Tempw1 = Tempw1 + 1 EepLightmem(tempw1) = I2cbuff(2) 'EEPROMの[雷]検知データメモリーに距離を格納する。 Litmempoi = Litmempoi + 1 'ポインターを更新する。 If Litmempoi > 60 Then 'If ポインターの上限か? Then Litmempoi = 1 End If Eeplitmempoi = Litmempoi 'ポインターをEEPROMに保管する。 ' If Litmemval < 60 Then 'If 記録数の上限でないか? Then Litmemval = Litmemval + 1 '[雷]検知データメモリーの記録数を加算する。 End If Eeplitmemval = Litmemval '記録数をEEPROMに保管する。 Litmemnum = 1 '[雷]検知データメモリーのLCD表示番号を初期化する。 ' Select Case Lightningbuzzer '[雷]検知時のブザー音の長さ。 Case 0 : Tempw1 = 200 '50ms Case 1 : Tempw1 = 800 '200ms Case Else : Tempw1 = 2000 '500ms End Select Sound Sp_out , Tempw1 , 21 '4KHzの音を規定時間鳴らす。 ' Case Else : '内部メモリーの統計データを全消去。 Lcd Spc(16) End Select ' ' * ターミナルへ表示する * ' Select Case I2cbuff(1) ' 割り込み情報[INT]による判別。 Case &B0000_0001 : '[INT_NH] ノイズレベルが高すぎる。 Gosub Seridatetime ' シリアル出力に[日時]を出力する。 Print #1 , "-Noise Hi-" ' Case &B0000_0100 : '[INT_D] ノイズを検出した。 If Noiseseriout <> 0 Then 'If ノイズ検出時のシリアル出力がONか? Then Gosub Seridatetime ' シリアル出力に[日時]を出力する。 Print #1 , "-Noise-" End If ' Case &B0000_1000 : '[INT_L] 「雷」を検出した。 Gosub Seridatetime ' シリアル出力に[日時]を出力する。 Temp1 = I2cbuff(2) Gosub Seridistance 'シリアル出力に[距離]を出力する。 ' Case Else : '内部メモリーの統計データを全消去。 Print #1 , "Clear statistics" End Select ' ' * [03]INTフラグをクリアする * ' I2cbuff(1) = &H03 'レジスター[03]INTのアドレスを指定する。 I2creceive &H00 , I2cbuff(1) , 1 , 1 'I2Cバスで、1バイトのアドレスを送信し、1バイトのデータを受信する。 End If ' Goto Main '================================================================================ ' ' ----------------------------------- ' * [雷]検知データメモリー表示[SW2] * ' ----------------------------------- ' Litmemds2: If Litmemval > Litmemnum Then 'If [雷]検知データメモリー記録数の上限でないか? Then Litmemnum = Litmemnum + 1 '[雷]検知データメモリーの表示位置をプラスする。 Else Sound Sp_out , 25 , 167 '500Hzの音を50mS鳴らす。 End If Litmemds21: Temp1 = Litmempoi '[雷]検知データメモリーの格納位置を計算する。 Temp1 = Temp1 - Litmemnum Select Case Temp1 Case 0 : '位置が60の場合。 Temp1 = Temp1 + 60 Case Is > 128 : '位置がマイナスの場合。 Temp1 = Temp1 + 60 End Select Tempw1 = Temp1 - 1 Shift Tempw1 , Left , 3 '[雷]検知データメモリーの8バイトごとの位置を計算する。 ' Locate 2 , 1 Temp1 = Litmemnum 'メモリー番号をLCDに表示する。 Gosub Zerosupbin 'バイナリー値の上位桁をゼロサプレスしてLCDに表示する。 Lcd " " ; Tempw1 = Tempw1 + 3 '記録[日]をLCDに表示する。 Gosub Lightmemread '[雷]検知データメモリーを読み出す。 Lcd Hex(temp1) ; " "; For Temp2 = 1 To 3 '記録[時分秒]をLCDに表示する。 Gosub Lightmemreadp '[雷]検知データメモリーを読み出す。 Lcd Hex(temp1) ; Next Temp2 Lcd " " ; '記録[距離]をLCDに表示する。 Gosub Lightmemreadp '[雷]検知データメモリーを読み出す。 Gosub Zerosupbin 'バイナリー値の上位桁をゼロサプレスしてLCDに表示する。 Lcd "k" Litmemds22: Return ' ' ----------------------------------- ' * [雷]検知データメモリー表示[SW3] * ' ----------------------------------- ' Litmemds3: If Litmemnum = 0 Then Goto Litmemds22 'If 下限値か? Then Litmemnum = Litmemnum - 1 '[雷]検知データメモリーの表示位置をマイナスする。 If Litmemnum <> 0 Then Goto Litmemds21 'If 数値表示か? Then ' ' * グラフ表示 * ' Temp2 = Litmempoi '[雷]検知データメモリーのポインター。 Temp3 = Litmemval '[雷]検知データメモリーの記録数。 For Temp4 = 16 To 1 Step -1 If Temp3 <> 0 Then 'If 記録が有るか? Then Temp2 = Temp2 - 1 '[雷]検知データメモリーの位置を設定する。 If Temp2 = 0 Then 'If 下限位置か? Then Temp2 = 60 End If Tempw1 = Temp2 - 1 Shift Tempw1 , Left , 3 '[雷]検知データメモリーの位置を計算する。 Tempw1 = Tempw1 + 7 '距離のデータ位置にする。 Gosub Lightmemread '[雷]検知データメモリーを読み出す。 Select Case Temp1 Case 1 : Temp5 = &HFF '[バー0bit] Case Is < 7 : Temp5 = &H03 '[バー1bit] Case Is < 11 : Temp5 = &H04 '[バー2bit] Case Is < 15 : Temp5 = &H2D '[バー3bit] Case Is < 21 : Temp5 = &H05 '[バー4bit] Case Is < 28 : Temp5 = &H06 '[バー5bit] Case Is < 35 : Temp5 = &H5F '[バー6bit] Case Is < 41 : Temp5 = &H07 '[バー7bit] Case Else : Temp5 = &H78 '[x] End Select Temp3 = Temp3 - 1 Else '記録がない場合。 Temp5 = &H20 End If Locate 2 , Temp4 Lcd Chr(temp5) Next Temp4 Return ' ' -------------------------------------------------------- ' * EEPROMの[雷]検知データメモリー内容をシリアル出力する * ' -------------------------------------------------------- ' Memseriout: ' ' Return ' ' * [雷]検知データメモリーを読み出すサブルーチン * ' Lightmemreadp: Tempw1 = Tempw1 + 1 Lightmemread: Temp1 = Eeplightmem(tempw1) Return '-------------------------------------------------------------------------------- ' ' ----------------------------------- ' * LCDに時計を表示するサブルーチン * ' ----------------------------------- ' Clockdisp: Locate 1 , 1 Select Case Dispmode Case 0 : '[月/日] [曜日] [時:分]表示。 Gosub Datedisp '[月日]をLCDに表示する。 Lcd " " ; Lcd Lookupstr(timebuff(7) , Weekdata) ; '[曜日]をLCDに表示する。 Lcd " " ; Gosub Timedisp '[時分]をLCDに表示する。 ' Case 1 : '[月/日] [時:分:秒]表示。 Gosub Datedisp '[月日]をLCDに表示する。 Lcd " " ; Gosub Timedisp '[時分]をLCDに表示する。 Gosub Secdisp '[秒]をLCDに表示する。 ' Case Else : '[年/月/日] [時:分]表示。 Gosub Yeardisp '[年月日]をLCDに表示する。 Lcd " " ; Gosub Timedisp '[時分]をLCDに表示する。 End Select Return ' ' --------------------------------------- ' * [年月日]をLCDに表示するサブルーチン * ' --------------------------------------- ' Yeardisp: Lcd Hex(timebuff(6)) ; "/"; '[年]を表示。 Datedisp: Temp1 = Timebuff(5) '[月]データを変換する。 Gosub Zerosupbcd '上位桁をゼロサプレスして[月]を表示。 Lcd "/" ; Temp1 = Timebuff(4) '[日]データを変換する。 Gosub Zerosupbcd '上位桁をゼロサプレスして[日]を表示。 Return ' ' ------------------------------------- ' * [時分]をLCDに表示するサブルーチン * ' ------------------------------------- ' Timedisp: If Hourmode <> 0 Then Goto Timedisp1 'If 24時間制表示か? Then Temp1 = Makedec(timebuff(3)) '[時]のBCD値を10進数の数値に変換。 If Temp1 < 12 Then 'If [AM]か? Then Lcd Chr(0) ; '[AM]マークを表示する。 Else Lcd Chr(1) ; '[PM]マークを表示する。 End If If Temp1 = 0 Then Temp1 = 24 '24時間制時刻を12時間制に変換する。 If Temp1 > 12 Then Temp1 = Temp1 - 12 Temp1 = Makebcd(temp1) '10進数の数値をBCD値に変換。 Gosub Zerosupbcd '上位桁をゼロサプレスして[時]を表示。 Timedisp2: Lcd ":" ; Hex(timebuff(2)) ; '[分]を表示。 Return ' ' Timedisp1: '24時間制の場合。 Lcd " " ; '[AM/PM]マークを消去する。 Temp1 = Timebuff(3) Gosub Zerosupbcd '上位桁をゼロサプレスして[時]を表示。 Goto Timedisp2 ' ' ----------------------------------- ' * [秒]をLCDに表示するサブルーチン * ' ----------------------------------- ' Secdisp: Lcd ":" ; Hex(timebuff(1)) '[秒]を表示。 Return ' ' ------------------------------------------------------------ ' * BCD値の上位桁をゼロサプレスしてLCDに表示するサブルーチン * (Temp1 = 入力BCDデータ) ' ------------------------------------------------------------ ' Zerosupbcd: If Temp1 < 10 Then 'If 上位桁が0か? Then Lcd " " ; Temp1 ; Else Lcd Hex(temp1); End If Return ' ' ------------------------------------------------------------------- ' * バイナリー値の上位桁をゼロサプレスしてLCDに表示するサブルーチン * (Temp1 = 入力バイナリーデータ) ' ------------------------------------------------------------------- ' Zerosupbin: If Temp1 < 10 Then 'If 上位桁が0か? Then Lcd " " ; End If Lcd Temp1; Return ' ' ---------------------------------------------- ' * シリアル出力に[日時]を出力するサブルーチン * ' ---------------------------------------------- ' Seridatetime: Print #1 , Hex(timebuff(6)) ; "/" ; 'ターミナルへ[年]を表示する。 Print #1 , Hex(timebuff(5)) ; "/" ; 'ターミナルへ[月]を表示する。 Print #1 , Hex(timebuff(4)) ; " "; 'ターミナルへ[日]を表示する。 Print #1 , Hex(timebuff(3)) ; ":" ; 'ターミナルへ[時]を表示する。 Print #1 , Hex(timebuff(2)) ; ":" ; 'ターミナルへ[分]を表示する。 Print #1 , Hex(timebuff(1)) ; " "; 'ターミナルへ[秒]を表示する。 Return ' ' ---------------------------------------------- ' * シリアル出力に[距離]を出力するサブルーチン * ' ---------------------------------------------- ' Seridistance: Print #1 , "* Lightning "; If Temp1 < 10 Then 'If 上位桁が0か? Then Print #1 , " "; End If Print #1 , Temp1 ; " Km" 'ターミナルへ距離を表示する。 Return ' ' -------------------------------------------- ' * [AS3935]にコマンドを送信するサブルーチン * ' -------------------------------------------- ' As3935comtr: I2csend &H00 , I2cbuff(1) , 2 'I2Cバスで、2バイトのデータを送信する。 Return ' ' -------------------------------------------- ' * AS3935のレジスターへ書き込むサブルーチン * ' -------------------------------------------- ' As3935regwr: I2cbuff(1) = &H00 'レジスター[00]のアドレスを指定する。 I2cbuff(2) = Eepas3935reg(1) 'AS3935のレジスター[00h]設定値。 I2cbuff(3) = Eepas3935reg(2) 'AS3935のレジスター[01h]設定値。 I2cbuff(4) = Eepas3935reg(3) 'AS3935のレジスター[02h]設定値。 I2csend &H00 , I2cbuff(1) , 4 'I2Cバスで、4バイトのデータを送信する。 Return ' ' ----------------------------------------------- ' * [RX-8025NB]にコマンドを送信するサブルーチン * ' ----------------------------------------------- ' Rx8025nbcomtr: I2csend &H64 , I2cbuff(1) , 2 'I2Cバスで、2バイトのデータを送信する。 Return ' ' ------------------------------------------ ' * スイッチが離されるのを待つサブルーチン * ' ------------------------------------------ ' Swoffchk: Waitms 30 'チャタリングの待ち時間。 Bitwait Sw_1 , Set '[SW1]が離されるまで待つ。 Bitwait Sw_2 , Set '[SW2]が離されるまで待つ。 Bitwait Sw_3 , Set '[SW3]が離されるまで待つ。 Waitms 30 'チャタリングの待ち時間。 Return ' ' ------------------------------------ ' * 1KHzの音を50mS鳴らすサブルーチン * ' ------------------------------------ ' Buzzer1khz: Sound Sp_out , 50 , 83 '1KHzの音を50mS鳴らす。 Return ' ' --------------------------- ' * [RX-8025NB]を初期化する * ' --------------------------- ' Rx8025init: Locate 1 , 1 Lcd "RTC Initializing" Wait 2 'RTCの起動待ち時間。 ' Restore Rx8025initdata 'I2C送信バッファーに初期値データをセットする。 For Temp1 = 1 To 17 Read I2cbuff(temp1) Next Temp1 ' I2csend &H64 , I2cbuff(1) , 17 'I2Cバスで、17バイトのデータを送信する。 Return ' ' --------------------------------------- ' * [RX-8025NB]から時刻データを読み出す * ' --------------------------------------- ' Rx8025timeread: I2cbuff(1) = &H00 '[0] Second レジスタのアドレスを指定する。 I2creceive &H64 , I2cbuff(1) , 1 , 7 'I2Cバスで、1バイトのコマンドを送信し、7バイトのデータを受信する。 Timebuff(1) = I2cbuff(1) '[秒]データを保存する。 Timebuff(2) = I2cbuff(2) '[分]データを保存する。 Timebuff(3) = I2cbuff(3) '[時]データを保存する。 Timebuff(4) = I2cbuff(5) '[日]データを保存する。 Timebuff(5) = I2cbuff(6) And &H1F '[月]データを保存する。 Timebuff(6) = I2cbuff(7) '[年]データを保存する。 Timebuff(7) = I2cbuff(4) '[曜日]データを保存する。 Return ' ' --------------------------------- ' * エラー[RX-8025NB]の応答が無い * ' --------------------------------- ' Errordisp1: Lcd "RX-8025NB Error!" Locate 2 , 1 Lcd "#RTC No response" Stop ' ' ------------------------------------- ' * エラー[RX-8025NB]のバッテリー切れ * ' ------------------------------------- ' Errordisp2: Lcd "RX-8025NB" Locate 2 , 1 Lcd "#Battery is dead" Wait 5 '表示の待ち時間。 Return '-------------------------------------------------------------------------------- ' ' **************** ' * 時刻設定処理 * ' **************** ' Timeset: Timebuff(1) = 0 '[秒]を[00]にする。 Cls 'LCDを全面消去する。 Locate 1 , 2 Lcd "20"; Gosub Yeardisp '[年月日]をLCDに表示する。 Lcd " " ; Lcd Lookupstr(timebuff(7) , Weekdata) ; '[曜日]をLCDに表示する。 Locate 2 , 3 Gosub Timedisp1 '[時分]を24時間制でLCDに表示する。 Gosub Secdisp '[秒]をLCDに表示する。 Locate 2 , 14 Temp1 = Eepdigioffset 'EEPROM [RX-8025NB] Digital Offset値。 Gosub Digioffdisp '[Digital Offset]値を表示する。 Gosub Swoffchk 'スイッチが離されるのを待つ。 Cursor Blink 'LCDのカーソルを点滅にする。 ' Tempstr2 = "0" Temp1 = Makedec(timebuff(6)) '[年]のBCD値を10進数の数値に変換。 Temp2 = 1 'LCDの[Y]アドレス。 Temp3 = 4 'LCDの[X]アドレス。 Temp4 = 0 '設定の下限値。 Temp5 = 99 '設定の上限値。 Temp6 = 0 '設定値の表示モード。 Gosub Setswin Timebuff(6) = Makebcd(temp1) '10進数の数値をBCD値に変換。 ' Tempstr2 = " " Temp1 = Makedec(timebuff(5)) '[月]のBCD値を10進数の数値に変換。 Temp3 = 7 'LCDの[X]アドレス。 Temp4 = 1 '設定の下限値。 Temp5 = 12 '設定の上限値。 Gosub Setswin Timebuff(5) = Makebcd(temp1) '10進数の数値をBCD値に変換。 ' Temp1 = Makedec(timebuff(4)) '[日]のBCD値を10進数の数値に変換。 Temp3 = 10 'LCDの[X]アドレス。 Temp5 = 31 '設定の上限値。 Gosub Setswin Timebuff(4) = Makebcd(temp1) '10進数の数値をBCD値に変換。 ' Temp1 = Timebuff(7) '[曜日]の設定。 Temp3 = 13 'LCDの[X]アドレス。 Temp4 = 0 '設定の下限値。 Temp5 = 6 '設定の上限値。 Temp6 = 1 '設定値の表示モード。(曜日) Gosub Setswin Timebuff(7) = Temp1 ' Tempstr2 = "0" Temp1 = Makedec(timebuff(3)) '[時]のBCD値を10進数の数値に変換。 Temp2 = 2 'LCDの[Y]アドレス。 Temp3 = 4 'LCDの[X]アドレス。 Temp5 = 23 '設定の上限値。 Temp6 = 0 '設定値の表示モード。 Gosub Setswin Timebuff(3) = Makebcd(temp1) '10進数の数値をBCD値に変換。 ' Temp1 = Makedec(timebuff(2)) '[分]のBCD値を10進数の数値に変換。 Temp3 = 7 'LCDの[X]アドレス。 Temp5 = 59 '設定の上限値。 Gosub Setswin Timebuff(2) = Makebcd(temp1) '10進数の数値をBCD値に変換。 ' Tempstr2 = " " Temp1 = Eepdigioffset 'EEPROM [RX-8025NB] Digital Offset値。 Temp3 = 14 'LCDの[X]アドレス。 Temp5 = &H7F '設定の上限値。 Temp6 = 2 '設定値の表示モード。(Digital Offset値) Gosub Setswin Eepdigioffset = Temp1 'EEPROMに保管する。 ' ' I2cbuff(1) = &H00 '[RX-8025NB]レジスタのスタートアドレス+転送モード。 I2cbuff(2) = Timebuff(1) '[秒]データを保存する。 I2cbuff(3) = Timebuff(2) '[分]データを保存する。 I2cbuff(4) = Timebuff(3) '[時]データを保存する。 I2cbuff(5) = Timebuff(7) '[曜日]データを保存する。 I2cbuff(6) = Timebuff(4) '[日]データを保存する。 I2cbuff(7) = Timebuff(5) '[月]データを保存する。 I2cbuff(8) = Timebuff(6) '[年]データを保存する。 I2cbuff(9) = Temp1 '[Digital Offset]値を保存する。 I2csend &H64 , I2cbuff(1) , 9 'I2Cバスで、9バイトのデータを送信する。 Timesetret: Gosub Swoffchk 'スイッチが離されるのを待つ。 Cursor Noblink 'LCDのカーソルを点滅無しにする。 Cls 'LCDを全面消去する。 Time1sf = 1 '日時を強制表示させる。 Litmemnum = 1 '[雷]検知データメモリーのLCD表示番号を初期化する。 Return ' ' * [Digital Offset]値を表示するサブルーチン * ' Digioffdisp: Select Case Temp1 Case 0: '[0]の場合 Lcd " 0" Case Is < &H40 : '[-]の場合。 Lcd "-" ; Gosub Zerosupbin 'バイナリー値の上位桁をゼロサプレスしてLCDに表示する。 Case Else : '[+]の場合。 Temp8 = Temp1 Temp1 = Not Temp1 Temp1 = Temp1 And &H7F Temp1 = Temp1 + 1 Lcd "+" ; Gosub Zerosupbin 'バイナリー値の上位桁をゼロサプレスしてLCDに表示する。 Temp1 = Temp8 End Select Return ' ' * 設定用のスイッチ入力処理 * ' Setswin: Locate Temp2 , Temp3 'LCDのカーソルを移動する。 Select Case Temp6 '設定値を表示する。 Case 0 : '[0]数値の場合。 If Temp1 < 10 Then 'If 1桁の数値か? Then Lcd Tempstr2 ; '10の桁に[0]または[ ]を表示する。 End If Lcd Temp1 ' Case 1 : '[曜日]の設定の場合。 Lcd Lookupstr(temp1 , Weekdata) '[曜日]をLCDに表示する。 ' Case 2 : '[Digital Offset]値設定の場合。 Gosub Digioffdisp '[Digital Offset]値を表示する。 ' Case 3 : '[OFF/ON]の選択。 If Temp1 = 0 Then 'If OFFか? Then Lcd " OFF" Else Lcd " ON" End If ' Case 4 : '[ブザー音の長さ]選択。 Select Case Temp1 Case 0 : Lcd " 50" : Case 1 : Lcd " 200" : Case Else : Lcd " 500" ; End Select ' Case Else : '機能設定の数値の場合。 If Temp1 = Temp7 Then 'If 初期値か? Then Lcd " *" ; Else Lcd " " ; End If If Temp1 < 10 Then 'If 1桁の数値か? Then Lcd " " '10の桁に[0]または[ ]を表示する。 End If Lcd Temp1 End Select If Temp6 = 100 Then 'If LCDのコントラスト設定か? Then Lcdcontrast Temp1 'LCDのコントラストを設定する。(0〜63) End If Locate Temp2 , Temp3 'LCDのカーソルを移動する。 Gosub Swoffchk 'スイッチが離されるのを待つ。 Setswin4: If Sw_1 = 0 Then Goto Setswin1 'If [SW1]が押されたか? Then If Sw_2 = 0 Then Goto Setswin2 'If [SW2]が押されたか? Then If Sw_3 = 0 Then Goto Setswin3 'If [SW3]が押されたか? Then Goto Setswin4 ' ' Setswin1: Return ' ' Setswin2: '[SW2]設定値を+1する。 Temp1 = Temp1 + 1 If Temp1 > Temp5 Then 'If 上限値か? Then Temp1 = Temp4 End If Goto Setswin ' ' Setswin3: '[SW3]設定値を−1する。 If Temp1 = Temp4 Then 'If 下限値か? Then Temp1 = Temp5 Else Temp1 = Temp1 - 1 End If Goto Setswin '-------------------------------------------------------------------------------- ' ' **************** ' * 機能設定処理 * ' **************** ' Optionset: Cls 'LCDを全面消去する。 Lcd "LCD Contrast" 'LCDのコントラスト設定。 Locate 2 , 4 Lcd "setting :" Gosub Swoffchk 'スイッチが離されるのを待つ。 Cursor Blink 'LCDのカーソルを点滅にする。 ' Temp1 = Eeplcdcontrast 'EEPROM LCDのコントラスト設定。(0〜63) Temp2 = 2 'LCDの[Y]アドレス。 Temp3 = 13 'LCDの[X]アドレス。 Temp4 = 0 '設定の下限値。 Temp5 = 63 '設定の上限値。 Temp6 = 100 '設定値の表示モード。(LCDのコントラスト設定) Temp7 = 40 '初期値。 Gosub Setswin Eeplcdcontrast = Temp1 'EEPROMに保管する。 ' ' Goto Timesetret '-------------------------------------------------------------------------------- ' ' ****************************** ' * 外部割り込み[INT1]ルーチン * [RX-8025NB]の/INTA ' ****************************** ' Exint1: I2cbuff(1) = &HF0 '[Control 2]レジスタのアドレスを指定する。 I2cbuff(2) = &H00 '[CTFG]ビットをリセットする。 Gosub Rx8025nbcomtr '[RX-8025NB]にコマンドを送信する。 Time1sf = 1 '1秒更新フラグを立てる。 Return ' ' **************************** ' * ピン変化割り込みルーチン * [SW1],[SW2],[SW3],[AS3935]の[IRQ] ' **************************** ' Pinchgint: '何も処理しない。 Return End '-------------------------------------------------------------------------------- ' ' * RTC [RX-8025NB]の初期設定データ・テーブル * ' Rx8025initdata: Data &H00 '[RX-8025NB]レジスタのスタートアドレス+転送モード。 Data &H00 '[0] Seconds Data &H00 '[1] Minutes Data &H00 '[2] Hours Data &H00 '[3] Weekdays Data &H01 '[4] Days Data &H01 '[5] Months Data &H15 '[6] Years Data &H00 '[7] Digital Offset Data &H00 '[8] Alarm_W ; Minute Data &H00 '[9] Alarm_W ; Hour Data &H00 '[A] Alarm_W ; Weekday Data &H00 '[B] Alarm_D ; Minute Data &H00 '[C] Alarm_D ; Hour Data &H00 '[D] Reserved Data &B0010_0100 '[E] Control 1 Data &B0000_0000 '[F] Control 2 ' ' * 曜日 データ・テーブル * ' Weekdata: Data "SUN" , "MON" , "TUE" , "WED" , "THU" , "FRI" , "SAT"