' ' ********************************************************** ' * * ' * プラズマ表示器 SPERRY SP-336 デジタル時計 プログラム * ' * * ' * AVR is using ATmega88 * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2009. 5. 5 * ' ********************************************************** ' ' Ver 1.01 初回公開バージョン ' ' Const Prgverh = 01 'プログラム・バージョン。(上位桁) Const Prgverl = 01 'プログラム・バージョン。(下位桁) ' ' $regfile = "m88def.dat" '使用するAVRを設定。 $crystal = 1000000 'AVRクロックを設定。 ' $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 8 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 ' ' * 変数の宣言 * ' Dim Dispmode As Byte '表示モード。 Dim Modetemp As Byte '表示モードの保管用。 Dim Mf1224h As Byte '時間表示モード 0=12時間制 / 1=24時間制 Dim Tempsec As Byte '[秒]更新用テンポラリ。 Dim Dpblken As Byte 'D.P点滅許可フラグ。 Dim Tim500ms As Byte '500mSタイマー。 Dim Tim100ms As Byte '100mSタイマー。 Dim Brightchf As Byte '表示の輝度変更フラグ。 Dim Keycun As Byte 'キー入力チェック用タイマーカウンター。 Dim Keyflg As Byte 'キー入力検出フラグ。 Dim Keydata As Byte 'キー入力データ。 Dim Keytemp As Byte 'キー入力用テンポラリ。 ' Dim Segdat1d As Byte 'プラズマ表示器[1]のPORTD DMA出力データ。 Dim Segdat1b As Byte 'プラズマ表示器[1]のPORTB DMA出力データ。 Dim Segdat2d As Byte 'プラズマ表示器[2]のPORTD DMA出力データ。 Dim Segdat2b As Byte 'プラズマ表示器[2]のPORTB DMA出力データ。 Dim Segdat3d As Byte 'プラズマ表示器[3]のPORTD DMA出力データ。 Dim Segdat3b As Byte 'プラズマ表示器[3]のPORTB DMA出力データ。 Dim Dmano As Byte 'DMAの表示番号。 ' 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 Tempsb1 As Byte '汎用変数サブルーチン用 Byte型 No.1 Dim Tempsb2 As Byte '汎用変数サブルーチン用 Byte型 No.2 Dim Tempsb3 As Byte '汎用変数サブルーチン用 Byte型 No.3 Dim Tempsb4 As Byte '汎用変数サブルーチン用 Byte型 No.4 Dim Tempsb5 As Byte '汎用変数サブルーチン用 Byte型 No.5 Dim Tempw1 As Word '汎用テンポラリ変数 Word型 No.1 ' Dim Eep1224h As Eram Byte At $10 'EEPROM 時間表示モード 0=12時間制 / 1=24時間制。 ' ' * ポート名の定義 * ' Seg_portd Alias Portd 'プラズマ表示器のセグメントを接続するポート。 Seg_portb Alias Portb 'プラズマ表示器のセグメントを接続するポート。 Plasma_dp Alias Portc.2 'プラズマ表示器[右]のDP端子を接続するポート。 Plasma_com1 Alias Portc.3 'プラズマ表示器[1]のコモン端子を接続するポート。 Plasma_com2 Alias Portc.4 'プラズマ表示器[2]のコモン端子を接続するポート。 Plasma_com3 Alias Portc.5 'プラズマ表示器[3]のコモン端子を接続するポート。 Ad_sw Alias 0 'スイッチを接続するA/Dコンバータのチャネル番号。 Ad_cds Alias 1 'CDSセンサーを接続するA/Dコンバータのチャネル番号。 ' ' * ポートの初期設定 * ' Config Seg_portd = Output 'プラズマ表示器のセグメント接続ポートを出力に設定。 Config Seg_portb = Output 'プラズマ表示器のセグメント接続ポートを出力に設定。 Config Plasma_dp = Output 'プラズマ表示器[右]のDP接続ポートを出力に設定。 Config Plasma_com1 = Output 'プラズマ表示器[1]のコモン端子接続ポートを出力に設定。 Config Plasma_com2 = Output 'プラズマ表示器[2]のコモン端子接続ポートを出力に設定。 Config Plasma_com3 = Output 'プラズマ表示器[3]のコモン端子接続ポートを出力に設定。 Didr0 = &B00000011 'デジタル入力禁止レジスタの設定。 Set Plasma_com1 '全ての桁のコモン信号をオフにする。 Set Plasma_com1 Set Plasma_com1 ' ' * Timer + ADC の設定 * ' Config Timer1 = Pwm , Prescale = 8 , Clear Timer = 1 '表示のDMA用 1,000,000Hz / 8 = 125,000Hz Set Tccr1a.wgm11 '高速PWMモード。 (TOP = OCR1A) Set Tccr1b.wgm13 Compare1a = 278 - 1 'スキャン周波数。(125,000Hz ÷ 278カウント = 450Hz) Compare1b = 100 - 1 'パルス幅 (明100〜暗250) 1カウントは8μS。(100=ブランキング時間) On Compare1a Tint1a 'TIMER1比較一致A割り込みルーチンのラベルを設定。 Enable Compare1a 'TIMER1比較一致A割り込みを許可。 On Compare1b Tint1b 'TIMER1比較一致B割り込みルーチンのラベルを設定。 Enable Compare1b 'TIMER1比較一致B割り込みを許可。 ' Config Timer0 = Timer , Prescale = 64 , Clear Timer = 1 '10mSタイマー 1,000,000Hz / 64 = 15,625Hz Ocr0a = 156 - 1 '15,625Hz / 156 = 100Hz (10mS) ' Config Adc = Single , Prescaler = Auto 'A/Dコンバータの設定。 Start Adc 'A/Dコンバータに電源を供給。 ' ' * 時計用のライブラリを組み込む * ' Config Clock = Soft '時計(Timer2を使用)をSoftモードに設定。 Config Date = Ymd , Separator = / '日付の表現方法(形式)を設定。 ' ' * EEPROMのデータを確認する * ' If Eep1224h > 1 Then Eep1224h = 1 'If EEPROMが初期値か? Then Mf1224h = Eep1224h '時間表示モード 0=12時間制 / 1=24時間制 ' ' * ポートと変数の初期設定 * ' Dmano = 1 'DMA表示番号の初期値。 Dispmode = 1 '表示モードの初期値。 Tempsec = 255 '1秒更新テンポラリの初期化。 Gosub Dispoffr '表示の右2桁を消灯する。 Gosub Dispoffm '表示の中2桁を消灯する。 Gosub Dispoffl '表示の左2桁を消灯する。 ' Enable Interrupts ' ' ******************************** ' * プログラム・バージョンを表示 * ' ******************************** ' Prgvds: Temp3 = 1 '点滅用F/F。 Prgvds3: Temp4 = 20 '点滅用200mSタイマー。 Prgvds1: If Tifr0.ocf0a = 0 Then Goto Prgvds1 'If 10mS経過したか? Else Set Tifr0.ocf0a 'Timer0 比較A一致フラグをリセット。 ' Gosub Keyport 'キー接続ポートからデータを入力する。 If Keydata = 1 Then Goto Prgvds2 'If [SW1]が押されたか? Then Temp4 = Temp4 - 1 If Temp4 <> 0 Then Goto Prgvds1 'If 点滅タイマー カウント終了か? Else ' If Temp3 = 1 Then 'If 点滅用F/Fが点灯か? Then Temp1 = Prgverl 'プログラム・バージョンの下位を表示。 Temp2 = &H01 '中桁を指定。 Gosub Binsegwr Temp1 = Prgverh 'プログラム・バージョンの上位を表示。 Temp2 = &H02 '左桁を指定。 Gosub Binsegwr Set Segdat3b.6 '5桁目に小数点を表示。 Temp3 = 0 Else Gosub Dispoffm '表示の中2桁を消灯する。 Gosub Dispoffl '表示の左2桁を消灯する。 Temp3 = 1 End If Goto Prgvds3 ' Prgvds2: Waitms 50 'チャタリング防止の待ち時間。 Gosub Keyoff 'キーが離されるまで待つ。 ' ' ******************* ' * メイン ルーチン * ' ******************* 'Main: Gosub Every10ms '10mSごとの処理を行う。(キーチェック) Gosub Dispbright '表示の輝度を調整する。 Gosub Dispren1s '1秒ごとに表示を更新する。 Gosub Keycont 'キー入力により表示を切り換える。 Goto Main ' ' ************************************************ ' * 10mSごとに処理を行うルーチン (キーチェック)* ' ************************************************ ' Every10ms: If Tifr0.ocf0a = 0 Then Return 'If 10mS経過したか? Else Set Tifr0.ocf0a 'Timer0 比較A一致フラグをリセット。 ' Tim500ms = Tim500ms + 1 '500mSタイマーを加算。 If Tim500ms = 50 Then 'If [D.P]点灯から500mS経過したか? Then If Dpblken = 1 Then 'If [D.P]の点滅が許可されているか? Then Reset Segdat2b.6 '3桁目の小数点を消灯。 Reset Segdat3b.6 '5桁目の小数点を消灯。 End If End If ' Tim100ms = Tim100ms + 1 '100mSタイマーを加算。 If Tim100ms = 10 Then 'If 100mS経過したか? Then Tim100ms = 0 Brightchf = 1 '100mSごとに表示の輝度調整をする。 End If ' ' * キー入力を確認する * (Keyflg = キー入力が有ると1) , (Keydata = キーデータ) ' Keychk: 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 Keyflg = 1 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 Keyflg = 1 Goto Keychk5 ' ' -------------------------------------------------- ' * キー接続ポートからデータを入力するサブルーチン * (Keydata = キー・データ) ' -------------------------------------------------- ' Keyport: Tempw1 = Getadc(ad_sw , &H20) 'スイッチ接続ポートをA/D変換する(8bit)。 Tempsb1 = High(tempw1) 'ワード型変数の上位を取り出し。 Select Case Tempsb1 Case 198 To 209 : Keydata = 1 '[SW1] Case 147 To 158 : Keydata = 2 '[SW2] Case 99 To 109 : Keydata = 3 '[SW3] Case 127 To 138 : Keydata = 4 '[SW1+SW2] Case 76 To 86 : Keydata = 5 '[SW2+SW3] Case 88 To 98 : Keydata = 6 '[SW1+SW3] Case Else : Keydata = 0 '上記以外の場合。 End Select Return ' ' ******************************* ' * 表示の輝度を調整するルーチン * ' ******************************* ' Dispbright: If Brightchf = 0 Then Return 'If 100mS経過したか? Else Brightchf = 0 ' Tempw1 = Getadc(ad_cds , &H20) 'CDSセンサーをA/D変換する(8bit)。 Temp1 = High(tempw1) '輝度の実測値 (暗25〜明250) ' Temp1 = Not Temp1 '輝度傾斜を反転する。 If Temp1 > 170 Then Temp1 = 170 'If パルス幅の上限を超えたか? Then If Temp1 < 20 Then Temp1 = 20 'If パルス幅の下限を超えたか? Then Compare1b = Temp1 + 79 'パルス幅を変更する。(ブランキング時間を加算) Return ' ' **************************************** ' * 1秒ごとに表示を更新するルーチン * ' **************************************** ' Dispren1s: If Tempsec = _sec Then Return 'If [秒]が更新されたか? Else Tempsec = _sec Tim500ms = 0 '500mSタイマーを初期化。 ' ' * 表示器に情報を表示する * ' Dispinfo: On Dispmode Goto Dimode0 , Dimode1 , Dimode2 , Dimode3 ' ' * MODE(0) 表示オフ * ' Dimode0: Gosub Dispoffr '表示の右2桁を消灯する。 Gosub Dispoffm '表示の中2桁を消灯する。 Gosub Dispoffl '表示の左2桁を消灯する。 Goto Dimode11 ' ' * MODE(1) [時・分・秒]を表示 * ' Dimode1: Temp1 = _sec '[秒]を表示。 Temp2 = &H00 '右桁を指定。 Gosub Binsegwr 'バイナリ値を2桁のセグメントコードに変換して表示する。 Temp1 = _min '[分]を表示。 Temp2 = &H01 '中桁を指定。 Gosub Binsegwr 'バイナリ値を2桁のセグメントコードに変換して表示する。 Temp1 = _hour '[時]を表示。 Temp2 = &H82 '左桁をゼロサプレスで指定。 Gosub Hourcvwr '時間を12/24時間制で識別して表示。 ' Dimode11: If Tim500ms < 50 Then 'If [D.P]点灯期間か? Then ' Set Segdat2b.6 '3桁目に小数点を表示。 Set Segdat3b.6 '5桁目に小数点を表示。 End If Dpblken = 1 '[D.P]の点滅を許可する。 Return ' ' * MODE(2) 8秒間[時・分・秒]、2秒間[年・月・日]を表示 * ' Dimode2: Temp1 = Makebcd(_sec) 'バイナリ値を、BCD(Binary coded decimal)値に変換。 Temp1 = Temp1 And &H0F '下位のBCDコードを取得。 If Temp1 < 8 Then Goto Dimode1 'If [秒]の下位が0-7? Then Goto Dimode3 ' ' * MODE(3) [年・月・日]を表示 * ' Dimode3: Temp1 = _day '[日]を表示。 Temp2 = &H80 '右桁をゼロサプレスで指定。 Gosub Binsegwr 'バイナリ値を2桁のセグメントコードに変換して表示する。 Temp1 = _month '[月]を表示。 Temp2 = &H81 '中桁をゼロサプレスで指定。 Gosub Binsegwr 'バイナリ値を2桁のセグメントコードに変換して表示する。 Temp1 = _year '[年]を表示。 Temp2 = &H02 '左桁を指定。 Gosub Binsegwr 'バイナリ値を2桁のセグメントコードに変換して表示する。 ' Set Segdat2b.6 '3桁目に小数点を表示。 Set Segdat3b.6 '5桁目に小数点を表示。 Dpblken = 0 '[D.P]の点滅を禁止する。 Return ' ' ****************************************** ' * キー入力により表示を切り換えるルーチン * ' ****************************************** ' Keycont: If Keyflg = 0 Then Return 'If キー入力が有ったか? Else Keyflg = 0 ' Select Case Keydata Case 1 : '[SW1]が押された場合。 If Dispmode = 0 Then 'If 表示モードが(0)か? Then Dispmode = Modetemp '消灯以前の状態に戻す。 Else Modetemp = Dispmode '表示を消灯する。 Dispmode = 0 End If Case 2 : '[SW2]が押された場合。 If Dispmode = 1 Then 'If 表示モードが(1)か? Then Dispmode = 2 '8秒間[時・分・秒]、2秒間[年・月・日]表示にする。 Else Dispmode = 1 '[時・分・秒]表示にする。 End If Case 3 : '[SW3]が押された場合。 Dispmode = 3 '[年・月・日]表示にする。 ' Case 4 : '[SW1+SW2]が押された場合。 Toggle Mf1224h.0 '時間表示モードを変更。 Eep1224h = Mf1224h 'EEPROMに保存。 Dispmode = 1 '[時・分・秒]表示にする。 ' Case 6 : '[SW1+SW3]が押された場合。 Goto Timset '時刻設定処理。 End Select Keycont1: Gosub Dispinfo '表示器に情報を表示する。 Return ' ' * 時刻設定 処理ルーチン * ' Timset: Disable Timer2 '1秒割り込みを禁止。 ' Temp1 = 20 '時刻設定モードに入ったことを表示する。 Temp2 = &H02 '左桁を指定。 Gosub Binsegwr 'バイナリ値を2桁のセグメントコードに変換して表示する。 Gosub Dispoffr '表示の右2桁を消灯する。 Gosub Dispoffm '表示の中2桁を消灯する。 Gosub Keyoff 'キーが離されるまで待つ。 ' Temp1 = _year '[年]の設定。 Temp2 = &H01 '中桁を指定。 Temp3 = 0 '設定値の下限。 Temp4 = 99 '設定値の上限。 Gosub Tmskey '時刻設定用のキー入力処理。 _year = Temp1 ' Temp1 = _day '[月]の設定。 Temp2 = &H81 '中桁をゼロサプレスで指定。 Gosub Binsegwr 'バイナリ値を2桁のセグメントコードに変換して表示する。 Temp1 = _month Temp2 = &H82 '左桁をゼロサプレスで指定。 Temp3 = 1 '設定値の下限。 Temp4 = 12 '設定値の上限。 Gosub Tmskey '時刻設定用のキー入力処理。 _month = Temp1 ' Temp1 = _month '[日]の設定。 Temp2 = &H82 '左桁をゼロサプレスで指定。 Gosub Binsegwr 'バイナリ値を2桁のセグメントコードに変換して表示する。 Temp1 = _day Temp2 = &H81 '中桁をゼロサプレスで指定。 Temp4 = Lookup(_month , Monthtab) '月による設定値の上限を取得する。 If _month = 2 Then 'If 2月か? Then Temp3 = _year And &H03 '閏年の確認。 If Temp3 = 0 Then 'If 閏年か? Then Temp4 = 29 End If End If Temp3 = 1 '設定値の下限。 Gosub Tmskey '時刻設定用のキー入力処理。 _day = Temp1 ' Temp1 = _min '[時]の設定。 Temp2 = &H01 '中桁を指定。 Gosub Binsegwr 'バイナリ値を2桁のセグメントコードに変換して表示する。 Temp1 = _hour Temp2 = &HC2 '左桁をゼロサプレスで指定。 Temp3 = 0 '設定値の下限。 Temp4 = 23 '設定値の上限。 Gosub Tmskey '時刻設定用のキー入力処理。 _hour = Temp1 ' Temp1 = _hour '[分]の設定。 Temp2 = &H82 '左桁をゼロサプレスで指定。 Gosub Hourcvwr '時間を12/24時間制で識別して表示。 Temp1 = _min Temp2 = &H01 '中桁を指定。 Temp3 = 0 '設定値の下限。 Temp4 = 59 '設定値の上限。 Gosub Tmskey '時刻設定用のキー入力処理。 _min = Temp1 ' _sec = 0 '[秒]をリセット。 Enable Timer2 '1秒割り込みを許可。 Dispmode = 1 '[時・分・秒]表示にする。 Goto Keycont1 ' ' ------------------------------------ (Temp1 = 設定するデータ値) ' * 時刻設定用 キー入力 サブルーチン * (Temp2 = 設定するデータの桁位置) ' ------------------------------------ (Temp3 = 設定値の下限) ' (Temp4 = 設定値の上限) Tmskey: Temp5 = 1 '点滅用 F/F。 Temp6 = 1 '点滅用タイマー値。 ' Tmskey1: If Tifr0.ocf0a = 0 Then Goto Tmskey1 'If 10mS経過したか? Else Set Tifr0.ocf0a 'Timer0 比較A一致フラグをリセットする。 ' Gosub Keychk 'キー入力を確認する。 If Keyflg <> 0 Then Goto Tmskey2 'If キー入力が有りか? Then ' Temp6 = Temp6 - 1 '表示を点滅させる。 If Temp6 <> 0 Then Goto Tmskey1 'If 点滅タイマー カウント終了か? Else If Temp5 = 0 Then '点滅用 F/Fを反転する。 Temp5 = 1 Temp6 = 20 '点滅用のタイマー値。 If Temp2.0 = 1 Then 'If 中桁を設定中か? Then Gosub Dispoffm '表示の中2桁を消灯する。 Else Gosub Dispoffl '表示の左2桁を消灯する。 End If Else Temp5 = 0 Temp6 = 40 '点滅用のタイマー値。 If Temp2.6 = 1 Then 'If [時]表示か? Then Gosub Hourcvwr '時間を12/24時間制で識別して表示する。 Else Gosub Binsegwr 'バイナリ値を2桁のセグメントコードに変換して表示する。 End If End If Goto Tmskey1 ' ' Tmskey2: Keyflg = 0 'キー入力フラグをリセットする。 If Keydata = 1 Then Goto Tmskey5 'If [SW1]が押されたか? Then If Keydata = 2 Then Goto Tmskey3 'If [SW2]が押されたか? Then If Keydata = 3 Then Goto Tmskey4 'If [SW3]が押されたか? Then Goto Tmskey1 ' ' Tmskey3: '[SW2] 設定値を加算。 Temp1 = Temp1 + 1 If Temp1 > Temp4 Then Temp1 = Temp3 'If 設定値が上限を超えたか? Then Goto Tmskey ' Tmskey4: '[SW3] 設定値を減算。 If Temp1 = Temp3 Then 'If 設定値が下限を超えるか? Then Temp1 = Temp4 Else Temp1 = Temp1 - 1 End If Goto Tmskey ' Tmskey5: '[SW1] 設定終了。 Gosub Keyoff 'キーが離されるまで待つ。 Return ' ' -------------------------------------- ' * キーが離されるまで待つサブルーチン * ' -------------------------------------- ' Keyoff: Gosub Keyport 'キー接続ポートからデータを入力。 If Keydata <> 0 Then Goto Keyoff 'If キーが離されたか? Else Waitms 100 Return ' ' --------------------------------------------- ' * バイナリ値を2桁のセグメントコードに変換し * (Temp1 = バイナリ・データ) ' * 表示するサブルーチン * (Temp2 = 0 : 右桁 , 1 : 中桁 , 2 : 左桁) ' --------------------------------------------- (Temp2.7 = 0 : ゼロサプレスなし , 1 : ゼロサプレス有り) ' Binsegwr: Tempsb1 = Makebcd(temp1) 'バイナリ値を、BCD(Binary coded decimal)値に変換。 Tempsb2 = Tempsb1 And &H0F '下位のBCDコードを取得。 Tempsb3 = Lookup(tempsb2 , Segtab1) '数値をセグメントコードへ変換する。 ' Tempsb2 = Tempsb1 And &HF0 '上位のBCDコードを取得。 Shift Tempsb2 , Right , 4 '下位へ移動する。 Tempsb4 = Lookup(tempsb2 , Segtab2) '数値をセグメントコードへ変換する。 ' If Temp2.7 = 1 Then 'If ゼロサプレス有りか? Then If Tempsb2 = 0 Then 'If 上位桁が0か? Then Tempsb4 = 0 '上位桁を消灯する。 End If End If ' Tempsb2 = Tempsb4 And &B10000000 '[PD7]用のビットを移行する。 Tempsb3 = Tempsb3 Or Tempsb2 ' Tempsb1 = Temp2 And &H0F Select Case Tempsb1 Case 0 : '[右桁] Segdat1d = Tempsb3 '[PORT D]のデータを書き込む。 Segdat1b = Tempsb4 '[PORT B]のデータを書き込む。 Case 1 : '[中桁] Segdat2d = Tempsb3 '[PORT D]のデータを書き込む。 Segdat2b = Tempsb4 '[PORT B]のデータを書き込む。 Case Else '[左桁] Segdat3d = Tempsb3 '[PORT D]のデータを書き込む。 Segdat3b = Tempsb4 '[PORT B]のデータを書き込む。 End Select Return ' ' ------------------------------------------ ' * 時間 12/24時間制 識別表示 サブルーチン * (Temp1 = バイナリ・データ) ' ------------------------------------------ ' Hourcvwr: If Mf1224h = 1 Then 'If 24時間制か? Then Gosub Binsegwr '24時間制で表示する。 Else '12時間制表示。 Tempsb5 = Temp1 '24時間制時刻を12時間制に変換する。 If Temp1 = 0 Then Temp1 = 24 If Temp1 > 12 Then Temp1 = Temp1 - 12 Gosub Binsegwr 'バイナリ値を2桁のセグメントコードに変換して表示する。 Temp1 = Tempsb5 ' If Temp1 < 12 Then 'If AM or PM? Set Segdat3b.3 '[AM] セグメントを点灯する。 Else Set Segdat3b.5 '[PM] セグメントを点灯する。 End If End If Return ' ' -------------------------------------- ' * 表示の右2桁を消灯するサブルーチン * ' -------------------------------------- ' Dispoffr: Segdat1d = 0 Segdat1b = 0 Return ' ' -------------------------------------- ' * 表示の中2桁を消灯するサブルーチン * ' -------------------------------------- ' Dispoffm: Segdat2d = 0 Segdat2b = 0 Return ' ' -------------------------------------- ' * 表示の左2桁を消灯するサブルーチン * ' -------------------------------------- ' Dispoffl: Segdat3d = 0 Segdat3b = 0 Return ' ' *************************************** ' * TIMER1 比較一致(B) 割り込みルーチン * ' *************************************** ' Tint1b: Select Case Dmano 'DMA表示番号により、桁ごとのセグメントデータをセットする。 Case 1 : Seg_portd = Segdat1d '[PORT D]に出力するセグメントデータをセットする。 Seg_portb = Segdat1b '[PORT B]に出力するセグメントデータをセットする。 If Segdat1b.6 = 0 Then 'If [D.P]が消灯か? Then Reset Plasma_dp '[D.P]を消灯。 Else Set Plasma_dp '[D.P]を点灯。 End If Reset Plasma_com1 'プラズマ表示器[1]のコモン信号をアクティブにする。 Dmano = 2 Case 2 : Seg_portd = Segdat2d '[PORT D]に出力するセグメントデータをセットする。 Seg_portb = Segdat2b '[PORT B]に出力するセグメントデータをセットする。 If Segdat2b.6 = 0 Then 'If [D.P]が消灯か? Then Reset Plasma_dp '[D.P]を消灯。 Else Set Plasma_dp '[D.P]を点灯。 End If Reset Plasma_com2 'プラズマ表示器[2]のコモン信号をアクティブにする。 Dmano = 3 Case 3 : Seg_portd = Segdat3d '[PORT D]に出力するセグメントデータをセットする。 Seg_portb = Segdat3b '[PORT B]に出力するセグメントデータをセットする。 If Segdat3b.6 = 0 Then 'If [D.P]が消灯か? Then Reset Plasma_dp '[D.P]を消灯。 Else Set Plasma_dp '[D.P]を点灯。 End If Reset Plasma_com3 'プラズマ表示器[3]のコモン信号をアクティブにする。 Dmano = 1 End Select Return ' ' *************************************** ' * TIMER1 比較一致(A) 割り込みルーチン * ' *************************************** ' Tint1a: Set Plasma_com1 '全ての桁のコモン信号をオフする。 Set Plasma_com2 Set Plasma_com3 Return ' ' End ' ' ************************************************* ' * 数値からセグメントコードへの変換テーブル * ' ************************************************* ' Segtab1: '[PORT D]用 Data &B01111101 '0 Data &B00110000 '1 Data &B00101111 '2 Data &B00111011 '3 Data &B01110010 '4 Data &B01011011 '5 Data &B01011111 '6 Data &B00110001 '7 Data &B01111111 '8 Data &B01111011 '9 ' Segtab2: '[PORT B]用 Data &B10101111 '0 Data &B10000010 '1 Data &B00110111 '2 Data &B10010111 '3 Data &B10011010 '4 Data &B10011101 '5 Data &B10111101 '6 Data &B10000110 '7 Data &B10111111 '8 Data &B10011111 '9 ' ' ************************************ ' * 月ごとの最終日を取得するテーブル * ' ************************************ ' Monthtab: Data 0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31