$prog &HFF , &HE2 , &HD9 , &HFC 'CKDIV8 = 1 , BODLEVEL = 4.3V ' ' ************************************************ ' * RGBフルカラードットマトリクスLEDパネル * ' * 温度・湿度・気圧計+時計 [V2] プログラム * ' * Ver. 0.21 2017.12. 5 * ' ************************************************ ' ' Ver 0.21 V2 [試用版] 初回公開バージョン。2017.12. 5 ' Const Prgver = " 0.21" 'プログラム・バージョン。 Const Scroll_version = 0 'スクロール無しと有りのバージョン選択。(0:無し , 1:有り) ' ' Const Number_of_panel = 1 'パネルの枚数。(1〜4) Const Ledbuff_length = 32 + 40 'LEDバッファーの横軸バイト数。(横32ドット × パネル枚数 + スクロールバッファー分) Const Ledbuff_size = 256 + 320 'LEDバッファーの容量。(横32バイト × パネル枚数 × 縦8ドット + スクロールバッファー分) ' Const Bme280_adr = &HEC 'BME280のI2Cアドレス。 ' $baud = 9600 'ハードウェアUARTの通信速度(ボーレート)を設定。 $regfile = "m328pdef.dat" '使用するAVRを設定。 $crystal = 8000000 'AVRクロックを設定。 ' $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 32 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 ' ' * ポート名の定義 * ' Panel_rgb Alias Portb 'RGB LEDパネル [R1,G1,B1,R2,G2,B2]の接続ポート。 Panel_a Alias Portd.7 'RGB LEDパネル [A]の接続ポート.ビット。 Panel_a_p Alias Portd 'RGB LEDパネル [A]の接続ポート。 Panel_a_b Alias 7 'RGB LEDパネル [A]の接続ビット。 Panel_b Alias Portd.6 'RGB LEDパネル [B]の接続ポート.ビット。 Panel_b_p Alias Portd 'RGB LEDパネル [B]の接続ポート。 Panel_b_b Alias 6 'RGB LEDパネル [B]の接続ビット。 Panel_c Alias Portd.5 'RGB LEDパネル [C]の接続ポート.ビット。 Panel_c_p Alias Portd 'RGB LEDパネル [C]の接続ポート。 Panel_c_b Alias 5 'RGB LEDパネル [C]の接続ビット。 Panel_clk Alias Portb.7 'RGB LEDパネル [CLK]の接続ポート.ビット。 Panel_clk_p Alias Portb 'RGB LEDパネル [CLK]の接続ポート。 Panel_clk_b Alias 7 'RGB LEDパネル [CLK]の接続ビット。 Panel_lat Alias Portb.6 'RGB LEDパネル [LAT]の接続ポート.ビット。 Panel_lat_p Alias Portb 'RGB LEDパネル [LAT]の接続ポート。 Panel_lat_b Alias 6 'RGB LEDパネル [LAT]の接続ビット。 Panel_oe Alias Portd.4 'RGB LEDパネル [OE]の接続ポート.ビット。 Panel_oe_p Alias Portd 'RGB LEDパネル [OE]の接続ポート。 Panel_oe_b Alias 4 'RGB LEDパネル [OE]の接続ビット。 ' Sw_1 Alias Pinc.1 'スイッチ[1]の接続ポート。 Sw_1pu Alias Portc.1 'スイッチ[1]の接続ポート(プルアップ用)。 Sw_2 Alias Pinc.2 'スイッチ[2]の接続ポート。 Sw_2pu Alias Portc.2 'スイッチ[2]の接続ポート(プルアップ用)。 Sw_3 Alias Pinc.3 'スイッチ[3]の接続ポート。 Sw_3pu Alias Portc.3 'スイッチ[3]の接続ポート(プルアップ用)。 Rtc_1s Alias Pinc.5 'RTC [DS3231]の1秒出力接続ポート。 Rtc_1spu Alias Portc.5 'RTC [DS3231]の1秒出力接続ポート(プルアップ用)。 Usb_power Alias Pinc.4 'USB-シリアル変換の電源検出接続ポート。 ' ' * 変数の宣言 * ' Dim Ledbuff(ledbuff_size) As Byte 'RGB LEDパネルのデータ・バッファー。(横32バイト * パネル枚数 * 縦8ドット + スクロールバッファー分) Dim Rowadr As Byte 'LEDバッファーのロー・アドレスカウンター。(0〜7) Dim Ledintf As Byte 'LED表示割り込み発生フラグ。 Dim Transfer_length As Byte 'LEDバッファーに転送するバイト数。 Dim Ledx As Byte 'LED表示の[X]アドレス。(1〜128) Dim Ledy As Byte 'LED表示の[Y]アドレス。(1〜2) Dim Ledcolor As Byte 'LED表示の文字色。(0〜7) Dim Ledback As Byte 'LED表示の背景色。(0〜7) Dim Ledchr As Byte 'LED表示の文字ASCIIコード。(&H20〜&HFF) Dim Ledlen As Byte 'LED表示のXの塗りつぶしドット数。(1〜128) ' Dim Swcount As Byte 'スイッチ入力チェック用タイマーカウンター。 Dim Swflag As Byte 'スイッチ入力検出フラグ。 Dim Swdata As Byte 'スイッチ入力データ。 Dim Swtemp As Byte 'スイッチ入力データの一時保管用。 Dim Timebuff(8) As Byte '時刻データバッファー。 Dim Hourmode As Byte '12/24時間制表示選択。(0:12時間制 , 1:24時間制) Dim Time100ms As Byte '100mSカウンター。 Dim Brighttemp As Byte '輝度値の保管用。 Dim Brightcount As Byte '輝度値の平均カウンター。 Dim Brightsum As Word '輝度値の平均合計値。 Dim Brightmax As Byte 'LEDパネルの輝度上限値。(12〜123) Dim Dispsta As Byte '表示の状態。(0:表示OFF , 1:固定表示モード , 2:スクロールモード) Dim Dispmode As Byte '表示モード。(0:時刻+センサー , 1:上下固定) Dim Mode0item As Byte '表示モード0の項目選択。(0:温度, 1:湿度, 2:気圧, 3:気圧の24時間偏差値, 4:予報, 5:秒, &H10:自動) Dim Mode1item As Byte '表示モード1の項目選択。(0:日付+時間, 1:温度+湿度, 2:24時間偏差値+気圧, 3:最高最低温度, 4:最高最低湿度, 5:最高最低気圧) Dim Colcoun As Byte 'コロン消灯用500mSカウンター。 Dim Colmode As Byte 'コロン表示モード。(0:コロン点滅無し , 1:コロン点滅有り) Dim Timedispflag As Byte '時刻の表示フラグ。(0:時刻表示無し , 1:上段に時刻表示有り , 2:下段に時刻表示有り) Dim Dateinsflag As Byte '日付の差し込み表示フラグ。 Dim Hourtemp As Byte '[時]更新用テンポラリ。 Dim Daytemp As Byte '[日]更新用テンポラリ。 Dim Dateinsert As Byte '日付の差し込み表示。(0:無し , 1:有り) Dim Dateinstime As Byte '日付の差し込み秒。(4〜8秒) Dim Serialtime As Byte 'シリアル出力の間隔。(0:OFF , 1:1秒 , 2:10秒 , 3:1分 , 4:10分 , 5:1時間) Dim Serialbuff(40) As Byte 'シリアル送信バッファー。 Dim Serialcount As Byte 'シリアル送信バッファーのカウンター。 Dim Usbpowflag As Byte 'USB電源の状態フラグ。 Dim Scrolltime As Byte 'スクロール間隔の設定値。(×10ms) [1〜20] Dim Timecount As Byte 'スクロール時間用カウンター。 Dim Scrollcount As Byte 'スクロール用ビットカウンター。 Dim Scrolllen As Byte 'スクロール用ビットレングス。 Dim Scrolitem As Byte 'スクロール表示中の表示項目。 Dim Scrollvertical As Byte '縦スクロール用ビットカウンター。 Dim Scrollvertime As Byte '縦スクロール用タイマー。 Dim Scrollverspd As Byte '縦スクロールのスピード。(×10ms) [1〜10] ' Dim Temperature As Integer '温度値。(x0.1) Dim Humidity As Word '湿度値。(x0.1) Dim I2cbuff(30) As Byte 'I2C送受信バッファー。 Dim Baropress As Word '気圧値。 Dim Tempmax As Integer '温度の最高値。 Dim Tempmin As Integer '温度の最低値。 Dim Humimax As Word '湿度の最高値。 Dim Humimin As Word '湿度の最低値。 Dim Baromax As Word '気圧の最高値。 Dim Baromin As Word '気圧の最低値。 Dim Deviation As Integer '気圧の24時間偏差値。 Dim Weather As Byte '天気予報値。 Dim Dbuff(24) As Word '24時間のデータバッファー。 Dim Dbuffpoi As Byte '24時間のデータバッファー用ポインター。 Dim Tbuff(48) As Word '48時間のデータバッファー。 Dim Tbuffpoi As Byte '48時間のデータバッファー用ポインター。 ' Dim Sqw1hzflag As Byte 'DS3231の[SQW]ピンの1Hz確認フラグ。 Dim Time1s As Byte '1秒経過フラグ。 Dim T As Integer , H As Integer , P As Dword '温度値,湿度値,気圧値の変数。 ' 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 Tempw2 As Word '汎用テンポラリ変数 Word型 No.2 Dim Tempw3 As Word '汎用テンポラリ変数 Word型 No.3 Dim Tempi1 As Integer '汎用テンポラリ変数 Integer型 No.1 Dim Tempstr As String * 90 '汎用テンポラリ変数 String型 Dim Tempstr2 As String * 10 '汎用テンポラリ変数 String型 Dim Tl1 As Long '汎用テンポラリ変数 Long型 No.1 Dim Tl2 As Long '汎用テンポラリ変数 Long型 No.2 ' Dim Dummy As Eram Long 'EEPROM 4バイトのダミーエリア。 Dim Eephourmode As Eram Byte 'EEPROM 12/24時間制表示選択。(0:12時間制 , 1:24時間制) Dim Eepdispsta As Eram Byte 'EEPROM 表示の状態。(0:表示OFF , 1:固定表示モード , 2:スクロールモード) Dim Eepdispmode As Eram Byte 'EEPROM 表示モード。(0:時刻+センサー , 1:上下固定) Dim Eepmode0item As Eram Byte 'EEPROM 表示モード0の項目選択。(0:温度, 1:湿度, 2:気圧, 3:気圧の24時間偏差値, 4:予報, 5:秒, &H10:自動) Dim Eepmode1item As Eram Byte 'EEPROM 表示モード1の項目選択。(0:日付+時間, 1:温度+湿度, 2:24時間偏差値+気圧, 3:最高最低温度, 4:最高最低湿度, 5:最高最低気圧) Dim Eepcolmode As Eram Byte 'EEPROM コロンの表示モード。(0:コロン点滅無し , 1:コロン点滅有り) Dim Eepdateinsert As Eram Byte 'EEPROM 日付の差し込み表示。(0:無し , 1:有り) Dim Eepdateinstime As Eram Byte 'EEPROM 日付の差し込み秒。(4〜8秒) Dim Eepbrightmax As Eram Byte 'EEPROM LEDパネルの輝度上限値。(12〜123) Dim Eepautoreset As Eram Byte 'EEPROM 最高・最低値の0:00自動リセット。(0:無し , 1:有り) Dim Eepserialtime As Eram Byte 'EEPROM シリアル出力の間隔。(0:OFF , 1:1秒 , 2:10秒 , 3:1分 , 4:10分 , 5:1時間) Dim Eepscrolltime As Eram Byte 'EEPROM スクロール間隔の設定値。(×10ms) [1〜20] Dim Eepscrollverspd As Eram Byte 'EEPROM 縦スクロールのスピード。(×10ms) [1〜10] Dim Eepagingoffset As Eram Byte 'EEPROM [DS3231] Aging Offset値。 ' ' * ポートの初期設定 * ' Config Panel_rgb = Output 'RGB LEDパネル [R1,G1,B1,R2,G2,B2]の接続ポートを出力に設定する。 Config Panel_a = Output 'RGB LEDパネル [A]の接続ポートを出力に設定する。 Config Panel_b = Output 'RGB LEDパネル [B]の接続ポートを出力に設定する。 Config Panel_c = Output 'RGB LEDパネル [C]の接続ポートを出力に設定する。 Config Panel_clk = Output 'RGB LEDパネル [CLK]の接続ポートを出力に設定する。 Config Panel_lat = Output 'RGB LEDパネル [LAT]の接続ポートを出力に設定する。 Config Panel_oe = Output 'RGB LEDパネル [OE]の接続ポートを出力に設定する。 Set Panel_oe 'RGB LEDパネル [OE]の接続ポートを[H]にする。 Set Sw_1pu 'スイッチ[1]の接続ポートをプルアップ。 Set Sw_2pu 'スイッチ[2]の接続ポートをプルアップ。 Set Sw_3pu 'スイッチ[3]の接続ポートをプルアップ。 Set Rtc_1spu 'RTC [DS3231]の1秒出力接続ポートをプルアップ。 ' ' * I2Cの初期設定 * ' Config Scl = Portd.3 'I2CバスのSCLラインを接続するポートピンを設定。 Config Sda = Portd.2 'I2CバスのSDAラインを接続するポートピンを設定。 I2cinit 'I2Cバスを初期化する。 ' ' * Timerの設定 * ' Config Timer2 = Pwm , Prescale = 32 , Clear Timer = 1 'Timer2の設定。8,000,000Hz / 32 = 250,000Hz Set Tccr2b.wgm22 '高速PWM動作。 Compare2a = 125 - 1 '250,000Hz / 125カウント = 2,000Hz(500us) Compare2b = 20 '輝度値。 On Compare2a Tint2a Nosave 'TIMER2比較一致A割り込みルーチンのラベルを設定。 Enable Compare2a 'TIMER2比較一致A割り込みを許可。 On Compare2b Tint2b Nosave 'TIMER2比較一致B割り込みルーチンのラベルを設定。 Enable Compare2b 'TIMER2比較一致B割り込みを許可 ' Config Timer0 = Timer , Prescale = 1024 , Clear Timer = 1 'Timer0の設定。8,000,000Hz / 1024 = 7,812.5Hz Compare0a = 78 - 1 '7,812.5Hz / 78カウント = 約100Hz(10ms) ' ' * A/Dコンバータの設定 * ' Config Adc = Single , Prescaler = 16 , Reference = Avcc 'A/Dコンバータの設定。 Start Adc 'A/Dコンバータに電源を供給する。 Config Aci = Off 'アナログ比較器の電源を切る。 Didr0 = &B0000_0001 'デジタル入力禁止レジスタの設定。 ' ' * Timer2 割り込みの初期値設定 * ' #if Number_of_panel = 1 'LEDバッファーに転送するバイト数を設定する。 Transfer_length = 32 '32バイトを転送する。 #endif #if Number_of_panel = 2 Transfer_length = 64 '64バイトを転送する。 #endif #if Number_of_panel = 3 Transfer_length = 96 '96バイトを転送する。 #endif #if Number_of_panel = 4 Transfer_length = 128 '128バイトを転送する。 #endif ' Enable Interrupts 'すべての割り込みを許可。 ' Wait 1 '[DS3231]と[BME280]のパワーオン時間を待つ。 ' ' * RTC [DS3231]の初期設定 * ' I2cbuff(1) = &H0F '[0Fh] ステータス・レジスターのアドレスを指定する。 I2creceive &HD0 , I2cbuff(1) , 1 , 1 'I2Cバスで、1バイトのコマンドを送信し、1バイトのデータを受信する。 If Err <> 0 Then 'If [DS3231]の応答が無いか? Then Ledx = 2 '[DS3231]のデバイス・エラーを表示する。 Ledy = 1 Ledcolor = 1 Ledback = 0 Tempstr = "Err01" Gosub Leddisp Ledx = 2 Ledy = 2 Ledcolor = 3 Tempstr = "RtcNG" Gosub Leddisp Stop '機能停止。 ' End If ' If I2cbuff(1).7 = 1 Then 'If [DS3231]のバッテリー切れ[OSF=1]か? Then Ledx = 2 'バッテリーの電圧が下がった警告を表示する。 Ledy = 1 Ledcolor = 1 Ledback = 0 Tempstr = "Err02" Gosub Leddisp Ledx = 2 Ledy = 2 Ledcolor = 3 Tempstr = "BatNG" Gosub Leddisp Wait 5 '表示の待ち時間。 ' End If ' Temp2 = I2cbuff(1).7 '[DS3231]のバッテリー状態bit[OSF]を取り出す。 Temp1 = Sw_1 Or Sw_3 If Temp1 = 0 Then 'If [SW1]と[SW3]が同時に押されているか? Then Temp2 = 1 End If If Temp2 <> 0 Then 'If [DS3231]を初期化するか? Then Gosub Ds3231init '[DS3231]を初期化する。 Eepagingoffset = 0 'EEPROM [DS3231] Aging Offset値。 End If Gosub Ds3231read '[DS3231]から日時を読み出す。 ' ' * [BME280]の接続を確認する * ' I2cbuff(1) = &HD0 '[ID]レジスター。 I2creceive Bme280_adr , I2cbuff(1) , 1 , 1 'I2Cバスで、1バイトのコマンドを送信し1バイトのデータを受信する。 If I2cbuff(1) <> &H60 Then 'If [BME280]のチップ識別番号が返ってこないか? Then Ledx = 2 '[BME280]のデバイス・エラーを表示する。 Ledy = 1 Ledcolor = 1 Ledback = 0 Tempstr = "Err03" Gosub Leddisp Ledx = 2 Ledy = 2 Ledcolor = 3 Tempstr = "BmeNG" Gosub Leddisp Wait 5 '表示の待ち時間。 ' End If Gosub Bme280init 'BME280の初期設定。 ' ' * プログラム・バージョンの表示 * ' If Sw_1 = 0 Then 'If [SW1]が押されているか? Then Ledx = 2 'プログラム・バージョンの表示。 Ledy = 1 Ledcolor = 4 Ledback = 0 Tempstr = "PgVer" Gosub Leddisp Ledx = 2 Ledy = 2 Ledcolor = 2 Tempstr = Prgver Gosub Leddisp End If Gosub Swoffchk 'スイッチが離されるのを待つ。 ' ' * EEPROMのデータを確認する * ' If Eephourmode > 1 Then 'If EEPROMが初期値か? Then Eephourmode = 0 'EEPROM 12/24時間制表示選択。(0:12時間制 , 1:24時間制) Eepdispsta = 1 'EEPROM 表示の状態。(0:表示OFF , 1:固定表示モード , 2:スクロールモード) Eepdispmode = 0 'EEPROM 表示モード。(0:時刻+センサー , 1:上下固定) Eepmode0item = 0 'EEPROM 表示モード0の項目選択。(0:温度, 1:湿度, 2:気圧, 3:気圧の24時間偏差値, 4:予報, 5:秒, &H10:自動) Eepmode1item = 0 'EEPROM 表示モード1の項目選択。(0:日付+時間, 1:温度+湿度, 2:24時間偏差値+気圧, 3:最高最低温度, 4:最高最低湿度, 5:最高最低気圧) Eepcolmode = 1 'EEPROM コロンの表示モード。(0:コロン点滅無し , 1:コロン点滅有り) Eepdateinsert = 1 'EEPROM 日付の差し込み表示。(0:無し , 1:有り) Eepdateinstime = 7 'EEPROM 日付の差し込み秒。(4〜8秒) Eepbrightmax = 123 'EEPROM LEDパネルの輝度上限値。(12〜123) Eepautoreset = 1 'EEPROM 最高・最低値の0:00自動リセット。(0:無し , 1:有り) Eepserialtime = 1 'EEPROM シリアル出力の間隔。(0:OFF , 1:1秒 , 2:10秒 , 3:1分 , 4:10分 , 5:1時間) Eepscrolltime = 10 'EEPROM スクロール間隔の設定値。(×10ms) [1〜20] Eepscrollverspd = 3 'EEPROM 縦スクロールのスピード。(×10ms) [1〜10] Eepagingoffset = 0 'EEPROM [DS3231] Aging Offset 値。 End If Hourmode = Eephourmode Dispsta = Eepdispsta Dispmode = Eepdispmode Mode0item = Eepmode0item Mode1item = Eepmode1item Colmode = Eepcolmode Dateinsert = Eepdateinsert Dateinstime = Eepdateinstime Brightmax = Eepbrightmax Serialtime = Eepserialtime Scrolltime = Eepscrolltime Scrollverspd = Eepscrollverspd ' ' * 変数の初期値設定 * ' Dbuffpoi = 1 '24時間のデータバッファーポインターを初期化。 Tbuffpoi = 1 '48時間のデータバッファーポインターを初期化。 Hourtemp = 255 '[時]の更新テンポラリの初期化。 Daytemp = Timebuff(4) '[日]の更新テンポラリの初期化。 Weather = 125 '天気の初期値。(予報が始まるまでの待ち時間) Tempmax = -400 '温度の最高値を初期化する。 Tempmin = 800 '温度の最低値を初期化する。 Humimax = 0 '湿度の最高値を初期化する。 Humimin = 999 '湿度の最低値を初期化する。 Baromax = 5000 '気圧の最高値を初期化する。 Baromin = 11500 '気圧の最低値を初期化する。 Scrolllen = 37 'スクロールビットのレングス。 Scrollcount = 39 'スクロールバッファーへ新規文字を書き込ませる。 Usbpowflag = 1 'USB電源フラグをON状態にする。 ' Restore Serialbuffinit 'シリアル送信バッファーへ初期データを配置する。 For Temp1 = 1 To 38 Read Temp2 Serialbuff(temp1) = Temp2 Next Temp1 Print 'シリアル出力を改行する。 ' If Dispsta = 0 Then 'If LEDの消灯状態か? Then Stop Timer2 'LEDのDMA点灯を停止する。 Set Panel_oe 'RGB LEDパネル [OE]の接続ポートを[H]にする。 End If '-------------------------------------------------------------------------------------------------- ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: If Tifr0.ocf0a = 1 Then 'If 10mS経過したか? Then Set Tifr0.ocf0a 'Timer0 比較A一致フラグをリセット。 ' ' * スイッチの確認 * ' Gosub Swin 'スイッチ入力。 Select Case Swflag Case 1 : Gosub Swon 'スイッチが押された処理。 Swflag = 0 Case 2 : Gosub Swonlong 'スイッチが長押された処理。 Swflag = 0 End Select ' ' * コロンの点滅処理 * ' If Colmode <> 0 Then 'If コロンの点滅が有りか? Then Colcoun = Colcoun + 1 If Colcoun = 50 Then 'If コロンの消灯時間か? Then Select Case Timedispflag Case 1 : '上段に時刻表示がある場合。 Ledy = 1 Gosub Colonoff 'コロンを消灯する。 Case 2 : '下段に時刻表示がある場合。 Ledy = 2 Gosub Colonoff 'コロンを消灯する。 End Select End If End If ' ' * スクロールの処理 * ' If Dispsta = 2 Then 'If スクロール・モードか? Then Gosub Scroll 'スクロール処理。 End If ' ' * 100mS毎の処理 * ' Time100ms = Time100ms + 1 If Time100ms = 10 Then 'If 100ms経過したか? Then Time100ms = 0 ' ' * LEDの輝度調整 * ' If Dispsta <> 0 Then 'If LEDを点灯しているか? Then Ledintf = 0 'A/D変換の最中にDMA割り込みが入らないようにする。 Do Loop Until Ledintf <> 0 'If LED表示割り込みが発生したか? Then Tempw1 = Getadc(0) '輝度調整ボリュームの値を読み込む。 Shift Tempw1 , Right , 3 '0〜127に縮小する。 Temp1 = Tempw1 Select Case Temp1 Case Is > Brightmax : 'If 上限値か? Then Temp1 = Brightmax Case Is < 11 : 'If 下限値か? Then Temp1 = 11 End Select If Temp1 > Brighttemp Then 'If 前回の値より大きいか? Then Temp2 = Temp1 - Brighttemp Else Temp2 = Brighttemp - Temp1 End If If Temp2 > 1 Then 'If 輝度値の変化量が2以上か? Then Compare2b = Temp1 'Timer2に輝度値を設定する。 Brighttemp = Temp1 Brightsum = 0 Brightcount = 0 Else '変化量が1以下の場合。 Brightsum = Brightsum + Temp1 '256個の平均用に合計する。(25.6秒に1回輝度を変更する) Brightcount = Brightcount + 1 If Brightcount = 0 Then 'If 256個の合計値が出来上がったか? Then Temp1 = High(brightsum) Compare2b = Temp1 'Timer2に輝度値を設定する。 Brightsum = 0 End If End If End If End If End If ' ' * 1秒毎の処理 * ' If Sqw1hzflag = 0 Then 'If 1Hz出力の[H]チェック中か? Then If Rtc_1s = 1 Then 'If 1Hz出力が[H]か?Then Sqw1hzflag = 1 Time1s = 1 '1秒経過フラグを立てる。 End If Else '1Hz出力の[L]チェック中。 If Rtc_1s = 0 Then 'If 1Hz出力が[L]か?Then Sqw1hzflag = 0 End If End If ' ' If Time1s <> 0 Then '1秒経過したか? Then Gosub Ds3231read '[DS3231]から日時を読み出す。 Colcoun = 0 'コロン消灯用500mSカウンター。 ' ' * 湿度・温度・気圧値の測定 * ' Gosub Bme280read 'BME280から測定データを読み出して補償を行う。 T = T / 10 '温度値の小数点以下を1桁にする。 Temperature = T '温度値に代入する。 H = H / 10 '湿度値の小数点以下を1桁にする。 Humidity = H '温度値に代入する。 P = P / 10 '気圧値の小数点以下を1桁にする。 Baropress = P 'ワード値に代入する。 ' ' * 最高値/最低値の確認 * ' If Tempmax < Temperature Then 'If 温度の最高値を超えたか? Then Tempmax = Temperature End If ' If Tempmin > Temperature Then 'If 温度の最低値を下回ったか? Then Tempmin = Temperature End If ' If Humimax < Humidity Then 'If 湿度の最高値を超えたか? Then Humimax = Humidity End If ' If Humimin > Humidity Then 'If 湿度の最低値を下回ったか? Then Humimin = Humidity End If ' If Baromax < Baropress Then 'If 気圧の最高値を超えたか? Then Baromax = Baropress End If ' If Baromin > Baropress Then 'If 気圧の最低値を下回ったか? Then Baromin = Baropress End If ' ' * LED表示の更新 * ' If Dispsta = 1 Then 'If 固定表示モードか? Then If Dispmode = 0 Then 'If 表示モード[0]時刻+センサーか? Then If Mode0item > &H0F Then 'If 表示モード0が自動か? Then Temp1 = Timebuff(1) And &H0F '秒の下位桁を取り出す。 If Temp1 = 0 Or Temp1 = 5 Then 'If 5秒経過したか? Then Mode0item = Mode0item + 1 If Mode0item > &H14 Then 'If 表示アイテムの上限か? Then Mode0item = &H10 End If End If ' If Dateinsert <> 0 Then 'If 日付の差し込み表示が有るか? Then If Temp1 >= Dateinstime And Temp1 < 9 Then 'If 日付の差し込み秒か? Then Dateinsflag = 1 '日付の差し込み表示をする。 Else Dateinsflag = 0 End If Else Dateinsflag = 0 End If End If End If Gosub Infodisp 'LEDに情報を表示する。 ' Else 'スクロールモードの場合。 If Dateinsert <> 0 Then 'If 日付の差し込み表示が有るか? Then Temp1 = Timebuff(1) And &H0F '秒の下位桁を取り出す。 Select Case Temp1 Case Is < Dateinstime : '[時分]を表示する期間の場合。 Ledx = 1 '上段に[時/分]を表示する。 Ledy = 1 Gosub Timedisp Timedispflag = 1 Scrollvertical = 0 Case Is = Dateinstime : '日付差し込み秒の場合。 Ledx = 33 Ledy = 1 Gosub Datedisp 'スクロールバッファーに[月/日]を書き込む。 Timedispflag = 0 Scrollvertical = 8 '縦スクロールを開始する。 Case 9 : '9秒の場合。 Ledx = 33 Ledy = 1 Gosub Timedisp 'スクロールバッファーに[時/分]を書き込む。 Timedispflag = 1 Scrollvertical = 8 '縦スクロールを開始する。 End Select Else Ledx = 1 '上段に[時/分]を表示する。 Ledy = 1 Gosub Timedisp Timedispflag = 1 Scrollvertical = 0 End If End If ' ' * シリアル出力の確認 * ' If Usbpowflag = 0 Then 'If USB電源フラグがOFF状態か? Then If Usb_power = 1 Then 'If USB電源がONになったか? Then Set Ucsr0b.rxen0 'USART受信部を許可する。(PD0がUSART入力になる) Set Ucsr0b.txen0 'USART送信部を許可する。(PD1がUSART出力になる) Usbpowflag = 1 End If ' Else 'USB電源フラグがON状態の場合。 If Usb_power = 0 Then 'If USB電源がOFFになったか? Then Reset Ucsr0b.rxen0 'USART受信部を禁止する。(PD0が汎用ポートになる) Reset Ucsr0b.txen0 'USART送信部を禁止する。(PD1が汎用ポートになる) Config Portd.0 = Output 'PD0を[L]レベルにする。 Reset Portd.0 Config Portd.1 = Output 'PD1を[L]レベルにする。 Reset Portd.1 Usbpowflag = 0 Serialcount = 0 'シリアル送信データを無しにする。 ' Else 'USB電源がONの場合。 Select Case Serialtime Case 1 : '1秒間隔の場合。 Gosub Serialset '時刻とセンサー値をシリアル出力する。 ' Case 2 : '10秒間隔の場合。 Temp1 = Timebuff(1) And &H0F '秒の下位桁を取り出す。 If Temp1 = 0 Then 'If 10秒経過したか? Then Gosub Serialset '時刻とセンサー値をシリアル出力する。 End If ' Case 3 : '1分間隔の場合。 If Timebuff(1) = 0 Then 'If 1分経過したか? Then Gosub Serialset '時刻とセンサー値をシリアル出力する。 End If ' Case 4 : '10分間隔の場合。 If Timebuff(1) = 0 Then 'If 1分経過したか? Then Temp1 = Timebuff(2) And &H0F '分の下位桁を取り出す。 If Temp1 = 0 Then 'If 10分経過したか? Then Gosub Serialset '時刻とセンサー値をシリアル出力する。 End If End If End Select End If End If ' ' * 1時間毎の処理 * ' If Timebuff(3) <> Hourtemp Then 'If 1時間経過したか? Then Hourtemp = Timebuff(3) Gosub Weatherreport '気圧値24時間偏差を求めて天気を予報する。 ' If Usbpowflag <> 0 Then 'If USB電源フラグがON状態か? Then If Serialtime = 5 Then 'If シリアル出力が1時間間隔か? Then Gosub Serialset '時刻とセンサー値をシリアル出力する。 End If End If End If ' ' * 1日毎の処理 * ' If Timebuff(4) <> Daytemp Then 'If 日付が変わったか? Then Daytemp = Timebuff(4) If Eepautoreset <> 0 Then 'If 最高・最低値の0:00自動リセットが有りか? Then Gosub Maxminreset '最高値/最低値を初期化する。 End If End If Time1s = 0 End If ' ' * シリアル出力へ送信とシリアル入力 * ' If Serialcount <> 0 Then 'If シリアル送信が有るか? Then Temp1 = 39 - Serialcount '送信バッファーの位置を計算する。 Printbin Serialbuff(temp1) ; 1 '送信バッファーから1文字をシリアル送信する。 Serialcount = Serialcount - 1 End If ' If Usbpowflag <> 0 Then 'If USB電源フラグがON状態か? Then Gosub Serialin 'シリアル入力処理。 End If Goto Main '================================================================================================== ' ' ************************** ' * スイッチが押された処理 * ' ************************** ' Swon: Select Case Swdata Case &B0000_0001 '[SW1]が押されたか? Then Dateinsflag = 0 #if Scroll_version = 0 'If スクロール無しのバージョンか? Then Select Case Dispsta Case 1 : '[0]表示OFF。 Dispsta = 0 Stop Timer2 'LEDのDMA点灯を停止する。 Set Panel_oe 'RGB LEDパネル [OE]の接続ポートを[H]にする。 Case 0 : '[1]固定表示モード。 Dispsta = 1 Start Timer2 'LEDのDMA点灯を開始する。 Set Tccr2b.wgm22 '高速PWM動作。(BASCOMのStart Timer命令が対応していないため) Brighttemp = 0 '輝度調整を強制実行させる。 End Select Eepdispsta = Dispsta 'EEPROMに保存する。 #else 'スクロール有りのバージョンの場合。 Select Case Dispsta Case 2 : '[0]表示OFF。 Dispsta = 0 Stop Timer2 'LEDのDMA点灯を停止する。 Set Panel_oe 'RGB LEDパネル [OE]の接続ポートを[H]にする。 Case 0 : '[1]固定表示モード。 Dispsta = 1 Start Timer2 'LEDのDMA点灯を開始する。 Set Tccr2b.wgm22 '高速PWM動作。(BASCOMのStart Timer命令が対応していないため) Brighttemp = 0 '輝度調整を強制実行させる。 Case 1 : '[2]スクロールモード。 Dispsta = 2 Timecount = 0 'スクロール時間用カウンターを初期化する。 Scrolitem = 0 'スクロール表示中の表示項目を初期化する。 Scrollcount = 39 'スクロールバッファーへ新規文字を書き込ませる。 Scrollvertical = 0 Timedispflag = 0 End Select Eepdispsta = Dispsta 'EEPROMに保存する。 #endif ' Case &B0000_0010 '[SW2]が押されたか? Then Dateinsflag = 0 Select Case Dispsta Case 1 : '固定表示モードの場合。 Dispmode = Dispmode + 1 If Dispmode > 1 Then 'If 表示モードの上限か? Then Dispmode = 0 End If Eepdispmode = Dispmode 'EEPROMに保存する。 ' Case 2 : 'スクロールモードの場合。 If Scrolltime <> 1 Then 'If スクロール速度が上限ではないか? Then Scrolltime = Scrolltime - 1 'スクロール速度を早くする。 Eepscrolltime = Scrolltime 'EEPROMに保存する。 Timecount = 0 'スクロール時間用カウンターを初期化する。 End If End Select ' Case &B0000_0100 '[SW3]が押されたか? Then Dateinsflag = 0 Select Case Dispsta Case 1 : '固定表示モードの場合。 Select Case Dispmode Case 0 : '表示モード[0]時刻+センサーの場合。 Mode0item = Mode0item + 1 If Mode0item > 5 Then 'If 表示アイテムの上限か? Then Mode0item = 0 End If Eepmode0item = Mode0item 'EEPROMに保存する。 Case 1 : '表示モード[1]上下固定の場合。 Mode1item = Mode1item + 1 If Mode1item > 5 Then 'If 表示アイテムの上限か? Then Mode1item = 0 End If Eepmode1item = Mode1item 'EEPROMに保存する。 End Select ' Case 2 : 'スクロールモードの場合。 If Scrolltime < 20 Then 'If スクロール速度が下限ではないか? Then Scrolltime = Scrolltime + 1 'スクロール速度を遅くする。 Eepscrolltime = Scrolltime 'EEPROMに保存する。 Timecount = 0 'スクロール時間用カウンターを初期化する。 End If End Select ' Case &B0000_0110 '[SW2]と[SW3]が同時に押されたか? Then If Dispsta <> 0 Then 'If LEDを点灯しているか? Then Toggle Hourmode.0 '12/24時間制表示選択を変更。 Eephourmode = Hourmode 'EEPROMに保存する。 End If ' End Select Gosub Infodisp 'LEDに情報を表示する。 Return ' ' **************************** ' * スイッチが長押された処理 * ' **************************** ' Swonlong: Select Case Swdata Case &B0000_0100 '[SW3]が長押されたか? Then If Dispsta = 1 Then 'If 固定表示モードか? Then If Dispmode = 0 Then 'If 固定表示モード[0]時刻+センサーか? Then Mode0item = &H10 '固定表示モード0を[&H10]自動にする。 Eepmode0item = Mode0item 'EEPROMに保存する。 Ledx = 1 Ledy = 2 Ledcolor = 3 Ledback = 4 Tempstr = "Auto " Gosub Leddisp Ledlen = 2 Gosub Ledfill '8ドットの塗りつぶし。 Gosub Swoffchk 'スイッチが離されるのを待つ。 ' Else '固定表示モード[1]上下固定の場合。 If Mode1item = 0 Or Mode1item > 3 Then 'If 最高値/最低値の表示中か? Then Gosub Maxminreset '最高値/最低値を初期化する。 Ledx = 1 Ledy = 2 Ledcolor = 1 Ledback = 4 Tempstr = "Reset" Gosub Leddisp Ledlen = 2 Gosub Ledfill '8ドットの塗りつぶし。 Gosub Swoffchk 'スイッチが離されるのを待つ。 End If End If End If ' Case &B0000_0101 '[SW1]と[SW3]が同時に長押されたか(時刻設定)? Then If Dispsta <> 0 Then 'If LEDを点灯しているか? Then Gosub Timeset '時刻設定処理。 End If ' Case &B0000_0011 '[SW1]と[SW2]が同時に長押されたか(機能設定)? Then If Dispsta <> 0 Then 'If LEDを点灯しているか? Then Gosub Funcset '機能設定処理。 End If ' End Select Gosub Infodisp 'LEDに情報を表示する。 Return ' ' *********************** ' * LEDに情報を表示する * ' *********************** ' Infodisp: If Dispsta <> 1 Then Return 'If [1]固定表示モード以外か? Then ' Timedispflag = 0 Select Case Dispmode Case 0 : '表示モード[0]時刻+センサーの場合。 Ledx = 1 Ledy = 1 If Dateinsflag = 0 Then 'If 日付の差し込み表示は無いか? Then Gosub Timedisp '上段に[時/分]を表示する。 Timedispflag = 1 Else Gosub Datedisp '上段に[月/日]を表示する。 End If ' Temp1 = Mode0item And &H0F Select Case Temp1 Case 0 : '下段に[温度]を表示する。 Ledx = 1 Ledy = 2 Gosub Tempdisp Case 1 : '下段に[湿度]を表示する。 Ledx = 1 Ledy = 2 Gosub Humidisp Case 2 : '下段に[気圧値]を表示する。 Ledx = 1 Ledy = 2 Gosub Barodisp Case 3 : '下段に[24時間の偏差値]を表示する。 Ledx = 1 Ledy = 2 Gosub Divdisp Case 4 : '下段に[天気予報]を表示する。 Ledx = 1 Ledy = 2 Gosub Weatherdisp Case 5 : '下段に[秒]を表示する。 Ledx = 1 Ledy = 2 Ledback = 0 If Hourmode = 0 Then 'If 12時間制表示か? Then Ledlen = 20 Else Ledlen = 18 End If Gosub Ledfill '8ドットの塗りつぶし。 Ledcolor = 7 Tempstr = Hex(Timebuff(1)) Gosub Leddisp '文字列の描画。 If Hourmode = 1 Then 'If 24時間制表示か? Then Ledlen = 2 Gosub Ledfill '8ドットの塗りつぶし。 End If End Select ' Case 1 : '表示モード[1]上下固定の場合。 Select Case Mode1item Case 0 : '上段に[月/日]、下段に[時刻]を表示する。 Ledx = 1 Ledy = 1 Gosub Datedisp Ledx = 1 Ledy = 2 Gosub Timedisp Timedispflag = 2 Case 1 : '上段に[温度]、下段に[湿度]を表示する。 Ledx = 1 Ledy = 1 Gosub Tempdisp Ledx = 1 Ledy = 2 Gosub Humidisp Case 2 : '上段に[24時間の偏差値]、下段に[気圧]を表示する。 Ledx = 1 Ledy = 1 Gosub Divdisp Ledx = 1 Ledy = 2 Gosub Barodisp Case 3 : '[温度]の最高値と最低値を表示する。 Ledx = 1 Ledy = 1 Tempi1 = Tempmax Gosub Tempdisp1 Ledx = 1 Ledy = 2 Tempi1 = Tempmin Gosub Tempdisp1 Case 4 : '[湿度]の最高値と最低値を表示する。 Ledx = 1 Ledy = 1 Tempstr = Str(humimax) '数値変数を文字変数に変換する。 Gosub Humidisp1 Ledx = 1 Ledy = 2 Tempstr = Str(humimin) '数値変数を文字変数に変換する。 Gosub Humidisp1 Case 5 : '[気圧]の最高値と最低値を表示する。 Ledx = 1 Ledy = 1 Tempstr = Str(baromax) '数値変数を文字変数に変換する。 Gosub Barodisp1 Ledx = 1 Ledy = 2 Tempstr = Str(baromin) '数値変数を文字変数に変換する。 Gosub Barodisp1 End Select End Select Return #if Scroll_version = 0 'If スクロール無しのバージョンか? Then ' Scroll: Return ' Serialin: Return #else 'スクロール有りのバージョンの場合。 #endif ' ' ----------------------------- (10mS毎に呼び出す) ' * スイッチ入力 サブルーチン * (Swflag = 1 : スイッチ入力有り , 2 : リピート) ' ----------------------------- (Swdata = スイッチ データ) ' Swin: Select Case Swcount Case 0 : 'スイッチ入力チェック開始。 Gosub Swport 'スイッチ接続ポートからデータを入力。 If Swdata <> 0 Then 'If スイッチ入力が有るか? Then Swtemp = Swdata 'スイッチ データを一時保存。 Swcount = 1 End If ' Case Is < 4 : 'チャタリング除去期間。 Swcount = Swcount + 1 ' Case 4 : 'スイッチ入力を再確認。 Gosub Swport 'スイッチ接続ポートからデータを入力。 If Swdata = Swtemp Then 'If スイッチ入力が確定か? Then Swflag = 1 Swcount = Swcount + 1 Else 'エラーの場合。 Swcount = 0 End If ' Case Else : 'スイッチが離されるのを待つ。 Gosub Swport 'スイッチ接続ポートからデータを入力。 If Swdata <> Swtemp Then 'If スイッチの状態が変わったか? Then Swcount = 0 Else 'スイッチが押し続けられている場合。 If Swcount < 104 Then 'If リピート期間待ち(1秒未満)か? Then Swcount = Swcount + 1 Else '1秒経過した場合。 Swflag = 2 Swcount = 95 'リピートを開始。 End If End If End Select Return ' ' -------------------------------------------------- ' * スイッチ接続ポートからのデータ入力サブルーチン * (Swdata = スイッチ データ) ' -------------------------------------------------- ' Swport: Swdata.0 = Not Sw_1 Swdata.1 = Not Sw_2 Swdata.2 = Not Sw_3 Return ' ' ------------------------------------------ ' * スイッチが離されるのを待つサブルーチン * ' ------------------------------------------ ' Swoffchk: Do Gosub Swport 'スイッチ接続ポートからのデータ入力。 Loop Until Swdata = 0 'If 全てのスイッチが離されたか? Then Waitms 30 'チャタリング・タイマー。 Return ' ' -------------------------------- ' * 温度値を表示するサブルーチン * ' -------------------------------- ' Tempdisp: Tempi1 = Temperature Tempdisp1: Tempstr = Str(tempi1) '数値変数を文字変数に変換する。 Ledcolor = 5 Ledback = 0 If Tempi1 < 0 Then 'If マイナス値か? Then If Tempi1 < -99 Then 'If -10.0℃以下か? Then Tempstr = " " + Left(tempstr , 3 ) '[_-XX]表示。 Else '-9.9℃〜-0.1℃。 Tempstr = Format(tempstr , " 0.0") Tempstr = Mid(tempstr , 2 , 4 ) End If Else Tempstr = Format(tempstr , " 0.0") '0.0℃以上。 End If Gosub Leddisp '文字列の描画。 Ledlen = 1 Gosub Ledfill '8ドットの塗りつぶし。 Ledchr = &H80 '[℃]の表示。 Gosub Ledwr6 '6x8ドット文字の描画。 Ledx = Ledx + 6 Ledlen = 1 Gosub Ledfill '8ドットの塗りつぶし。 Return ' ' -------------------------------- ' * 湿度値を表示するサブルーチン * ' -------------------------------- ' Humidisp: Tempstr = Str(humidity) '数値変数を文字変数に変換する。 Humidisp1: Tempstr = Format(tempstr , " 0.0") Ledcolor = 6 Ledback = 0 Gosub Leddisp '文字列の描画。 Ledlen = 1 Gosub Ledfill '8ドットの塗りつぶし。 Ledchr = &H25 '[%]の表示。 Gosub Ledwr6 '6x8ドット文字の描画。 Ledx = Ledx + 6 Ledlen = 1 Gosub Ledfill '8ドットの塗りつぶし。 Return ' ' -------------------------------- ' * 気圧値を表示するサブルーチン * ' -------------------------------- ' Barodisp: Tempstr = Str(baropress) '数値変数を文字変数に変換する。 Barodisp1: Tempstr = Format(tempstr , " 0") Tempstr = Left(tempstr , 4) Ledcolor = 2 Ledback = 0 Gosub Leddisp '文字列の描画。 Ledlen = 1 Gosub Ledfill '8ドットの塗りつぶし。 Ledchr = &H81 '[hp]の表示。 Gosub Ledwr6 '6x8ドット文字の描画。 Ledx = Ledx + 6 Ledlen = 1 Gosub Ledfill '8ドットの塗りつぶし。 Return ' ' -------------------------------------- ' * 気圧の偏差値を表示するサブルーチン * ' -------------------------------------- ' Divdisp: Tempstr = Str(deviation) '数値を文字列に変換する。 Tempstr = Format(tempstr , "+ 0.0") Tempstr = Mid(tempstr , 2 , 5) Ledcolor = 2 Ledback = 0 Gosub Leddisp '文字列の描画。 Ledlen = 2 Gosub Ledfill '8ドットの塗りつぶし。 Return ' ' --------------------------------- ' * [月/日]を表示するサブルーチン * ' --------------------------------- ' Datedisp: Ledback = 0 Temp1 = Timebuff(4) '[日]データを変換する。 Gosub Zerosup '上位桁をゼロサプレスする。 Tempstr = Tempstr2 Temp1 = Timebuff(5) '[月]データを変換する。 Gosub Zerosup '上位桁をゼロサプレスする。 Tempstr = Tempstr2 + "/" + Tempstr Ledcolor = 3 Gosub Leddisp '文字列の描画。 ' Ledlen = 2 Gosub Ledfill '8ドットの塗りつぶし。 Return ' ' --------------------------------- ' * [時/分]を表示するサブルーチン * ' --------------------------------- ' Timedisp: Ledback = 0 If Hourmode = 0 Then 'If 12時間制表示か? Then Temp1 = Makedec(timebuff(3)) 'BCDを10進数の数値に変換。 If Temp1 < 12 Then 'If [AM]か? Then Ledcolor = 6 '水色を指定。 Ledchr = &H82 '[AM]を表示する。 Else Ledcolor = 3 '黄色を指定。 Ledchr = &H83 '[PM]を表示する。 End If Gosub Ledwr6 '6x8ドット文字 描画。 Ledx = Ledx + 2 If Temp1 = 0 Then Temp1 = 24 '24時間制時刻を12時間制に変換する。 If Temp1 > 12 Then Temp1 = Temp1 - 12 Temp1 = Makebcd(temp1) '10進数の数値をBCD値に変換。 Gosub Zerosup '上位桁をゼロサプレスして表示。 Tempstr = Tempstr2 Else Temp1 = Timebuff(3) '[時]データを変換する。 Gosub Zerosup '上位桁をゼロサプレスする。 End If Tempstr = Tempstr2 + ":" + Hex(Timebuff(2)) Ledcolor = 7 Gosub Leddisp '文字列の描画。 If Hourmode = 1 Then 'If 24時間制表示か? Then Ledlen = 2 Gosub Ledfill '8ドットの塗りつぶし。 End If Return ' ' ---------------------------------------- ' * 上位桁をゼロサプレスするサブルーチン * (Temp1 = 入力BCDデータ) ' ---------------------------------------- (Tempstr2 = 出力文字列) ' Zerosup: If Temp1 < 10 Then 'If 上位桁が0か? Then Tempstr2 = " " + Str(temp1) Else Tempstr2 = Hex(temp1) End If Return ' ' -------------------------------- ' * コロンを消灯するサブルーチン * ' -------------------------------- ' Colonoff: If Hourmode = 0 Then 'If 12時間制表示か? Then Ledx = 15 Else Ledx = 13 End If Ledcolor = 7 Ledback = 0 Ledchr = &H20 'コロンを消す。 Gosub Ledwr6 '6x8ドット文字 描画。 Return ' ' ---------------------------------- ' * 天気予報を表示するサブルーチン * ' ---------------------------------- ' Weatherdisp: Ledback = 0 Ledlen = 10 Gosub Ledfill '8ドットの塗りつぶし。 Weatherdisp1: Select Case Weather Case 5 : '[晴れ] Ledcolor = 1 Ledback = 6 Ledchr = &H84 Gosub Ledwr6 '6x8ドット文字の描画。 Ledx = Ledx + 6 Ledchr = &H85 Gosub Ledwr6 '6x8ドット文字の描画。 Case 4 : '[晴れ+曇り] Ledcolor = 1 Ledback = 6 Ledchr = &H86 Gosub Ledwr6 '6x8ドット文字の描画。 Ledx = Ledx + 6 Ledcolor = 7 Ledchr = &H87 Gosub Ledwr6 '6x8ドット文字の描画。 Case 3 : '[曇り] Ledcolor = 7 Ledback = 4 Ledchr = &H88 Gosub Ledwr6 '6x8ドット文字の描画。 Ledx = Ledx + 6 Ledchr = &H89 Gosub Ledwr6 '6x8ドット文字の描画。 Case 2 : '[雨] Ledcolor = 6 Ledback = 4 Ledchr = &H8A Gosub Ledwr6 '6x8ドット文字の描画。 Ledx = Ledx + 6 Ledchr = &H8B Gosub Ledwr6 '6x8ドット文字の描画。 Case 0 : '予報が出ていない場合。 Ledcolor = 4 Ledback = 0 Ledchr = &H2D Gosub Ledwr6 '6x8ドット文字の描画。 Ledx = Ledx + 6 Ledchr = &H2D Gosub Ledwr6 '6x8ドット文字の描画。 Case Else '[予報が出るまでの待ち時間表示] Ledcolor = 4 Ledback = 0 Temp1 = Weather - 100 Temp1 = Temp1 * 2 Ledchr = Lookup(temp1 , Waitbar) '横線キャラクター・データを読み出す。 Gosub Ledwr6 '6x8ドット文字の描画。 Ledx = Ledx + 6 Temp1 = Temp1 + 1 Ledchr = Lookup(temp1 , Waitbar) '横線キャラクター・データを読み出す。 Gosub Ledwr6 End Select Ledx = Ledx + 6 Ledlen = 1 Gosub Ledfill '8ドットの塗りつぶし。 Ledback = 0 Ledlen = 9 Gosub Ledfill '8ドットの塗りつぶし。 Return ' ' -------------------------------------------------------------------- ' * 時刻とセンサー値をシリアル送信バッファーにセットするサブルーチン * ' -------------------------------------------------------------------- ' Serialset: Temp1 = Timebuff(6) And &HF0 '[年]の上位を書き込む。 Shift Temp1 , Right , 4 Serialbuff(3) = Temp1 Or &H30 Temp1 = Timebuff(6) And &H0F '[年]の下位を書き込む。 Serialbuff(4) = Temp1 Or &H30 ' Temp1 = Timebuff(5) And &HF0 '[月]の上位を書き込む。 Shift Temp1 , Right , 4 Serialbuff(6) = Temp1 Or &H30 Temp1 = Timebuff(5) And &H0F '[月]の下位を書き込む。 Serialbuff(7) = Temp1 Or &H30 ' Temp1 = Timebuff(4) And &HF0 '[日]の上位を書き込む。 Shift Temp1 , Right , 4 Serialbuff(9) = Temp1 Or &H30 Temp1 = Timebuff(4) And &H0F '[日]の下位を書き込む。 Serialbuff(10) = Temp1 Or &H30 ' Temp1 = Timebuff(3) And &HF0 '[時]の上位を書き込む。 Shift Temp1 , Right , 4 Serialbuff(12) = Temp1 Or &H30 Temp1 = Timebuff(3) And &H0F '[時]の下位を書き込む。 Serialbuff(13) = Temp1 Or &H30 ' Temp1 = Timebuff(2) And &HF0 '[分]の上位を書き込む。 Shift Temp1 , Right , 4 Serialbuff(15) = Temp1 Or &H30 Temp1 = Timebuff(2) And &H0F '[分]の下位を書き込む。 Serialbuff(16) = Temp1 Or &H30 ' Temp1 = Timebuff(1) And &HF0 '[秒]の上位を書き込む。 Shift Temp1 , Right , 4 Serialbuff(18) = Temp1 Or &H30 Temp1 = Timebuff(1) And &H0F '[秒]の下位を書き込む。 Serialbuff(19) = Temp1 Or &H30 ' Tempstr = Str(temperature) '[温度]を書き込む。 If Temperature < 0 Then 'If マイナス値か? Then If Temperature < -99 Then 'If -10.0℃以下か? Then Tempstr = " " + Left(tempstr , 3 ) Else '-9.9℃〜-0.1℃。 Tempstr = Format(tempstr , " 0.0") Tempstr = Mid(tempstr , 2 , 4 ) End If Else Tempstr = Format(tempstr , " 0.0") '0.0℃以上。 End If Tempstr2 = Mid(tempstr , 1 , 1) Serialbuff(21) = Asc(tempstr2) Tempstr2 = Mid(tempstr , 2 , 1) Serialbuff(22) = Asc(tempstr2) Tempstr2 = Mid(tempstr , 3 , 1) Serialbuff(23) = Asc(tempstr2) Tempstr2 = Mid(tempstr , 4 , 1) Serialbuff(24) = Asc(tempstr2) ' Tempstr = Str(humidity) '[湿度]書き込む。 Tempstr = Format(tempstr , " 0.0") Tempstr2 = Mid(tempstr , 1 , 1) Serialbuff(26) = Asc(tempstr2) Tempstr2 = Mid(tempstr , 2 , 1) Serialbuff(27) = Asc(tempstr2) Tempstr2 = Mid(tempstr , 3 , 1) Serialbuff(28) = Asc(tempstr2) Tempstr2 = Mid(tempstr , 4 , 1) Serialbuff(29) = Asc(tempstr2) ' Tempstr = Str(baropress) '[気圧]書き込む。 Tempstr = Format(tempstr , " 0.0") Tempstr2 = Mid(tempstr , 1 , 1) Serialbuff(31) = Asc(tempstr2) Tempstr2 = Mid(tempstr , 2 , 1) Serialbuff(32) = Asc(tempstr2) Tempstr2 = Mid(tempstr , 3 , 1) Serialbuff(33) = Asc(tempstr2) Tempstr2 = Mid(tempstr , 4 , 1) Serialbuff(34) = Asc(tempstr2) Tempstr2 = Mid(tempstr , 5 , 1) Serialbuff(35) = Asc(tempstr2) Tempstr2 = Mid(tempstr , 6 , 1) Serialbuff(36) = Asc(tempstr2) ' Serialcount = 38 Return '-------------------------------------------------------------------------------------------------- ' ' ******************************************* ' * [DS3231]から日時を読み出すサブルーチン * ' ******************************************* ' Ds3231read: I2cbuff(1) = &H00 'レジスター[00h] Seconds のアドレスを指定する。 I2creceive &HD0 , I2cbuff(1) , 1 , 7 'I2Cバスで、1バイトのコマンドを送信し、7バイトのデータを受信する。 Timebuff(1) = I2cbuff(1) '[秒]データを保存する。 Timebuff(2) = I2cbuff(2) '[分]データを保存する。 Timebuff(3) = I2cbuff(3) '[時]データを保存する。 Timebuff(7) = I2cbuff(4) '[曜日]データを保存する。 Timebuff(4) = I2cbuff(5) '[日]データを保存する。 Timebuff(5) = I2cbuff(6) And &H1F '[月]データを保存する。 Timebuff(6) = I2cbuff(7) '[年]データを保存する。 Return ' ' ************************************ ' * [DS3231]を初期化するサブルーチン * ' ************************************ ' Ds3231init: Restore Ds3231initdata '[DS3231]の初期設定データ・テーブル。 For Temp1 = 1 To 18 '初期設定データの18バイトをバッファーへ転送する。 Read I2cbuff(temp1) Next Temp1 ' I2csend &HD0 , I2cbuff(1) , 18 'I2Cバスで、18バイトのデータを送信する。 Return '-------------------------------------------------------------------------------------------------- ' **************************************************** ' * BME280 温度・湿度・気圧センサー 制御サブルーチン * (オリジナルは「Mrshilov」氏) ' **************************************************** ' ' * BME280用の変数を宣言 * ' Dim Dig_t1 As Word , Dig_t2 As Integer , Dig_t3 As Integer Dim Dig_p1 As Word , Dig_p2 As Integer , Dig_p3 As Integer Dim Dig_p4 As Integer , Dig_p5 As Integer , Dig_p6 As Integer Dim Dig_p7 As Integer , Dig_p8 As Integer , Dig_p9 As Integer Dim Dig_h1 As Word , Dig_h2 As Integer , Dig_h3 As Word Dim Dig_h4 As Integer , Dig_h5 As Integer , Dig_h6 As Integer Dim Adc_t As Dword , Adc_p As Dword , Adc_h As Dword Dim Var1 As Long , Var2 As Long , Var3 As Long , Var4 As Word Dim T_fine As Long ' ' ******************** ' * BME280の初期設定 * ' ******************** ' Bme280init: I2cbuff(1) = &HF2 : I2cbuff(2) = &H05 '湿度のオーバー・サンプリング = ×16 I2cbuff(3) = &HF4 : I2cbuff(4) = &HB7 '温度のオーバー・サンプリング = ×16 , 圧力のオーバー・サンプリング = ×16 , 通常モード I2cbuff(5) = &HF5 : I2cbuff(6) = &HB0 '通常モードの休止期間 = 1s , IIRフィルター = ×16 I2csend Bme280_adr , I2cbuff(1) , 6 'I2Cバスで、6バイトのコマンドを送信する。 ' I2cbuff(1) = &H88 '補償の係数を読み出す。 I2creceive Bme280_adr , I2cbuff(1) , 1 , 26 'I2Cバスで、1バイトのコマンドを送信し、26バイトのデータを受信する。 ' Dig_t1 = Makeint(i2cbuff(1) , I2cbuff(2)) '温度の補償係数を変数にまとめる。 Dig_t2 = Makeint(i2cbuff(3) , I2cbuff(4)) Dig_t3 = Makeint(i2cbuff(5) , I2cbuff(6)) Dig_p1 = Makeint(i2cbuff(7) , I2cbuff(8)) '圧力の補償係数を変数にまとめる。 Dig_p2 = Makeint(i2cbuff(9) , I2cbuff(10)) Dig_p3 = Makeint(i2cbuff(11) , I2cbuff(12)) Dig_p4 = Makeint(i2cbuff(13) , I2cbuff(14)) Dig_p5 = Makeint(i2cbuff(15) , I2cbuff(16)) Dig_p6 = Makeint(i2cbuff(17) , I2cbuff(18)) Dig_p7 = Makeint(i2cbuff(19) , I2cbuff(20)) Dig_p8 = Makeint(i2cbuff(21) , I2cbuff(22)) Dig_p9 = Makeint(i2cbuff(23) , I2cbuff(24)) Dig_h1 = I2cbuff(26) '湿度の補償係数を変数にまとめる。 ' I2cbuff(1) = &HE1 I2creceive Bme280_adr , I2cbuff(1) , 1 , 7 'I2Cバスで、1バイトのコマンドを送信し、7バイトのデータを受信する。 ' Dig_h2 = Makeint(i2cbuff(1) , I2cbuff(2)) '湿度の補償係数を変数にまとめる。 Dig_h3 = I2cbuff(3) Dig_h4 = I2cbuff(4) : Shift Dig_h4 , Left , 4 Dig_h5 = I2cbuff(5) And &H0F : Dig_h4 = Dig_h4 + Dig_h5 Dig_h5 = I2cbuff(5) And &HF0 : Shift Dig_h5 , Right , 4 Dig_h6 = I2cbuff(6) : Shift Dig_h6 , Left , 4 : Dig_h5 = Dig_h5 + Dig_h6 Dig_h6 = I2cbuff(7) Return ' ' ********************************************** ' * BME280から測定データを読み出して補償を行う * ' ********************************************** ' Bme280read: I2cbuff(1) = &HF7 '測定したA/Dデータを読み出す。 I2creceive Bme280_adr , I2cbuff(1) , 1 , 8 'I2Cバスで、1バイトのコマンドを送信し、8バイトのデータを受信する。 ' Var4 = Makeint(i2cbuff(2) , I2cbuff(1)) '3バイトの圧力データを32ビットのDword変数に変換する。 Adc_p = Var4 : Shift Adc_p , Left , 4 Shift I2cbuff(3) , Right , 4 : Adc_p = Adc_p + I2cbuff(3) ' Var4 = Makeint(i2cbuff(5) , I2cbuff(4)) '3バイトの温度データを32ビットのDword変数に変換する。 Adc_t = Var4 : Shift Adc_t , Left , 4 Shift I2cbuff(6) , Right , 4 : Adc_t = Adc_t + I2cbuff(6) ' Var4 = Makeint(i2cbuff(8) , I2cbuff(7)) '2バイトの湿度データを32ビットのDword変数に変換する。 Adc_h = Var4 ' ' -------------------- ' * 温度の補償を行う * ' -------------------- ' ' var1 = ((((adc_T>>3) - ((BME280_S32_t)dig_T1<<1))) * ((BME280_S32_t)dig_T2)) >> 11; ' Shift Adc_t , Right , 3 : Var1 = Adc_t - Dig_t1 : Var1 = Var1 - Dig_t1 Var1 = Var1 * Dig_t2 : Shift Var1 , Right , 11 , Signed ' ' var2 = (((((adc_T>>4) - ((BME280_S32_t)dig_T1)) * ((adc_T>>4) - ((BME280_S32_t)dig_T1))) >> 12) * ((bme280_s32_t)dig_t3)) >> 14; ' Shift Adc_t , Right , 1 : Var2 = Adc_t - Dig_t1 Var2 = Var2 * Var2 : Shift Var2 , Right , 12 , Signed Var2 = Var2 * Dig_t3 : Shift Var2 , Right , 14 , Signed ' ' t_fine = var1 + var2; T = (t_fine * 5 + 128) >> 8; ' T_fine = Var1 + Var2 : Var2 = T_fine * 5 Var2 = Var2 + 128 : Shift Var2 , Right , 8 , Signed T = Var2 '[T] = 温度値。 [XXXX] -> [XX.XX]℃ ' ' -------------------- ' * 圧力の補償を行う * ' -------------------- ' ' var1 = (((BME280_S32_t)t_fine)>>1) - (BME280_S32_t)64000; ' Var1 = T_fine : Shift Var1 , Right , 1 , Signed Var1 = Var1 - 64000 ' ' var2 = (((var1>>2) * (var1>>2)) >> 11 ) * ((BME280_S32_t)dig_P6); ' Var2 = Var1 : Shift Var2 , Right , 2 , Signed Var2 = Var2 * Var2 : Shift Var2 , Right , 11 , Signed Var2 = Var2 * Dig_p6 ' ' var2 = var2 + ((var1*((BME280_S32_t)dig_P5))<<1); ' Var3 = Var1 * Dig_p5 : Shift Var3 , Left , 1 Var2 = Var2 + Var3 ' ' var2 = (var2>>2)+(((BME280_S32_t)dig_P4)<<16); ' Var3 = Dig_p4 : Shift Var3 , Left , 16 Shift Var2 , Right , 2 , Signed Var2 = Var2 + Var3 ' ' var1 = (((dig_P3 * (((var1>>2) * (var1>>2)) >> 13 )) >> 3) + ((((BME280_S32_t)dig_P2) * var1)>>1))>>18; ' Var3 = Dig_p2 * Var1 : Shift Var3 , Right , 1 , Signed Shift Var1 , Right , 2 , Signed Var1 = Var1 * Var1 : Shift Var1 , Right , 13 Var1 = Dig_p3 * Var1 : Shift Var1 , Right , 3 , Signed Var1 = Var1 + Var3 : Shift Var1 , Right , 18 , Signed ' ' var1 =((((32768+var1))*((BME280_S32_t)dig_P1))>>15); ' Var1 = 32768 + Var1 Var1 = Var1 * Dig_p1 : Shift Var1 , Right , 15 , Signed ' 'if (var1 == 0) ' If Var1 = 0 Then P = 0 'ゼロ除算による例外を避ける。 Else ' ' P = (((BME280_U32_t)(((BME280_S32_t)1048576)-adc_P) - (var2>>12))) * 3125; ' P = 1048576 - Adc_p : Shift Var2 , Right , 12 , Signed P = P - Var2 : P = P * 3125 ' ' if (P < 0x80000000) ' If P < &H80000000 Then ' ' P = (P << 1) / ((BME280_U32_t)var1); ' Shift P , Left , 1 : P = P / Var1 Else ' ' P = (P / (BME280_U32_t)var1) * 2; ' P = P / Var1 : P = P + P End If ' ' var1 = (((BME280_S32_t)dig_P9) * ((BME280_S32_t)(((p>>3) * (p>>3))>>13)))>>12; ' Var1 = P : Shift Var1 , Right , 3 Var1 = Var1 * Var1 : Shift Var1 , Right , 13 Var1 = Dig_p9 * Var1 : Shift Var1 , Right , 12 , Signed ' ' var2 = (((BME280_S32_t)(p>>2)) * ((BME280_S32_t)dig_P8))>>13; ' Var2 = P : Shift Var2 , Right , 2 Var2 = Var2 * Dig_p8 : Shift Var2 , Right , 13 , Signed ' ' P = (BME280_U32_t)((BME280_S32_t)P + ((var1 + var2 + dig_P7) >> 4)); ' Var1 = Var1 + Var2 : Var1 = Var1 + Dig_p7 Shift Var1 , Right , 4 , Signed P = P + Var1 '[P] = 気圧値。 [XXXXXX] -> [XXXX.XX]hPa End If ' ' -------------------- ' * 湿度の補償を行う * ' -------------------- ' ' v_x1_u32r = (t_fine - ((BME280_S32_t)76800)); ' Var1 = T_fine - 76800 ' ' v_x1_u32r = (((((adc_H << 14) - (((BME280_S32_t)dig_H4) << 20) - (((BME280_S32_t)dig_H5) * v_x1_u32r)) + ' ((BME280_S32_t)16384)) >> 15) * (((((((v_x1_u32r * ((BME280_S32_t)dig_H6)) >> 10) * (((v_x1_u32r * ' ((BME280_S32_t)dig_H3)) >> 11) + ((BME280_S32_t)32768))) >> 10) + ((BME280_S32_t)2097152)) * ' ((BME280_s32_t)dig_H2) + 8192) >> 14)); ' Var2 = Adc_h : Shift Var2 , Left , 14 Var3 = Dig_h4 : Shift Var3 , Left , 20 Var2 = Var2 - Var3 : Var3 = Dig_h5 * Var1 Var2 = Var2 - Var3 : Var2 = Var2 + 16384 Shift Var2 , Right , 15 , Signed Var3 = Var1 * Dig_h6 : Shift Var3 , Right , 10 , Signed T_fine = Var1 * Dig_h3 : Shift T_fine , Right , 11 , Signed T_fine = T_fine + 32768 : Var3 = Var3 * T_fine Shift Var3 , Right , 10 , Signed Var3 = Var3 + 2097152 Var3 = Var3 * dig_h2 : Var3 = Var3 + 8192 Shift Var3 , Right , 14 , Signed Var1 = Var2 * Var3 ' ' v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) * ((BME280_S32_t)dig_H1)) >> 4)); ' Var3 = Var1 : Shift Var3 , Right , 15 , Signed Var3 = Var3 * Var3 : Shift Var3 , Right , 7 , Signed Var3 = Var3 * Dig_h1 : Shift Var3 , Right , 4 , Signed Var1 = Var1 - Var3 ' ' v_x1_u32r = (v_x1_u32r < 0 ? 0 : v_x1_u32r); ' If Var1 < 0 Then Var1 = 0 ' ' v_x1_u32r = (v_x1_u32r > 419430400 ? 419430400 : v_x1_u32r); ' If Var1 > 419430400 Then Var1 = 419430400 ' ' return (BME280_U32_t)(v_x1_u32r>>12); ' Shift Var1 , Right , 12 , Signed Var1 = Var1 * 100 : Shift Var1 , Right , 10 , Signed '小数点以下第2位をまでを整数に桁上げして、1024で割る。 H = Var1 '[H] = 湿度値。 [XXXXX] -> [XXX.XX]% Return '-------------------------------------------------------------------------------------------------- ' ' ****************************************** ' * 気圧値24時間偏差を求めて天気を予報する * ' ****************************************** ' Weatherreport: Tempw1 = Dbuff(dbuffpoi) '24時間前のデータを読み出す。 Dbuff(dbuffpoi) = Baropress '最新の気圧値を格納する。 Dbuffpoi = Dbuffpoi + 1 '24時間のデータバッファーポインターを更新する。 If Dbuffpoi > 24 Then 'If ポインターが上限か? Then Dbuffpoi = 1 End If ' If Tempw1 <> 0 Then '通電後24時間以上経過しているか? Then Deviation = Baropress - Tempw1 '24時間の差分を求める。 ' Select Case Deviation Case Is > 50 : '[晴れ] Temp1 = 5 Case Is > 20 : '[晴れ+雲] Temp1 = 4 Case Is < -50 : '[雨] Temp1 = 2 Case Is < -20 : '[曇り] Temp1 = 3 Case Else : '[天候変化無し] If Weather > 10 Then 'If 予報が始まっても気圧差が少ないか? Then Temp1 = 4 '仮に[晴れ+雲]とする。 Else '前の予報を継続する。 Temp1 = Weather End If End Select Weather = Temp1 '天気予報値。 ' Else '通電後24時間以上経過していない場合。 If Weather > 10 Then 'If 予報開始の待機中か? Then Weather = Weather - 1 '予報が始まるまでの残り時間を減算する。 End If End If ' Tbuff(tbuffpoi) = Baropress '最新の気圧値を格納する。 Tbuffpoi = Tbuffpoi + 1 '48時間のデータバッファーポインターを更新する。 If Tbuffpoi > 48 Then 'If ポインターが上限か? Then Tbuffpoi = 1 End If Return ' ' ***************************** ' * 最高値/最低値を初期化する * ' ***************************** ' Maxminreset: Tempmax = Temperature '温度の最高値を初期化する。 Tempmin = Temperature '温度の最低値を初期化する。 Humimax = Humidity '湿度の最高値を初期化する。 Humimin = Humidity '湿度の最低値を初期化する。 Baromax = Baropress '気圧の最高値を初期化する。 Baromin = Baropress '気圧の最低値を初期化する。 Return '================================================================================================== ' ' **************** ' * 時刻設定処理 * ' **************** ' Timeset: Compare2b = 20 '輝度値を固定する。 Gosub Ledclear 'LEDパネル画面を消去する。 ' Ledx = 1 '[年]の設定。 Ledy = 1 Ledcolor = 5 Ledback = 0 Tempstr = "20" Gosub Leddisp '文字列の描画。 Ledback = 4 Tempstr = Hex(Timebuff(6)) Gosub Leddisp '文字列の描画。 Ledx = 1 Ledy = 2 Ledback = 0 Gosub Datedisp '[月/日]を表示する。 Gosub Swoffchk 'スイッチが離されるのを待つ。 ' Temp2 = 99 '設定の上限値。 Temp3 = 0 '設定の下限値。 Ledy = 1 Ledcolor = 5 Ledback = 4 Timeset11: Ledx = 13 Tempstr = Hex(Timebuff(6)) Gosub Leddisp Gosub Setswin '設定用スイッチ入力。 Temp1 = Timebuff(6) Select Case Swdata Case &B0000_0001 'If [SW1]が押されたか? Then Goto Timeset20 Case &B0000_0010 'If [SW2]が押されたか? Then Gosub Setplus 'BCD設定値を加算する。 Case &B0000_0100 'If [SW3]が押されたか? Then Gosub Setminus 'BCD設定値を減算する。 End Select Timebuff(6) = Temp1 Goto Timeset11 ' ' Timeset20: '[月]の設定。 Ledx = 1 '[年]の再表示。 Ledy = 1 Ledcolor = 7 Ledback = 0 Tempstr = "20" + Hex(Timebuff(6)) Gosub Leddisp '文字列の描画。 ' Temp2 = 12 '設定の上限値。 Temp3 = 1 '設定の下限値。 Ledy = 2 Ledcolor = 5 Ledback = 4 Timeset21: Ledx = 1 Temp1 = Timebuff(5) Gosub Zerosup '上位桁をゼロサプレスする。 Tempstr = Tempstr2 Gosub Leddisp Gosub Setswin '設定用スイッチ入力。 Select Case Swdata Case &B0000_0001 'If [SW1]が押されたか? Then Goto Timeset30 Case &B0000_0010 'If [SW2]が押されたか? Then Gosub Setplus 'BCD設定値を加算する。 Case &B0000_0100 'If [SW3]が押されたか? Then Gosub Setminus 'BCD設定値を減算する。 End Select Timebuff(5) = Temp1 Goto Timeset21 ' ' Timeset30: '[日]の設定。 Ledx = 1 Ledy = 2 Ledback = 0 Gosub Datedisp '[月/日]を表示する。 ' Temp2 = 31 '設定の上限値。 Temp3 = 1 '設定の下限値。 Ledy = 2 Ledcolor = 5 Ledback = 4 Timeset31: Ledx = 19 Temp1 = Timebuff(4) Gosub Zerosup '上位桁をゼロサプレスする。 Tempstr = Tempstr2 Gosub Leddisp Gosub Setswin '設定用スイッチ入力。 Select Case Swdata Case &B0000_0001 'If [SW1]が押されたか? Then Goto Timeset40 Case &B0000_0010 'If [SW2]が押されたか? Then Gosub Setplus 'BCD設定値を加算する。 Case &B0000_0100 'If [SW3]が押されたか? Then Gosub Setminus 'BCD設定値を減算する。 End Select Timebuff(4) = Temp1 Goto Timeset31 ' ' Timeset40: '[時]の設定。 Ledx = 1 Ledy = 1 Ledback = 0 Gosub Datedisp '[月/日]を表示する。 Temp7 = Hourmode Hourmode = 1 '24時間制時刻にする。 Ledx = 1 Ledy = 2 Gosub Timedisp '[時/分]を表示する。 ' Temp2 = 23 '設定の上限値。 Temp3 = 0 '設定の下限値。 Ledy = 2 Ledcolor = 5 Ledback = 4 Timeset41: Ledx = 1 Temp1 = Timebuff(3) Gosub Zerosup '上位桁をゼロサプレスする。 Tempstr = Tempstr2 Gosub Leddisp Gosub Setswin '設定用スイッチ入力。 Select Case Swdata Case &B0000_0001 'If [SW1]が押されたか? Then Goto Timeset50 Case &B0000_0010 'If [SW2]が押されたか? Then Gosub Setplus 'BCD設定値を加算する。 Case &B0000_0100 'If [SW3]が押されたか? Then Gosub Setminus 'BCD設定値を減算する。 End Select Timebuff(3) = Temp1 Goto Timeset41 ' ' Timeset50: '[分]の設定。 Ledx = 1 Ledy = 2 Gosub Timedisp '[時/分]を表示する。 ' Temp2 = 59 '設定の上限値。 Temp3 = 0 '設定の下限値。 Ledy = 2 Ledcolor = 5 Ledback = 4 Timeset51: Ledx = 19 Tempstr = Hex(Timebuff(2)) Gosub Leddisp Gosub Setswin '設定用スイッチ入力。 Temp1 = Timebuff(2) Select Case Swdata Case &B0000_0001 'If [SW1]が押されたか? Then Goto Timeset60 Case &B0000_0010 'If [SW2]が押されたか? Then Gosub Setplus 'BCD設定値を加算する。 Case &B0000_0100 'If [SW3]が押されたか? Then Gosub Setminus 'BCD設定値を減算する。 End Select Timebuff(2) = Temp1 Goto Timeset51 ' ' Timeset60: Hourmode = Temp7 '12/24時間制表示選択を戻す。 Brighttemp = 0 '輝度調整を強制実行させる。 Gosub Ledclear 'LEDパネル画面を消去する。 Timebuff(1) = 0 '[秒]を00にリセット。 ' Timesetwrs: I2cbuff(1) = &H00 'レジスター[00h] Secondsのアドレスを指定する。 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) '[年]データを保存する。 I2csend &HD0 , I2cbuff(1) , 8 'I2Cバスで、8バイトのデータを送信する。 Return ' ' * 設定用スイッチ入力サブルーチン * ' Setswin: If Tifr0.ocf0a = 0 Then Goto Setswin 'If 10mS経過していないか? Then Set Tifr0.ocf0a 'Timer0 比較A一致フラグをリセット。 Gosub Swin 'スイッチ入力。 If Swflag = 0 Then Goto Setswin 'If スイッチが押されていないか? Then Swflag = 0 Return ' ' * BCD設定値を加算するサブルーチン * (Temp1 = 設定値 , Temp2 = 上限値 , Temp3 = 下限値) ' Setplus: Temp1 = Makedec(temp1) 'BCDを10進数の数値に変換。 Temp1 = Temp1 + 1 '設定値を加算する。 If Temp1 > Temp2 Then 'If 上限値を超えたか? Then Temp1 = Temp3 End If Temp1 = Makebcd(temp1) '10進数の数値をBCD値に変換。 Return ' ' * BCD設定値を減算するサブルーチン * (Temp1 = 設定値 , Temp2 = 上限値 , Temp3 = 下限値) ' Setminus: Temp1 = Makedec(temp1) 'BCDを10進数の数値に変換。 If Temp1 = Temp3 Then 'If 下限値か? Then Temp1 = Temp2 Else Temp1 = Temp1 - 1 '設定値を減算する。 End If Temp1 = Makebcd(temp1) '10進数の数値をBCD値に変換。 Return '-------------------------------------------------------------------------------------------------- ' ' **************** ' * 機能設定処理 * ' **************** ' Funcset: Compare2b = 20 '輝度値を固定する。 Gosub Ledclear 'LEDパネル画面を消去する。 ' Ledx = 1 '[コロン表示モード(点滅)]の設定。 Ledy = 1 Ledcolor = 3 Ledback = 0 Tempstr = "Colon" Gosub Leddisp '文字列の描画。 Ledx = 1 Ledy = 2 Tempstr = "blnk" Gosub Leddisp '文字列の描画。 Gosub Swoffchk 'スイッチが離されるのを待つ。 ' Temp2 = 1 '設定の上限値。 Temp3 = 0 '設定の下限値。 Ledcolor = 7 Ledback = 1 Temp1 = Eepcolmode Funcset11: Tempstr = Str(temp1) Ledx = 27 Gosub Leddisp '文字列の描画。 Gosub Setswin '設定用スイッチ入力。 Select Case Swdata Case &B0000_0001 'If [SW1]が押されたか? Then Goto Funcset12 Case &B0000_0010 'If [SW2]が押されたか? Then Gosub Funcplus '設定値を加算する。 Case &B0000_0100 'If [SW3]が押されたか? Then Gosub Funcminus '設定値を減算する。 End Select Goto Funcset11 ' Funcset12: Eepcolmode = Temp1 'EEPROMに格納する。 Colmode = Temp1 ' ' Ledx = 1 '[日付の差し込み表示]の設定。 Ledy = 1 Ledcolor = 3 Ledback = 0 Tempstr = "Date " Gosub Leddisp '文字列の描画。 Ledx = 1 Ledy = 2 Tempstr = "inst" Gosub Leddisp '文字列の描画。 Gosub Swoffchk 'スイッチが離されるのを待つ。 ' Temp2 = 1 '設定の上限値。 Temp3 = 0 '設定の下限値。 Ledcolor = 7 Ledback = 1 Temp1 = Eepdateinsert Funcset21: Tempstr = Str(temp1) Ledx = 27 Gosub Leddisp '文字列の描画。 Gosub Setswin '設定用スイッチ入力。 Select Case Swdata Case &B0000_0001 'If [SW1]が押されたか? Then Goto Funcset22 Case &B0000_0010 'If [SW2]が押されたか? Then Gosub Funcplus '設定値を加算する。 Case &B0000_0100 'If [SW3]が押されたか? Then Gosub Funcminus '設定値を減算する。 End Select Goto Funcset21 ' Funcset22: Eepdateinsert = Temp1 'EEPROMに格納する。 Dateinsert = Temp1 ' ' Ledx = 1 '[日付の差し込み秒]の設定。 Ledy = 1 Ledcolor = 3 Ledback = 0 Tempstr = "Date " Gosub Leddisp '文字列の描画。 Ledx = 1 Ledy = 2 Tempstr = "Isec" Gosub Leddisp '文字列の描画。 Gosub Swoffchk 'スイッチが離されるのを待つ。 ' Temp2 = 8 '設定の上限値。 Temp3 = 4 '設定の下限値。 Ledcolor = 7 Ledback = 1 Temp1 = Eepdateinstime Funcset31: Tempstr = Str(temp1) Ledx = 27 Gosub Leddisp '文字列の描画。 Gosub Setswin '設定用スイッチ入力。 Select Case Swdata Case &B0000_0001 'If [SW1]が押されたか? Then Goto Funcset32 Case &B0000_0010 'If [SW2]が押されたか? Then Gosub Funcplus '設定値を加算する。 Case &B0000_0100 'If [SW3]が押されたか? Then Gosub Funcminus '設定値を減算する。 End Select Goto Funcset31 ' Funcset32: Eepdateinstime = Temp1 'EEPROMに格納する。 Dateinstime = Temp1 ' ' Ledx = 1 '[最高・最低値の0:00自動リセット]の設定。 Ledy = 1 Ledcolor = 3 Ledback = 0 Tempstr = "MaxAT" Gosub Leddisp '文字列の描画。 Ledx = 1 Ledy = 2 Tempstr = "Rest" Gosub Leddisp '文字列の描画。 Gosub Swoffchk 'スイッチが離されるのを待つ。 ' Temp2 = 1 '設定の上限値。 Temp3 = 0 '設定の下限値。 Ledcolor = 7 Ledback = 1 Temp1 = Eepautoreset Funcset41: Tempstr = Str(temp1) Ledx = 27 Gosub Leddisp '文字列の描画。 Gosub Setswin '設定用スイッチ入力。 Select Case Swdata Case &B0000_0001 'If [SW1]が押されたか? Then Goto Funcset42 Case &B0000_0010 'If [SW2]が押されたか? Then Gosub Funcplus '設定値を加算する。 Case &B0000_0100 'If [SW3]が押されたか? Then Gosub Funcminus '設定値を減算する。 End Select Goto Funcset41 ' Funcset42: Eepautoreset = Temp1 'EEPROMに格納する。 ' ' Ledx = 1 '[LEDパネルの輝度上限値]の設定。 Ledy = 1 Ledcolor = 3 Ledback = 0 Tempstr = "Brigh" Gosub Leddisp '文字列の描画。 Ledx = 1 Ledy = 2 Tempstr = "UL " Gosub Leddisp '文字列の描画。 Gosub Swoffchk 'スイッチが離されるのを待つ。 ' Temp2 = 123 '設定の上限値。 Temp3 = 12 '設定の下限値。 Ledcolor = 7 Ledback = 1 Temp1 = Eepbrightmax Funcset51: Tempstr2 = Str(temp1) Tempstr = Format(tempstr2 , " 0") Ledx = 15 Gosub Leddisp '文字列の描画。 Gosub Setswin '設定用スイッチ入力。 Select Case Swdata Case &B0000_0001 'If [SW1]が押されたか? Then Goto Funcset52 Case &B0000_0010 'If [SW2]が押されたか? Then Gosub Funcplus '設定値を加算する。 Case &B0000_0100 'If [SW3]が押されたか? Then Gosub Funcminus '設定値を減算する。 End Select Goto Funcset51 ' Funcset52: Eepbrightmax = Temp1 'EEPROMに格納する。 Brightmax = Temp1 ' ' Ledx = 1 '[シリアル出力の間隔]の設定。 Ledy = 1 Ledcolor = 3 Ledback = 0 Tempstr = "Seria" Gosub Leddisp '文字列の描画。 Ledx = 1 Ledy = 2 Tempstr = "l " Gosub Leddisp '文字列の描画。 Gosub Swoffchk 'スイッチが離されるのを待つ。 ' Temp2 = 5 '設定の上限値。 Temp3 = 0 '設定の下限値。 Ledcolor = 7 Ledback = 1 Temp1 = Eepserialtime Funcset61: Tempstr = Lookupstr(temp1 , Serialtimechr) Ledx = 15 Gosub Leddisp '文字列の描画。 Gosub Setswin '設定用スイッチ入力。 Select Case Swdata Case &B0000_0001 'If [SW1]が押されたか? Then Goto Funcset62 Case &B0000_0010 'If [SW2]が押されたか? Then Gosub Funcplus '設定値を加算する。 Case &B0000_0100 'If [SW3]が押されたか? Then Gosub Funcminus '設定値を減算する。 End Select Goto Funcset61 ' Funcset62: Eepserialtime = Temp1 'EEPROMに格納する。 Serialtime = Temp1 ' ' Ledx = 1 '[時計(RTC)の校正値]の設定。 Ledy = 1 Ledcolor = 3 Ledback = 0 Tempstr = "Calib" Gosub Leddisp '文字列の描画。 Ledx = 1 Ledy = 2 Tempstr = "C " Gosub Leddisp '文字列の描画。 Gosub Swoffchk 'スイッチが離されるのを待つ。 ' Ledcolor = 7 Ledback = 1 Temp1 = Eepagingoffset 'EEPROM [DS3231] Aging Offset値。 Funcset71: If Temp1.7 = 0 Then 'If [+]の値か? Then Tempstr2 = Str(temp1) Tempstr = "+" + Format(tempstr2 , " ") Else '[-]の場合。 Temp2 = Not Temp1 Temp2 = Temp2 + 1 Tempstr2 = Str(temp2) Tempstr = "-" + Format(tempstr2 , " ") End If Ledx = 9 Gosub Leddisp '文字列の描画。 Gosub Setswin '設定用スイッチ入力。 Select Case Swdata Case &B0000_0001 'If [SW1]が押されたか? Then Goto Funcset72 Case &B0000_0010 'If [SW2]が押されたか? Then Temp1 = Temp1 + 1 Case &B0000_0100 'If [SW3]が押されたか? Then Temp1 = Temp1 - 1 End Select Goto Funcset71 ' Funcset72: Eepagingoffset = Temp1 'EEPROMに格納する。 I2cbuff(1) = &H10 'レジスター[10h] Aging Offsetのアドレスを指定する。 I2cbuff(2) = Temp1 '[Aging Offset]値データを[DS3231]に保存する。 I2csend &HD0 , I2cbuff(1) , 2 'I2Cバスで、2バイトのデータを送信する。 ' ' #if Scroll_version <> 0 'If スクロール有りのバージョンか? Then Ledx = 1 '[縦スクロールのスピード]の設定。 Ledy = 1 Ledcolor = 3 Ledback = 0 Tempstr = "Vscro" Gosub Leddisp '文字列の描画。 Ledx = 1 Ledy = 2 Tempstr = "spd " Gosub Leddisp '文字列の描画。 Gosub Swoffchk 'スイッチが離されるのを待つ。 ' Temp2 = 10 '設定の上限値。 Temp3 = 1 '設定の下限値。 Ledcolor = 7 Ledback = 1 Temp1 = Eepscrollverspd Funcset81: Tempstr2 = Str(temp1) Tempstr = Format(tempstr2 , " 0") Ledx = 21 Gosub Leddisp '文字列の描画。 Gosub Setswin '設定用スイッチ入力。 Select Case Swdata Case &B0000_0001 'If [SW1]が押されたか? Then Goto Funcset82 Case &B0000_0010 'If [SW2]が押されたか? Then Gosub Funcplus '設定値を加算する。 Case &B0000_0100 'If [SW3]が押されたか? Then Gosub Funcminus '設定値を減算する。 End Select Goto Funcset81 ' Funcset82: Eepscrollverspd = Temp1 'EEPROMに格納する。 Scrollverspd = Temp1 ' #endif Brighttemp = 0 '輝度調整を強制実行させる。 Gosub Ledclear 'LEDパネル画面を消去する。 Return ' ' * 設定値を加算するサブルーチン * (Temp1 = 設定値 , Temp2 = 上限値 , Temp3 = 下限値) ' Funcplus: Temp1 = Temp1 + 1 '設定値を加算する。 If Temp1 > Temp2 Then 'If 上限値を超えたか? Then Temp1 = Temp3 End If Return ' ' * 設定値を減算するサブルーチン * (Temp1 = 設定値 , Temp2 = 上限値 , Temp3 = 下限値) ' Funcminus: If Temp1 = Temp3 Then 'If 下限値か? Then Temp1 = Temp2 Else Temp1 = Temp1 - 1 '設定値を減算する。 End If Return '========================= LEDパネル 汎用ルーチン ================================================= ' ' *************************************** ' * LEDパネル画面を消去するサブルーチン * ' *************************************** ' Ledclear: For Tempw3 = 1 To Ledbuff_size Ledbuff(tempw3) = 0 Next Tempw3 Return ' ' ****************************** ' * 文字列 描画 サブ・ルーチン * (Ledx = Xアドレス , Ledy = Yアドレス , Ledcolor = 文字色 , Ledback = 背景色 , Tempstr = 文字列) ' ****************************** (1〜128) (1〜2) (0〜7) (0〜7) ' Leddisp: Temp8 = Len(tempstr) '文字数を確認する。 For Temp9 = 1 To Temp8 Tempstr2 = Mid(tempstr , Temp9 , 1) Ledchr = Asc(tempstr2) '文字をASCIIコードに変換する。 Gosub Ledwr6 '6x8ドット文字 描画。 Ledx = Ledx + 6 Next Temp9 Return ' ' ************************************* ' * 6x8ドット文字 描画 サブ・ルーチン * (Ledx = Xアドレス , Ledy = Yアドレス , Ledcolor = 文字色 , Ledback = 背景色 , Ledchr = 文字ASCIIコード) ' ************************************* (1〜128) (1〜2) (0〜7) (0〜7) (&H20〜&HFF) ' Dim Fontadr As Word , Buffadr As Word , Ledtempw1 As Word , Ledtempw2 As Word Dim Ledtemp1 As Byte , Ledtemp2 As Byte , Ledtemp3 As Byte , Ledtemp4 As Byte , Ledtemp5 As Byte Dim Ledtemp6 As Byte , Ledtemp7 As Byte , Ledtemp8 As Byte , Ledtemp9 As Byte ' Ledwr6: Ledtemp1 = Ledcolor '1行目と2行目の色のビット配置を選択する。 Ledtemp9 = Ledback If Ledy = 1 Then 'If 1行目か? Then Ledtemp2 = &B1111_1000 '色データのマスクビット。 Else Shift Ledtemp1 , Left , 3 '2行目用のビット位置に移動する。 Shift Ledtemp9 , Left , 3 '2行目用のビット位置に移動する。 Ledtemp2 = &B1100_0111 '色データのマスクビット。 End If Ledtemp3 = Lookup(1 , Rgbled6x8) '指定されたフォントの横ドット数を読み込む。 Ledtemp4 = Ledchr - &H20 'ASCIIコードのオフセットを減算する。 Fontadr = Ledtemp4 * Ledtemp3 '横ドット毎の位置を計算する。 Fontadr = Fontadr + 4 'フォントテーブルにあるフォント情報をスキップする。 Buffadr = Ledx 'LEDバッファーの位置を設定する。 Ledtemp3 = Ledtemp3 - 1 For Ledtemp5 = 0 To Ledtemp3 '横ドット分の処理。 Ledtemp6 = Lookup(fontadr , RGBLED6x8) 'フォントデータを読み込む。 Ledtempw1 = Buffadr For Ledtemp7 = 0 To 7 '縦8ドット分の処理。 Ledtemp8 = Ledbuff(ledtempw1) 'LEDバッファーのデータを読み込む。 Ledtemp8 = Ledtemp8 And Ledtemp2 '更新する色データのビットをマスクする。 If Ledtemp6.ledtemp7 = 1 Then 'If フォントのドットが有るか? Then Ledtemp8 = Ledtemp8 Or Ledtemp1 '色データのビットをセットする。 Else Ledtemp8 = Ledtemp8 Or Ledtemp9 '背景色のビットをセットする。 End If Ledbuff(ledtempw1) = Ledtemp8 'LEDバッファーにデータを書き込む。 Ledtempw1 = Ledtempw1 + Ledbuff_length '縦軸ドット分の位置計算。 Next Ledtemp7 Buffadr = Buffadr + 1 '横ドットを進める。 Fontadr = Fontadr + 1 'フォントアドレスを進める。 Next Ledtemp5 Return ' ' ************************************ ' * 8ドット塗りつぶし サブ・ルーチン * (Ledx = Xアドレス , Ledy = Yアドレス , Ledback = 背景色 , ledlen = Xの塗りつぶし数 ' ************************************ (1〜128) (1〜2) (0〜7) (1〜128) ' Ledfill: Ledtemp9 = Ledback '1行目と2行目の色のビット配置を選択する。 If Ledy = 1 Then 'If 1行目か? Then Ledtemp2 = &B1111_1000 '色データのマスクビット。 Else Shift Ledtemp9 , Left , 3 '2行目用のビット位置に移動する。 Ledtemp2 = &B1100_0111 '色データのマスクビット。 End If For Ledtemp3 = 1 To Ledlen '指定数のドットを背景色で埋める。 Buffadr = Ledx For Ledtemp4 = 1 To 8 '縦ドット分の処理。 Ledtemp8 = Ledbuff(buffadr) 'LEDバッファーのデータを読み込む。 Ledtemp8 = Ledtemp8 And Ledtemp2 '更新する色データのビットをマスクする。 Ledtemp8 = Ledtemp8 Or Ledtemp9 '背景色のビットをセットする。 Ledbuff(buffadr) = Ledtemp8 'LEDバッファーにデータを書き込む。 Buffadr = Buffadr + Ledbuff_length '縦軸ドット分の位置計算。 Next Ledtemp4 Ledx = Ledx + 1 Next Ledtemp3 Return '( ' ' *************************************** ' * 16x16ドット文字 描画 サブ・ルーチン * (Ledx = Xアドレス , Ledcolor = 文字色 , Ledback = 背景色 , Ledchr = 文字ASCIIコード) ' *************************************** (1〜128) (0〜7) (0〜7) (&H20〜&HFF) ' Ledwr16: Ledtemp1 = Ledcolor '2行目の色のビット配置を設定する。 Shift Ledtemp1 , Left , 3 '2行目用のビット位置に移動する。 Ledtemp9 = Ledback '2行目の背景色のビット配置を設定する。 Shift Ledtemp9 , Left , 3 '2行目用のビット位置に移動する。 Ledtemp3 = Lookup(2 , Font16x16) '指定されたフォントの総バイト数を読み込む。 Ledtemp4 = Ledchr - &H20 'ASCIIコードのオフセットを減算する。 Fontadr = Ledtemp4 * Ledtemp3 '横ドット毎の位置を計算する。 Fontadr = Fontadr + 4 'フォントテーブルにあるフォント情報をスキップする。 Buffadr = Ledx 'LEDバッファーの位置を設定する。 Ledtemp3 = Lookup(1 , Font16x16) '指定されたフォントの横ドット数を読み込む。 Ledtemp3 = Ledtemp3 - 1 For Ledtemp5 = 0 To Ledtemp3 '横ドット分の処理。 Ledtemp6 = Lookup(fontadr , Font16x16) '上半分のフォントデータを読み込む。 Ledtempw1 = Fontadr + 16 '下半分のフォントデータの位置を計算する。 Ledtemp7 = Lookup(ledtempw1 , Font16x16) '下半分のフォントデータを読み込む。 Ledtempw2 = Buffadr For Ledtemp2 = 0 To 7 '縦16ドット分の処理。 Ledtemp8 = Ledbuff(ledtempw2) 'LEDバッファーのデータを読み込む。 Ledtemp8 = Ledtemp8 And &B1100_0000 '更新する色データのビットをマスクする。 If Ledtemp6.ledtemp2 = 1 Then 'If フォントのドットが有るか? Then Ledtemp8 = Ledtemp8 Or Ledcolor '色データのビットをセットする。 Else Ledtemp8 = Ledtemp8 Or Ledback '背景色のビットをセットする。 End If If Ledtemp7.ledtemp2 = 1 Then 'If フォントのドットが有るか? Then Ledtemp8 = Ledtemp8 Or Ledtemp1 '色データのビットをセットする。 Else Ledtemp8 = Ledtemp8 Or Ledtemp9 '背景色のビットをセットする。 End If Ledbuff(ledtempw2) = Ledtemp8 'LEDバッファーにデータを書き込む。 Ledtempw2 = Ledtempw2 + Ledbuff_length '縦軸ドット分の位置計算。 Next Ledtemp2 Buffadr = Buffadr + 1 '横ドットを進める。 Fontadr = Fontadr + 1 'フォントアドレスを進める。 Next Ledtemp5 Return ') '================================================================================================== ' ' *************************************** ' * TIMER2 比較一致(A) 割り込みルーチン * ' *************************************** ' $notransform On 'R23またはR0を使用する命令に自動修正させない。 ' $asm Tint2a: PUSH R2 IN R2,SREG 'ステータス・レジスタを待避。 PUSH R0 PUSH R1 PUSH XL PUSH XH ; LDS XL,{rowadr} 'LEDバッファーのロー・アドレスを読み込む。 LDI XH, Ledbuff_Length 'LEDバッファーの横軸バイト数。(横32ドット * パネル枚数 + スクロールバッファー分) MUL XH,XL 'LEDバッファーの位置を計算する。 Loadadr Ledbuff(1) , X 'RGB LEDパネル データ・バッファーの先頭アドレス。 ADD XL,R0 'LEDバッファーにロー・アドレスを加算する。 ADC XH,R1 ; LDS R0,{Transfer_Length} 'LEDバッファーに転送するバイト数。 Tint2a1: LD R1,X+ 'LEDバッファーから点灯データを読み込む。 Out Panel_rgb , R1 'RGBデータをセットする。 SBI Panel_clk_p, Panel_clk_b 'RGB LEDパネル [CLK]を[H]にする。 CBI Panel_clk_p, Panel_clk_b 'RGB LEDパネル [CLK]を[L]にする。 DEC R0 BRNE Tint2a1 'If 横軸バイト数分の転送終了か? Else ; LDS XL,{rowadr} 'ロー・アドレスを読み込む。 SBI Panel_oe_p, Panel_oe_b 'RGB LEDパネル [OE]を[H]にする。(全LEDを消灯する) SBI Panel_lat_p, Panel_lat_b 'RGB LEDパネル [LAT]を[H]にする。 CBI Panel_lat_p, Panel_lat_b 'RGB LEDパネル [LAT]を[L]にする。 ; CBI Panel_a_p, Panel_a_b 'ロー・アドレスをポートに設定する。 CBI Panel_b_p, Panel_b_b CBI Panel_c_p, Panel_c_b SBRC XL,0 SBI Panel_a_p, Panel_a_b SBRC XL,1 SBI Panel_b_p, Panel_b_b SBRC XL,2 SBI Panel_c_p, Panel_c_b INC XL 'ロー・アドレスを進める。 ANDI XL,$07 STS {rowadr},XL ; POP XH POP XL POP R1 POP R0 Out Sreg , R2 'ステータス・レジスタを復帰 POP R2 CBI Panel_oe_p, Panel_oe_b 'RGB LEDパネル [OE]を[L]にする。 RETI $end Asm ' ' *************************************** ' * TIMER2 比較一致(B) 割り込みルーチン * ' *************************************** ' $asm Tint2b: PUSH R24 SBI Panel_oe_p, Panel_oe_b 'RGB LEDパネル [OE]を[H]にする。 LDI R24,$FF STS {Ledintf},R24 'LED表示割り込み発生フラグを立てる。 POP R24 RETI $end Asm ' $notransform Off End '************************************************************************************************** ' ' * フォント・データ * ' $include "RGBLED6x8.font" '6x8ドット フォント・ファイルの組み込み。 '$include "font16x16.font" '16x16ドット フォント・ファイルの組み込み。 ' ' * RTC [DS3231]の初期設定データ・テーブル * ' Ds3231initdata: Data &H00 '[DS3231]レジスターのスタートアドレス Data &H00 '[00] Seconds Data &H00 '[01] Minutes Data &H00 '[02] Hours Data &H01 '[03] Weekday Data &H01 '[04] Date Data &H01 '[05] Months Data &H17 '[06] Year Data &H00 '[07] Alarm 1 Seconds Data &H00 '[08] Alarm 1 Minutes Data &H00 '[09] Alarm 1 Hours Data &H00 '[0A] Alarm 1 Day,Date Data &H00 '[0B] Alarm 2 Minutes Data &H00 '[0C] Alarm 2 Hours Data &H00 '[0D] Alarm 2 Day,Date Data &B0000_0000 '[0E] Control (/EOSC=0, BBSQW=0, CONV=0, RS2-RS1=00(1Hz), INTCN=0, A2IE=0, A1IE=0) Data &B0000_0000 '[0F] Control/Status (OSF=0, Bit6=0, Bit5=0, Bit4=0, EN32kHz=0, BSY=x, A2F=0, A1F=0) Data &H00 '[10] Aging Offset ' ' * シリアル出力の期間文字テーブル * ' Serialtimechr: Data "OFF" , " 1S" , "10S" , " 1M" , "10M" , "60M" ' ' * シリアル送信バッファーの初期データ * ' Serialbuffinit: Data "20xx/xx/xx xx:xx:xx xx.x xx.x xxxx.x{013}{010}" ' ' * 天気予報の待ち時間表示 横線キャラクター・データ * ' Waitbar: Data &H20 , &H20 '[100] Data &H97 , &H20 '[101] Data &H96 , &H20 '[102] Data &H95 , &H20 '[103] Data &H94 , &H20 '[104] Data &H93 , &H20 '[105] Data &H92 , &H20 '[106] Data &H92 , &H97 '[107] Data &H92 , &H96 '[108] Data &H92 , &H95 '[109] Data &H92 , &H94 '[110] Data &H92 , &H93 '[111] Data &H92 , &H92 '[112] Data &H91 , &H92 '[113] Data &H90 , &H92 '[114] Data &H8F , &H92 '[115] Data &H8E , &H92 '[116] Data &H8D , &H92 '[117] Data &H8C , &H92 '[118] Data &H8C , &H91 '[119] Data &H8C , &H90 '[120] Data &H8C , &H8F '[121] Data &H8C , &H8E '[122] Data &H8C , &H8D '[123] Data &H8C , &H8C '[124] Data &H8C , &H8C '[125]