$prog &HFF , &H62 , &HDD , &HFF 'BODLEVEL = 2.7V ' ' ********************************************** ' * 温度・湿度・気圧計+時計 * ' * [ACM1602NI,AM2321,MPL115A2,RTC-8564] * ' * * ' * AVR is using ATtiny85-20PU * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2014. 4.10 * ' ********************************************** ' ' Ver 0.01 テスト・バージョン。2014. 4. 9 ' Ver 1.01 初回公開バージョン。2014. 4.10 ' ' Const Prgver = "01.01" 'プログラム・バージョン。 ' Const Datedisptime = 5 '日付表示の自動復帰時間。(秒) ' ' $regfile = "ATtiny85.DAT" '使用するAVRを設定。 $crystal = 1000000 'AVRクロックを設定。 ' $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 10 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 ' ' * ポート名の定義 * ' Sw_1 Alias Pinb.1 'スイッチ[1]の接続ポート。 Sw_1pu Alias Portb.1 'スイッチ[1]の接続ポート(プルアップ用)。 Sw_2 Alias Pinb.2 'スイッチ[2]の接続ポート。 Sw_2pu Alias Portb.2 'スイッチ[2]の接続ポート(プルアップ用)。 Rtc_1s Alias Pinb.3 'RTC 1秒出力の接続ポート。 Rtc_1spu Alias Portb.3 'RTC 1秒出力の接続ポート(プルアップ用)。 ' ' * 変数の宣言 * ' Dim Rtcff As Byte 'RTC1秒出力の検出用F/F。 Dim Hourtemp As Byte '[時]更新用テンポラリ。 Dim Daytemp As Byte '[日]更新用テンポラリ。 Dim Dispmode As Byte '表示モード。(0:時刻表示 , 1:日付表示 , 2:簡易グラフ表示 , 3:最高値/最低値表示) Dim Timebuf(7) As Byte '時刻データバッファー。 Dim Hourmode As Byte '12/24時間制表示選択。(0:12時間制 , 1:24時間制) Dim Yeardisp As Byte '年表示フラグ。(0:[月日/曜日] , 1:[年月日]) Dim Autodisp As Byte '気圧と日付の自動表示切り替え。(0:気圧固定表示 , 1:5〜9秒で日付表示) Dim Autotime As Byte '自動制御用タイマー。 Dim Keycun As Byte 'キー入力チェック用タイマーカウンター。 Dim Keyflag As Byte 'キー入力検出フラグ。 Dim Keydata As Byte 'キー入力データ。 Dim Keytemp As Byte 'キー入力用テンポラリ。 ' Dim Temperature As Integer '温度値。(x0.1) Dim Humidity As Word '湿度値。(x0.1) Dim I2cbuff(20) As Byte 'I2C送受信バッファー。 Dim Am2321err As Byte '[AM2321]のエラーフラグ。 Dim Crcsum As Word 'CRCチェックサムの合計値。 ' Dim Uipadc As Word '圧力のA/D変換値。 Dim Uitadc As Word '温度のA/D変換値。 Dim Sia0 As Integer '[a0] 圧力のオフセット係数。 Dim Sib1 As Integer '[b1] 圧力の感度係数。 Dim Sib2 As Integer '[b2] 1次の温度オフセット係数 (TCO)。 Dim Sic12 As Integer '[c12]温度感度係数(TCS)のための係数。 ' Dim Tl1 As Long '汎用テンポラリ変数 Long型 No.1 Dim Tl2 As Long '汎用テンポラリ変数 Long型 No.2 ' Dim Average(32) As Word '移動平均用バッファー。 Dim Avgpoi As Byte '移動平均のポインター。 Dim Avgsum As Long '移動平均の合計値。 Dim Baropress As Word '気圧値。 Dim Deviation As Integer '気圧の24時間偏差値。 Dim Weather As Byte '天気予報値。 Dim Dbuf(24) As Word '24時間のデータバッファー。 Dim Dbufpoi As Byte '24時間のデータバッファー用ポインター。 Dim Tbuf(48) As Word '48時間のデータバッファー。 Dim Tbufpoi As Byte '48時間のデータバッファー用ポインター。 Dim Pregbasis As Word '気圧グラフのベース気圧値。(500〜990hPa) 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 Maxminmode As Byte '最高値/最小値の表示モード。 ' 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 Tempw1 As Word '汎用テンポラリ変数 Word型 No.1 Dim Tempi1 As Integer '汎用テンポラリ変数 Integer型 No.1 Dim Tempstr As String * 20 '汎用テンポラリ変数 String型 No.1 ' Dim Dummy As Eram Long 'EEPROM 4バイトのダミーエリア。 Dim Eephourmode As Eram Byte 'EEPROM 12/24時間制表示選択。(0:12時間制 , 1:24時間制) Dim Eepyeardisp As Eram Byte 'EEPROM 年表示フラグ。(0:[月日/曜日] , 1:[年月日]) Dim Eepautodisp As Eram Byte 'EEPROM 気圧と日付の自動表示切り替え。(0:気圧固定表示 , 1:5〜9秒で日付表示) Dim Eeppregbasis As Eram Word 'EEPROM 気圧グラフのベース気圧値。(500〜990hPa) $lib "mcsbyteint.lbx" '文字列変換ルーチンを最適化するライブラリ。 ' ' * ポートの初期設定 * ' Set Sw_1pu 'スイッチ[1]の接続ポートをプルアップ。 Set Sw_2pu 'スイッチ[2]の接続ポートをプルアップ。 Set Rtc_1spu 'RTC 1秒出力の接続ポートをプルアップ。 Config Aci = Off 'アナログ比較器の電源を切る。 Prr = &B0000_1011 '電力削減レジスタの設定。 ' ' * I2Cの初期設定 * ' Config Scl = Portb.0 'I2CバスのSCLラインを接続するポートピンを設定。 Config Sda = Portb.4 'I2CバスのSDAラインを接続するポートピンを設定。 I2cinit 'I2Cバスを初期化する。 Waitms 500 '[AM2321]のパワーオン時間を待つ。 ' ' * LCDの初期設定 * ' Config Lcd = 16 * 2 'LCD表示を16文字2行に設定。 $lib "Lcd_ACM1602NI.lib" 'LCD [ACM1602NI-FLW-FBW-M01]用のライブラリ。 Initlcd 'LCDを初期化する。 ' Cursor Off 'LCDのカーソルをオフにする。 Deflcdchar 0 , &H10 , &H18 , &H14 , &H14 , &H02 , &H05 , &H06 , &H04 'カスタム文字[hp]をLCDへ書き込む。 Deflcdchar 5 , &H00 , &H00 , &H00 , &H00 , &H00 , &H1F , &H00 , &H00 'カスタム文字[バー5bit]をLCDへ書き込む。 Deflcdchar 6 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H1F 'カスタム文字[バー7bit]をLCDへ書き込む。 Deflcdchar 7 , &H00 , &H00 , &H00 , &H00 , &H00 , &H11 , &H0A , &H04 'カスタム文字[下矢印]をLCDへ書き込む。 Gosub Lcdcustom 'カスタム文字をLCDに設定する。 ' ' * MPL115A2から係数ROMデータを読み出す * ' I2cbuff(1) = &H04 '係数ROMデータのメモリー・アドレスを指定する。 I2creceive &HC0 , I2cbuff(1) , 1 , 12 'I2Cバスで、1バイトのコマンドを送信し、12バイトのデータを受信する。 ' ' * 係数のバイト・データを16bitのワードに変換する * ' Sia0 = Makeint(i2cbuff(2) , I2cbuff(1)) '[a0] 圧力のオフセット係数。 Sib1 = Makeint(i2cbuff(4) , I2cbuff(3)) '[b1] 圧力の感度係数。 Sib2 = Makeint(i2cbuff(6) , I2cbuff(5)) '[b2] 1次の温度オフセット係数 (TCO)。 Sic12 = Makeint(i2cbuff(8) , I2cbuff(7)) '[c12]温度感度係数(TCS)のための係数。 ' ' * 移動平均・24時間バッファーを初期化する * ' Gosub Baroconv '[MPL115A2]から気圧取得と係数補正。 Baropress = Tempw1 For Avgpoi = 1 To 32 '移動平均バッファーを初期値で埋める。 Average(avgpoi) = Tempw1 Next Avgpoi Avgsum = Tempw1 Shift Avgsum , Left , 5 '32個の平均合計を作る。 ' Waitms 500 'RTC-8564起動待ち。 ' ' * RTC-8564の動作状態を確認 (バックアップ切れを確認) * ' I2cbuff(1) = &H02 '[02]:電圧低下(VL)ビットのメモリー・アドレスを指定する。 I2creceive &HA2 , I2cbuff(1) , 1 , 1 'I2Cバスで、1バイトのコマンドを送信し、1バイトのデータを受信する。 If I2cbuff(1).7 = 1 Then Gosub Rtc8564init 'If RTC-8564の初期化が必要か? Then ' Gosub Rtc8564start 'RTC-8564の時計機能を始動。(初期化中に中断した場合の対策) ' ' * Timerの設定 * ' Config Timer0 = Timer , Prescale = 64 , Clear Timer = 1 'Timer0の設定。1,000,000Hz / 64 = 15,625Hz Ocr0a = 156 - 1 '15,625Hz / 100Hz(10mS) = 約156カウント ' ' * EEPROMのデータを確認する * ' If Eephourmode > 1 Then 'If EEPROMが初期値か? Then Eephourmode = 0 'EEPROM 12/24時間制表示選択。(0:12時間制 , 1:24時間制) Eepyeardisp = 0 'EEPROM 年表示フラグ。(0:[月日/曜日] , 1:[年月日]) Eepautodisp = 0 'EEPROM 気圧と日付の自動表示切り替え。(0:気圧固定表示 , 1:5〜9秒で日付表示) Eeppregbasis = 990 '気圧グラフのベース気圧値。(500〜990hPa) End If Hourmode = Eephourmode Yeardisp = Eepyeardisp Autodisp = Eepautodisp Pregbasis = Eeppregbasis ' ' * プログラム・バージョンの表示 * ' If Sw_1 = 0 Then 'If [SW1]が押されているか? Then Locate 1 , 1 'プログラム・バージョンを表示。 Lcd "Therm,Hygro,Baro" Locate 2 , 1 Lcd "Clock Ver." ; Prgver Gosub Swoffchk 'スイッチが離されるのを待つ。 Cls 'LCD表示を全消去する。 End If ' ' * 時計の初期値設定 * ' Config Clock = User ' 時計(タイマー)をUserモードに設定。 Config Date = Ymd , Separator = / '日付の表現方法(形式)を設定。 Gosub Rtcread 'RTC-8564から、日時データを取り出す。 ' ' * 変数の初期値設定 * ' Avgpoi = 1 '移動平均のポインターを初期化。 Dbufpoi = 1 '24時間のデータバッファーポインターを初期化。 Tbufpoi = 1 '48時間のデータバッファーポインターを初期化。 Hourtemp = 255 '[時]の更新テンポラリの初期化。 Daytemp = Timebuf(4) '[日]の更新テンポラリの初期化。 Weather = 0 '天気の初期値。 Tempmax = -400 '温度の最高値を初期化する。 Tempmin = 800 '温度の最低値を初期化する。 Humimax = 0 '湿度の最高値を初期化する。 Humimin = 999 '湿度の最低値を初期化する。 Baromax = 5000 '気圧の最高値を初期化する。 Baromin = 11500 '気圧の最低値を初期化する。 Gosub Unitdisp 'LCDに数値の単位を表示する。 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: If Rtc_1s = 0 Then 'RTC [/INT(1s)] 出力が[L]か? Then If Rtcff = 0 Then '[L]の立ち下がりを検出か? Then Rtcff = 1 ' ' * 1秒毎の処理 * ' Gosub Rtcread 'RTC-8564から、日時データを取り出す。 ' If Dispmode < 2 Then 'If 数値表示のモードか? Then If Autotime <> 0 Then 'If 気圧表示への自動復帰カウント中か? Then Autotime = Autotime - 1 If Autotime = 0 Then 'If 気圧表示へ自動復帰か? Then Dispmode = 0 End If Else If Autodisp <> 0 Then 'If [気圧]と[日時]の自動切り替え表示か? Then Temp1 = Timebuf(1) And &H0F If Temp1 < 5 Then 'If 秒の下位が0〜4か? Then Dispmode = 0 Else Dispmode = 1 End If End If End If Gosub Timedisp 'LCDに時刻を表示する。 Gosub Bardisp '気圧値をLCDに表示する。 End If ' ' * 2秒毎の処理 * ' If Timebuf(1).0 = 0 Then 'If 2秒経過したか? Then Gosub Am2321measure '[AM2321]の湿度・温度を測定する。(2秒間隔で計測する) Gosub Baravg '気圧値を取得して移動平均をする。 If Dispmode < 2 Then 'If 数値表示のモードか? Then Gosub Tehudisp '温度・湿度データをLCDに表示する。 End If Gosub Maxmindisp '最高値/最低値をLCDに表示する。 End If ' ' * 1時間毎の処理 * ' If Timebuf(3) <> Hourtemp Then 'If 1時間経過したか? Then Hourtemp = Timebuf(3) Gosub Weatherreport '気圧値24時間偏差を求めて天気を予報する。 If Dispmode = 2 Then 'If グラフ表示モードか? Then Cls 'LCDを全面消去する。 Gosub Graphdisp '簡易気圧グラフを表示する。 End If End If ' ' * 1日毎の処理 * ' If Timebuf(4) <> Daytemp Then 'If 日付が変わったか? Then Daytemp = Timebuf(4) Gosub Maxminreset '最高値/最低値を初期化する。 End If End If Else 'RTC 1s 出力が[H]の場合。 Rtcff = 0 End If ' Gosub Keychk 'キー入力を確認する。 Gosub Keycont 'キー入力により表示を切り換える。 Goto Main ' ' ********************************** ' * キー入力により表示を切り換える * ' ********************************** ' Keycont: Select Case Keyflag Case 1 : 'キー入力が有った場合。 Select Case Keydata Case &B0000_0001 : '[SW1]が押された場合。 Select Case Dispmode Case 3 : '[Mode:0]気圧表示に変更。 Dispmode = 0 Autotime = 0 Cls 'LCD表示を全消去する。 Gosub Unitdisp 'LCDに数値の単位を表示する。 Gosub Timedisp 'LCDに時刻を表示する。 Gosub Tehudisp '温度・湿度データをLCDに表示する。 Gosub Bardisp '気圧値をLCDに表示する。 ' Case 0 : '[Mode:1]日付表示に変更。 Dispmode = 1 Gosub Timedisp 'LCDに時刻を表示する。 Autotime = Datedisptime '日付表示の自動復帰時間をセット。 ' Case 1 : '[Mode:2]グラフ表示に変更。 Dispmode = 2 Autotime = 0 Cls 'LCD表示を全消去する。 Gosub Lcdcustom 'カスタム文字をLCDに設定する。 Gosub Graphdisp '簡易気圧グラフを表示する。 ' Case Else '[Mode:3]最高値/最低値表示に変更。 Dispmode = 3 Maxminmode = 0 Autotime = 0 Cls 'LCD表示を全消去する。 Gosub Lcdcustom 'カスタム文字をLCDに設定する。 Gosub Unitdisp 'LCDに数値の単位を表示する。 Gosub Maxmindisp '最高値/最低値をLCDに表示する。 End Select ' Case &B0000_0010 : '[SW2]が押された場合。 Select Case Dispmode Case 0 : '[気圧]表示モードの場合。 Toggle Hourmode.0 '12/24時間制表示を切り替える。 Eephourmode = Hourmode 'EEPROMに保存する。 Gosub Timedisp 'LCDに時刻を表示する。 ' Case 1 : '[日付]表示モードの場合。 Toggle Yeardisp '[月日/曜日]と[年月日]表示を切り替える。 Eepyeardisp = Yeardisp 'EEPROMに保存する。 Gosub Timedisp 'LCDに時刻を表示する。 Autotime = Datedisptime '日付表示の自動復帰時間をセット。 ' Case 3 : Toggle Maxminmode '最高値/最低値の表示モードを切り替える。 Cls 'LCD表示を全消去する。 Gosub Unitdisp 'LCDに数値の単位を表示する。 Gosub Maxmindisp '最高値/最低値をLCDに表示する。 End Select ' Case &B0000_0011 : '[SW1]と[SW2]が同時に押された場合。 Gosub Timeset '時刻設定モード。 Dispmode = 0 Autotime = 0 Cls 'LCD表示を全消去する。 Gosub Lcdcustom 'カスタム文字をLCDに設定する。 Gosub Unitdisp 'LCDに数値の単位を表示する。 Gosub Timedisp 'LCDに時刻を表示する。 Gosub Tehudisp '温度・湿度データをLCDに表示する。 Gosub Bardisp '気圧値をLCDに表示する。 End Select Keyflag = 0 ' Case 2 : 'リピート検出の場合。 If Keydata = &B0000_0010 Then '[SW2]が押されたか? Then Select Case Dispmode Case Is < 2 : '数値表示のモード。 Locate 2 , 1 If Autodisp = 0 Then 'If [気圧値]固定表示か? Then Autodisp = 1 Lcd " -Auto-" ; Spc(3) Else Autodisp = 0 Lcd " -Fix-" ; Spc(4) End If Eepautodisp = Autodisp 'EEPROMに保存する。 ' Gosub Swoffchk 'スイッチが離されるのを待つ。 Dispmode = 0 Gosub Timedisp 'LCDに時刻を表示する。 Gosub Bardisp '気圧値をLCDに表示する。 ' Case 3 : '最高値/最低値表示モード。 Gosub Maxminreset '最高値/最低値を初期化する。 Cls 'LCD表示を全消去する。 Locate 1 , 5 Lcd "Max / Min" Locate 2 , 7 Lcd "Reset" Gosub Swoffchk 'スイッチが離されるのを待つ。 Maxminmode = 0 Cls 'LCD表示を全消去する。 Gosub Unitdisp 'LCDに数値の単位を表示する。 Gosub Maxmindisp '最高値/最低値をLCDに表示する。 ' Case Else : '簡易グラフ表示モード。 Gosub Basisset '簡易グラフ表示のベース位置を設定する。 Cls 'LCD表示を全消去する。 Gosub Graphdisp '簡易気圧グラフを表示する。 End Select End If Keyflag = 0 End Select Return ' ' ****************************** ' * スイッチが離されるのを待つ * ' ****************************** ' Swoffchk: Bitwait Sw_1 , Set '[SW1]が離されるまで待つ。 Bitwait Sw_2 , Set '[SW2]が離されるまで待つ。 Waitms 30 'チャタリングの待ち時間。 Return ' ' **************************************** ' * 簡易グラフ表示のベース位置を設定する * ' **************************************** ' Basisset: Cls 'LCD表示を全消去する。 Lcd "Pressure Graph" Locate 2 , 4 Lcd "Basis" ; Spc(5) ; "hPa" Gosub Swoffchk 'スイッチが離されるのを待つ。 Cursor On , Blink 'LCDのカーソルをオン。 ' Basisset1: Locate 2 , 10 Lcd Pregbasis Basisset2: Gosub Keychk 'キー入力を確認する。 If Keyflag <> 0 Then Keyflag = 0 If Keydata = &B0000_0001 Then Goto Basisset4 '[SW1]が押された場合。 If Keydata = &B0000_0010 Then Goto Basisset3 '[SW2]が押された場合。 End If Goto Basisset2 ' ' Basisset3: '[SW2]が押された。 Pregbasis = Pregbasis - 10 If Pregbasis < 500 Then 'If 下限か? Then Pregbasis = 990 End If Goto Basisset1 ' ' Basisset4: '[SW1]が押された。 Eeppregbasis = Pregbasis Cursor Off , Noblink 'LCDのカーソルをオフ・点滅無しにする。 Return ' ' ***************************** ' * LCDに数値の単位を表示する * ' ***************************** ' Unitdisp: Select Case Dispmode Case Is < 2 : '数値表示のモード。 Locate 1 , 16 '[℃]単位表示。 Lcd Chr(01) Locate 2 , 16 '[%]単位表示。 Lcd "%" ' Case 3 : '最高値/最低値表示モード。 Locate 1 , 1 If Maxminmode = 0 Then 'If 温度と湿度の表示か? Then Lcd "Max" ; Spc(6) ; Chr(01) ; Spc(5) ; "%" Locate 2 , 1 Lcd "Min" ; Spc(6) ; Chr(01) ; Spc(5) ; "%" Else '気圧値の場合。 Lcd "Max" ; Spc(8) ; Chr(00) Locate 2 , 1 Lcd "Min" ; Spc(8) ; Chr(00) End If End Select Return ' ' *********************** ' * LCDに時刻を表示する * ' *********************** ' Timedisp: Locate 1 , 1 '[時刻]を表示する。 If Hourmode = 0 Then 'If 12時間制表示か? Then Temp1 = Makedec(timebuf(3)) 'BCDを10進数の数値に変換。 If Temp1 < 12 Then 'If AM or PM? Lcd "AM "; '[AM]を表示する。 Else Lcd "PM "; '[PM]を表示する。 End If ' If Temp1 = 0 Then Temp1 = 24 '24時間制時刻を12時間制に変換する。 If Temp1 > 12 Then Temp1 = Temp1 - 12 Temp1 = Makebcd(temp1) '10進数の数値をBCD値に変換。 Gosub Zerosup '上位桁をゼロサプレスして表示。 Lcd ":" ; Hex(timebuf(2)) ; '[分]を表示。 Else '24時間制の場合。 Temp1 = Timebuf(3) '[時]を表示。 Gosub Zerosup '上位桁をゼロサプレスして表示。 Lcd ":" ; Hex(timebuf(2)) ; '[分]を表示。 Lcd " " ; Hex(timebuf(1)) ; '[秒]を表示。 End If ' If Dispmode = 1 Then 'If [日付]表示モードか? Then Locate 2 , 1 '[日付]を表示する。 If Yeardisp = 0 Then 'If [月日/曜日]の表示か? Then Gosub Datedisps '[月]と[日]を表示する。 Gosub Weekdisp '年月日から曜日を計算して表示する。 ' Else '[年月日]表示モード。 Lcd "20" ; Hex(timebuf(6)) ; "/"; '[年]を表示。 Gosub Datedisps '[月]と[日]を表示する。 End If End If Return ' ' * [月]と[日]を表示するサブルーチン * ' Datedisps: Temp1 = Timebuf(5) '[月]を表示。 Gosub Zerosup '上位桁をゼロサプレスして表示。 Lcd "/"; Temp1 = Timebuf(4) '[日]を表示。 Gosub Zerosup '上位桁をゼロサプレスして表示。 Return ' ' * 上位桁をゼロサプレスして表示するサブルーチン * (Temp1 = 表示データ) ' Zerosup: Temp2 = Temp1 And &HF0 If Temp2 = 0 Then 'If 上位桁が0か? Then Lcd " " ; Temp1; Else Lcd Hex(temp1); End If Return ' ' * 年月日から曜日を計算して表示するサブルーチン * ' Weekdisp: _day = Makedec(timebuf(4)) 'BCDを10進数の数値に変換。 _month = Makedec(timebuf(5)) 'BCDを10進数の数値に変換。 _year = Makedec(timebuf(6)) 'BCDを10進数の数値に変換。 Temp1 = Dayofweek() '内部変数(_day, _month, _year)から曜日を算出する。 Lcd " " ; Lookupstr(temp1 , Weekdata) ; " " '[曜日]を表示。 Return ' ' ************************* ' * 気圧値をLCDに表示する * ' ************************* ' Bardisp: If Dispmode = 0 Then 'If [気圧]の表示モードか? Then Locate 2 , 1 Tempstr = Str(baropress) '数値を文字列に変換する。 Gosub Form4disp 'LCDに気圧値を表示する。 Lcd Chr(0) ; Spc(3) '単位[hPa]を表示する。 ' Locate 2 , 9 '天気予報を表示する。 Select Case Weather Case 5 : '[晴れ] Lcd Chr(2) ; " " Case 4 : '[晴れ+曇り] Lcd Chr(2) ; Chr(3) Case 3 : '[曇り] Lcd Chr(3) ; " " Case 2 : '[雨] Lcd Chr(4) ; " " Case 0 : Lcd " " '予報が出ていない場合。 End Select End If Return ' ' *********************************** ' * 温度・湿度データをLCDに表示する * (Temperature = 温度データ , Humidity = 湿度データ) ' *********************************** (AM2321err = [AM2321]の通信状態) ' Tehudisp: If Am2321err = 0 Then 'If エラーは無いか? Then Locate 1 , 11 '温度値の表示。 Tempi1 = Temperature Gosub Tempdisps 'LCDに温度値を表示する。 ' Locate 2 , 11 '湿度値の表示 Tempstr = Str(humidity) '数値変数を文字変数に変換する。 Gosub Form3disp 'LCDに湿度値を表示する。 ' Else 'エラー表示。 Locate 1 , 11 Lcd "Err:" ; Hex(am2321err) Locate 2 , 11 Lcd Spc(6) End If Return ' ' ************************************* ' * LCDに温度値を表示するサブルーチン * (Tempi1 = 温度データ) ' ************************************* ' Tempdisps: Tempstr = Str(tempi1) '数値を文字列に変換する。 If Tempi1 >= 0 Then 'If プラス値か? Then Gosub Form3disp Else 'マイナス値の場合。 Lcd Format(tempstr , " 0.0") End If Return ' ' ******************************** ' * 最高値/最低値をLCDに表示する * ' ******************************** ' Maxmindisp: If Dispmode = 3 Then 'If [最高値/最低値]の表示モードか? Then If Maxminmode = 0 Then 'If 温度と湿度の表示モードか? Then Locate 1 , 5 Tempi1 = Tempmax Gosub Tempdisps 'LCDに温度値を表示する。 Locate 2 , 5 Tempi1 = Tempmin Gosub Tempdisps 'LCDに温度値を表示する。 ' Locate 1 , 11 Tempstr = Str(humimax) '数値変数を文字変数に変換する。 Gosub Form3disp 'LCDに湿度値を表示する。 Locate 2 , 11 Tempstr = Str(humimin) '数値変数を文字変数に変換する。 Gosub Form3disp 'LCDに湿度値を表示する。 Else Locate 1 , 6 Tempstr = Str(baromax) '数値を文字列に変換する。 Gosub Form4disp 'LCDに気圧値を表示する。 Locate 2 , 6 Tempstr = Str(baromin) '数値を文字列に変換する。 Gosub Form4disp 'LCDに気圧値を表示する。 End If End If Return ' ' * 3桁でLCDへFormat表示するサブルーチン * ' Form3disp: Lcd Format(tempstr , " 0.0"); Return ' ' * 4桁でLCDへFormat表示するサブルーチン * ' Form4disp: Lcd Format(tempstr , " 0.0"); Return ' ' ***************************** ' * 最高値/最低値を初期化する * ' ***************************** ' Maxminreset: Tempmax = Temperature '温度の最高値を初期化する。 Tempmin = Temperature '温度の最低値を初期化する。 Humimax = Humidity '湿度の最高値を初期化する。 Humimin = Humidity '湿度の最低値を初期化する。 Baromax = Baropress '気圧の最高値を初期化する。 Baromin = Baropress '気圧の最低値を初期化する。 Return ' ' **************************** ' * 簡易気圧グラフを表示する * ' **************************** ' Graphdisp: Temp3 = Tbufpoi For Temp1 = 16 To 1 Step -1 'グラフの[X]個数。 Tempw1 = 0 For Temp2 = 1 To 3 '3時間毎のデータを取り出す。 If Temp3 = 1 Then 'If 8日分バッファーの先頭位置か? Then Temp3 = 48 Else Temp3 = Temp3 - 1 End If Tempw1 = Tempw1 + Tbuf(temp3) Next Temp2 Tempw1 = Tempw1 / 30 '1/30。(3個の平均値と小数点以下を切り捨て) ' If Tempw1 < Pregbasis Then 'If 気圧グラフのベース気圧値以下か? Then Temp4 = 9 '[下矢印]を指定。 Temp5 = 2 '[Y]位置。 Else Tempw1 = Tempw1 - Pregbasis Shift Tempw1 , Left , 2 '4倍する。(1/2.5) Tempw1 = Tempw1 / 10 '1/10する。 Select Case Tempw1 Case Is < 8 : '0〜7の場合。 Temp5 = 2 '[Y]位置。 Temp4 = Tempw1 Case Is < 16 : '8〜15の場合。 Temp5 = 1 '[Y]位置。 Temp4 = Tempw1 - 8 Case Else : '16以上の場合。 Temp4 = 8 '[上矢印]を指定。 Temp5 = 1 '[Y]位置。 End Select End If Temp2 = Lookup(temp4 , Graphchr) Locate Temp5 , Temp1 Lcd Chr(temp2) Next Temp1 Return ' ' ******************************* ' * カスタム文字をLCDに設定する * ' ******************************* ' Lcdcustom: If Dispmode <> 2 Then 'If 簡易グラフ表示以外か? Then Deflcdchar 1 , &H08 , &H14 , &H08 , &H06 , &H09 , &H08 , &H09 , &H06 'カスタム文字[℃]をLCDへ書き込む。 Deflcdchar 2 , &H04 , &H15 , &H0E , &H1F , &H0E , &H15 , &H04 , &H00 'カスタム文字[晴]をLCDへ書き込む。 Deflcdchar 3 , &H00 , &H0C , &H1E , &H1F , &H1F , &H0E , &H07 , &H00 'カスタム文字[雲]をLCDへ書き込む。 Deflcdchar 4 , &H04 , &H0E , &H1F , &H04 , &H04 , &H05 , &H02 , &H00 'カスタム文字[雨]をLCDへ書き込む。 Else Deflcdchar 1 , &H1F , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 'カスタム文字[バー0bit]をLCDへ書き込む。 Deflcdchar 2 , &H00 , &H1F , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 'カスタム文字[バー1bit]をLCDへ書き込む。 Deflcdchar 3 , &H00 , &H00 , &H1F , &H00 , &H00 , &H00 , &H00 , &H00 'カスタム文字[バー2bit]をLCDへ書き込む。 Deflcdchar 4 , &H00 , &H00 , &H00 , &H00 , &H1F , &H00 , &H00 , &H00 'カスタム文字[バー4bit]をLCDへ書き込む。 End If Return ' ' ********************************* ' * [AM2321]の湿度・温度 測定処理 * (Temperature = 温度データ , Humidity = 湿度データ) ' ********************************* (AM2321err = [AM2321]の通信状態) ' Am2321measure: ' ' * [AM2321]を休止状態から呼び覚ます * ' I2cstart 'I2Cバスを[スタート・コンディション]にする。 I2cwbyte &HB8 'スレーブ・アドレス(書き込み)を送信。 Waitus 800 'センサーを休止状態から呼び覚ますための待ち時間。 I2cstop 'I2Cバスを[ストップ・コンディション]にする。 ' ' * [AM2321]のレジスター・データ読み取り命令を送信する * ' I2cstart 'I2Cバスを[スタート・コンディション]にする。 I2cwbyte &HB8 'スレーブ・アドレス(書き込み)を送信。 I2cwbyte &H03 '機能コード [03] レジスター・データの読み取り。 I2cwbyte &H00 'レジスタの先頭アドレス。(湿度の上位バイト) I2cwbyte &H04 '読み出すレジスタの数。(湿度と温度の4バイト) I2cstop 'I2Cバスを[ストップ・コンディション]にする。 Waitus 1500 '機能命令を送信した後の待ち時間。 ' ' * [AM2321]のレジスター・データを受信する * ' I2cstart 'I2Cバスを[スタート・コンディション]にする。 I2cwbyte &HB9 'スレーブ・アドレス(読み込み)を送信。 Waitus 30 '読み取り動作前の待ち時間。 For Temp1 = 1 To 7 'データを受信する。 I2crbyte I2cbuff(temp1) , Ack Next Temp1 I2crbyte I2cbuff(8) , Nack I2cstop 'I2Cバスを[ストップ・コンディション]にする。 ' ' * 受信したデータから湿度・温度値を取り出す * ' Humidity = Makeint(i2cbuff(4) , I2cbuff(3)) '湿度値。(x0.1) Temperature = Makeint(i2cbuff(6) , I2cbuff(5)) '温度値。(x0.1) If Temperature.15 = 1 Then 'If 温度がマイナス値か? Then Reset Temperature.15 '温度の符号を消去する。 Temperature = 0 - Temperature '符号付16ビットの整数型に変換する。 End If Tempw1 = Makeint(i2cbuff(7) , I2cbuff(8)) '受信したCRCチェックサムの値。 ' ' * CRCチェックサムの計算 * ' Crcsum = &HFFFF For Temp1 = 1 To 6 '受信した6バイトについて計算する。 Crcsum = Crcsum Xor I2cbuff(temp1) For Temp2 = 1 To 8 Temp3 = Crcsum.0 Shift Crcsum , Right , 1 If Temp3 = 1 Then Crcsum = Crcsum Xor &HA001 End If Next Temp2 Next Temp1 ' Am2321err = 0 If Tempw1 <> Crcsum Then 'If CRCチェックサム エラーがあるか? Then Am2321err = 1 End If ' If I2cbuff(3) >= &H80 Then 'If エラーコードを受信したか? Then Am2321err = I2cbuff(3) End If ' ' * 最高値/最低値の確認 * ' If Am2321err = 0 Then 'If 受信エラーが無いか? Then 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 End If Return ' ' ********************************** ' * 気圧値を取得して移動平均をする * ' ********************************** ' Baravg: Gosub Baroconv '[MPL115A2]から気圧を取得し係数で補正する。 ' Avgsum = Avgsum - Average(avgpoi) '一番古いデータを減算する。 Average(avgpoi) = Tempw1 '移動平均バッファーに格納する。 Avgsum = Avgsum + Tempw1 '新しいデータを合算する。 ' Avgpoi = Avgpoi + 1 '移動平均ポインターを更新する。 If Avgpoi > 32 Then 'If ポインターが上限か? Then Avgpoi = 1 End If ' Tl1 = Avgsum Shift Tl1 , Right , 5 '32個の移動平均を取る。 Baropress = Tl1 '平均気圧値。 ' If Baromax < Baropress Then 'If 気圧の最高値を超えたか? Then Baromax = Baropress End If ' If Baromin > Baropress Then 'If 気圧の最低値を下回ったか? Then Baromin = Baropress End If Return ' ' ********************************** ' * [MPL115A2]の気圧変換と係数補正 * (Tempw1 = 気圧値[XXXX.XhPa] ※整数値で下1桁が小数点以下) ' ********************************** ' Baroconv: I2cbuff(1) = &H12 '[圧力と温度] 両方の変換開始コマンド。 I2cbuff(2) = &H01 'コマンドに続くダミーのデータ。 I2csend &HC0 , I2cbuff(1) , 2 'I2Cバスで、2バイトのデータを送信する。 ' Waitms 10 'MPL115Aの変換待ち時間。 ' ' * [圧力と温度]のデータを読み出す * ' I2cbuff(1) = &H00 '[圧力の上位バイト Padc MSB]のメモリー・アドレスを指定する。 I2creceive &HC0 , I2cbuff(1) , 1 , 4 'I2Cバスで、1バイトのコマンドを送信し、4バイトのデータを受信する。 ' ' * [圧力と温度]のA/D変換値をワードに変換し、下位10bitに移動する * ' Uipadc = Makeint(i2cbuff(2) , I2cbuff(1)) '圧力のA/D変換値(8bit)を16bitにまとめる。 Shift Uipadc , Right , 6 '下位10bitに移動させる。 ' Uitadc = Makeint(i2cbuff(4) , I2cbuff(3)) '温度のA/D変換値(8bit)を16bitにまとめる。 Shift Uitadc , Right , 6 '下位10bitに移動させる。 ' ' * 圧力のA/D変換値に係数を適用し補償する * ' Pcomp = a0 + (b1 + c12 * Tadc) * Padc + b2 * Tadc ' Tl1 = Sic12 'c12x2 = (((sint32)c12) * Tadc) >> 11; // c12x2 = c12 * Tadc Tl2 = Uitadc Tl2 = Tl1 * Tl2 Shift Tl2 , Right , 11 , Signed ' Tl1 = Sib1 'a1 = (sint32)b1 + c12x2; // a1 = b1 + c12x2 Tl2 = Tl1 + Tl2 ' Tl2 = Tl2 * Uipadc 'a1x1 = a1 * Padc; // a1x1 = a1 * Padc ' Tl1 = Sia0 'y1 = (((sint32)a0) << 10) + a1x1; // y1 = a0 + a1x1 Shift Tl1 , Left , 10 Tl2 = Tl1 + Tl2 ' Tl1 = Sib2 'a2x2 = (((sint32)b2) * Tadc) >> 1; // a2x2 = b2 * Tadc Tl1 = Tl1 * Uitadc Shift Tl1 , Right , 1 , Signed ' Tl1 = Tl2 + Tl1 'Pcomp =(y1 + A2x2) >> 9 ; / / Pcomp = Y1 + A2x2 Shift Tl1 , Right , 13 , Signed '小数点以下を切り捨てて整数にするために、13bit右シフト ' ' * 気圧値の計算 * ' 気圧値 = ((65.0 / 1023.0) * 圧力値) + 50 [kPa] = (圧力値 * 65000 + 51150000) / 1023 [Pa] ' Tl2 = Tl1 * 65000 Tl2 = Tl2 + 51150000 Tl2 = Tl2 / 10230 '[Pa]を[XXXX.XhPa]に変換する。 Tempw1 = Tl2 '※整数値で下1桁が小数点以下 Return ' ' ****************************************** ' * 気圧値24時間偏差を求めて天気を予報する * ' ****************************************** ' Weatherreport: Tempw1 = Dbuf(dbufpoi) '24時間前のデータを読み出す。 Dbuf(dbufpoi) = Baropress '最新の気圧値を格納する。 Dbufpoi = Dbufpoi + 1 '24時間のデータバッファーポインターを更新する。 If Dbufpoi > 24 Then 'If ポインターが上限か? Then Dbufpoi = 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 : '[天候変化無し] Temp1 = Weather End Select Weather = Temp1 '天気予報値。 ' Else '通電後24時間以上経過していない場合。 Weather = 0 End If ' Tbuf(tbufpoi) = Baropress '最新の気圧値を格納する。 Tbufpoi = Tbufpoi + 1 '48時間のデータバッファーポインターを更新する。 If Tbufpoi > 48 Then 'If ポインターが上限か? Then Tbufpoi = 1 End If Return ' ' *************************************************** ' * RTC-8564から、日時データを取り出す サブルーチン * ' *************************************************** ' Rtcread: I2cbuff(1) = &H02 '[02]:(秒)データのメモリー・アドレスを指定する。 I2creceive &HA2 , I2cbuff(1) , 1 , 7 'I2Cバスで、1バイトのコマンドを送信し、7バイトのデータを受信する。 ' Timebuf(1) = I2cbuff(1) And &H7F '[秒]データを保存する。 Timebuf(2) = I2cbuff(2) And &H7F '[分]データを保存する。 Timebuf(3) = I2cbuff(3) And &H3F '[時]データを保存する。 Timebuf(4) = I2cbuff(4) And &H3F '[日]データを保存する。 Timebuf(5) = I2cbuff(6) And &H1F '[月]データを保存する。 Timebuf(6) = I2cbuff(7) '[年]データを保存する。 Timebuf(7) = I2cbuff(5) And &H07 '[曜日]データを保存する。 Return ' ' *********************************************** ' * RTC-8564の時計機能を停止させる サブルーチン * ' *********************************************** ' Rtc8564stop: I2cbuff(2) = &B0010_0000 '時計機能 停止コマンド。 Rtc8564stp1: I2cbuff(1) = &H00 '[00]:(Control1)を選択。 I2csend &HA2 , I2cbuff(1) , 2 'I2Cバスで、2バイトのデータを送信する。 Return ' ' *********************************************** ' * RTC-8564の時計機能を始動させる サブルーチン * ' *********************************************** ' Rtc8564start: I2cbuff(2) = &B0000_0000 '時計機能 始動コマンド。 Goto Rtc8564stp1 ' ' ************************************ ' * RTC-8564を初期化するサブルーチン * ' ************************************ ' Rtc8564init: Gosub Rtc8564stop 'RTC-8564の時計機能を停止させる。 ' Restore Rtc8564dtt 'RTC-8564へ初期設定データを送信。 For Temp1 = 1 To 17 Read Temp2 I2cbuff(temp1) = Temp2 Next Temp1 I2csend &HA2 , I2cbuff(1) , 17 'I2Cバスで、17バイトのデータを送信する。 ' I2cbuff(1) = &H0E '[0E]:(Timer control)を選択。 I2cbuff(2) = &B1000_0010 '1秒割り込みを発生させる。 I2csend &HA2 , I2cbuff(1) , 2 'I2Cバスで、2バイトのデータを送信する。 Return ' ' **************** ' * 時刻設定処理 * ' **************** ' Timeset: Gosub Rtc8564stop 'RTC-8564の時計機能を停止させる。 Cls 'LCD表示を全消去する。 Timebuf(1) = 0 '[秒]を00にリセット。 Gosub Timesetds '時刻設定用の日時と時刻を表示する。 Locate 2 , 14 Lcd "End" Gosub Swoffchk 'スイッチが離されるのを待つ。 Cursor On , Blink 'LCDのカーソルをオン。 ' Timeset1: Restore Timesetdata Temp7 = 6 ' Timeset2: Read Temp3 'カーソル[Y]位置。 Read Temp4 'カーソル[X]位置。 Read Temp5 '設定値の下限値。 Read Temp6 '設定値の上限値。 Timeset3: Locate Temp3 , Temp4 '新しいカーソル位置へ移動。 ' Timeset4: Gosub Keychk 'キー入力を確認する。 If Keyflag <> 0 Then Keyflag = 0 If Keydata = &B0000_0001 Then Goto Timeset5 '[SW1]が押された場合。 If Keydata = &B0000_0010 Then Goto Timeset6 '[SW2]が押された場合。 End If Goto Timeset4 ' ' Timeset5: '[SW1]が押された。 If Temp7 = 0 Then Goto Timeset1 'If カーソル位置を最初に戻すか? Then Temp7 = Temp7 - 1 '設定項目を次へ。 Goto Timeset2 ' ' Timeset6: '[SW2]が押された。 If Temp7 = 0 Then Goto Timeset7 'If [End]の位置で押された(設定終了)か? Then ' Temp8 = Makedec(timebuf(temp7)) 'BCDを10進数の数値に変換。 Temp8 = Temp8 + 1 '設定値を加算する。 If Temp8 > Temp6 Then Temp8 = Temp5 'If 上限値を超えたか ? Then Timebuf(temp7) = Makebcd(temp8) '10進数の数値をBCD値に変換。 Gosub Timesetds '時刻設定用の日時と時刻を表示する。 Goto Timeset3 ' ' Timeset7: '秒の位置で押された(設定終了)。 Cursor Off , Noblink 'LCDのカーソルをオフ。 I2cbuff(1) = &H02 '[02]:(秒)データのメモリー・アドレスを指定する。 I2cbuff(2) = Timebuf(1) '[秒]データを保存する。 I2cbuff(3) = Timebuf(2) '[分]データを保存する。 I2cbuff(4) = Timebuf(3) '[時]データを保存する。 I2cbuff(5) = Timebuf(4) '[日]データを保存する。 I2cbuff(6) = Timebuf(7) '[曜日]データを保存する。 I2cbuff(7) = Timebuf(5) '[月]データを保存する。 I2cbuff(8) = Timebuf(6) '[年]データを保存する。 I2csend &HA2 , I2cbuff(1) , 8 'I2Cバスで、8バイトのデータを送信する。 Gosub Rtc8564start 'RTC-8564の時計機能を始動。 Return ' ' * 時刻設定用の日時と時刻を表示するサブルーチン * ' Timesetds: Locate 1 , 1 Lcd "20" ; Hex(timebuf(6)); '[年]を表示。 Lcd "/" ; Hex(timebuf(5)); '[月]を表示。 Lcd "/" ; Hex(timebuf(4)); '[日]を表示。 Gosub Weekdisp '年月日から曜日を計算して表示する。 Locate 2 , 3 Lcd Hex(timebuf(3)); '[時]を表示。 Lcd ":" ; Hex(timebuf(2)); '[分]を表示。 Lcd ":" ; Hex(timebuf(1)) '[秒]を表示。 Return ' ' ********************** ' * キー入力を確認する * (keyFlag = 1:キー入力有り , 2:リピート検出) ' ********************** (Keydata = キーデータ) ' Keychk: If Tifr.ocf0a = 0 Then Return 'If 10mS経過したか? Else Set Tifr.ocf0a 'Timer0 比較A一致フラグをリセット。 ' If Keycun = 0 Then Goto Keychk1 'If キー入力チェック開始か? Then If Keycun < 3 Then Goto Keychk5 'If チャタリング チェック期間か? Then If Keycun = 3 Then Goto Keychk3 'If キー入力再確認か? Then ' Gosub Keyport 'キーオフを確認する。 If Keydata <> Keytemp Then Goto Keychk4 'If キーオフか? Then If Keycun < 103 Then Goto Keychk5 'If リピート期間待ち(1Sec)か? Then Keyflag = 2 Keycun = 92 'リピートを開始。 Return ' ' Keychk1: 'キー入力チェック開始。 Gosub Keyport 'キー接続ポートからデータを入力。 If Keydata <> 0 Then Goto Keychk2 'If キー入力有りか? Then Keychk4: Keycun = 0 Return ' Keychk2: 'キー入力有り。 Keytemp = Keydata 'キー・データを一時保存。 Keychk5: Keycun = Keycun + 1 Return ' Keychk3: 'キー入力再確認。 Gosub Keyport 'キー接続ポートからデータを入力。 If Keydata <> Keytemp Then Goto Keychk4 'If キー入力エラーか? Then Keyflag = 1 Goto Keychk5 ' ' -------------------------------------------------- ' * キー接続ポートからデータを入力するサブルーチン * (Keydat = キー・データ) ' -------------------------------------------------- ' Keyport: Keydata = 0 If Sw_1 = 0 Then Set Keydata.0 'If [SW1]が押されているか? Then If Sw_2 = 0 Then Set Keydata.1 'If [SW2]が押されているか? Then Return ' ' End ' ' * RTC-8564 初期設定 データ・テーブル * ' Rtc8564dtt: Data &H00 'レジスターのスタートアドレス。 Data &B0010_0000 '[00] Control 1 Data &B0001_0001 '[01] Control 2 Data &H00 '[02] Seconds Data &H00 '[03] Minutes Data &H00 '[04] Hours Data &H01 '[05] Days Data &H00 '[06] Weekdays Data &H01 '[07] Months / Century Data &H14 '[08] Years Data &H00 '[09] Minute Alarm Data &H00 '[0A] Hour Alarm Data &H00 '[0B] Day Alarm Data &H00 '[0C] Weekday Alarm Data &B0000_0000 '[0D] CLKOUT frequency Data &B0000_0010 '[0E] Timer control Data &H01 '[0F] Timer ' ' * 曜日 データ・テーブル * ' Weekdata: Data "MON" , "TUE" , "WED" , "THU" , "FRI" , "SAT" , "SUN" ' ' * 時刻設定用の設定データテーブル * ' ' (Y位置 , X位置 , 下限値 , 上限値) ' Timesetdata: Data 1 , 3 , 0 , 99 '年 Data 1 , 6 , 1 , 12 '月 Data 1 , 9 , 1 , 31 '日 Data 2 , 3 , 0 , 23 '時 Data 2 , 6 , 0 , 59 '分 Data 2 , 9 , 0 , 59 '秒 Data 2 , 14 , 0 , 0 'End ' ' * 簡易気圧グラフのキャラクター・テーブル * ' Graphchr: Data &H06 , &H5F , &H05 , &H04 , &H2D , &H03 , &H02 , &H01 , &H5E , &H07