' ' LED DOTMATIX CONTROL for SLX-8100 ' ' PIC-BASIC Dot Matrix Watch by T.AZAMI 2008/05 ' ' Ver 03 とりあえず データを書き込んで表示できるレベルになった。 '  書き込みのタイミングもOKのようである ' Ver 04 数値表示ができた、LOOKUPがうまくない。 ' 各配列に直接代入すれば表示する。 ' Ver 05 時計の数字表示ができる。 ' 配列を大きくするとメモリ不足エラーとなる ' Ver 06 EEPROMにフォントデータを置き、それを利用する。 ' Ver 08 かなり表示ができるようになった。表示だけなら完成か? ' Ver 10 RTCのルーチンを搭載、時刻表示ができるようになる。 ' Ver 11 時刻設定のルーチンを搭載、まだ時刻設定がうまく動作しない ' どうしても曜日がRTCより読み出せない、原因不明 ' Ver 12 曜日を計算により求めた・・・good!! ' Ver 13 12/24時間表示を切り替えられるようにし、全体のサブルーチンを整理した。 ' プロトタイプ 完成! ' Ver 20 EEPROMへのキャラクタデータ書き込みを統合、最終形式完成 'RTC関係変数 Dim a As Byte,b As Byte,c As Byte,d As Byte,e As Byte Dim RTC_ad As Byte 'RTC_ad=RTC用アドレス Dim RTC_td As Byte 'RTC_td=RTC用データ Dim Min, Hour, Year, Day, Month, Weekday As Byte 'LED関係変数 Dim DRAM_A(14) As Long 'Data RAM A 32bit中24bit使用 Dim DRAM_B(14) As Long Dim Font(14) As Byte 'フォント格納用変数 8bit 14行 Dim DRAM_temp As Long Dim Col, Ram_Start_Address, Ram_End_Address As Byte Dim B_shift As Byte 'その他変数 Dim i ,j, k As Byte Dim AmPm, Min_Prev, Style As Byte Start: '初期設定 Gosub EEPROM_write Debug "Write EEPROM Done" '---------------------------------------------------------- '入出力ポート定義 Input RC.Bit2 'Set SW Input RC.Bit3 'Up SW Input RC.Bit4 'Down Sw Output RC.Bit5 'LED '---------------------------------------------------------- 'RTCの諸設定 High RC.Bit0 'SCLをHI(I2Cバスの初期状態はSCL,SDAともHIであるため) High RC.Bit1 'SDAをHI Output RC.Bit1 'RC.1(SDA)を出力に設定 Output RC.Bit0 'RC.0(SCL)を出力に設定 Sleep 10 RTC_ad = &H02 'VL(電圧低下)ビット調査 Gosub RTC_load If a & &H80 = &H80 Then Debug "LV -> RTC init Gosub RTC_init Endif RTC_ad = &h0F '定周期タイマ用ダウンカウンタ設定 RTC_td = &B00000001 '1秒間隔でINT出力につないだLEDを光らせるため Gosub RTC_tset RTC_ad = &h01 RTC_td = &B00010001 '繰り返しモード Gosub RTC_tset RTC_ad = &H0E RTC_td = &B10000010 '1Hz周期で開始 Gosub RTC_tset '---------------------------------------------------------- 'LED関係 諸設定 'Disp_Init:ディスプレイ制御端子初期設定 RA = &H00 RD = &H00 TRIS_RA = 0 Low RD.Bit0 Low RD.Bit1 Low RD.Bit2 'PG0 Low RD.Bit3 'PG1 TRIS_RD = 0 Low RE.Bit0 Low RE.Bit1 Low RE.Bit2 Output RE.Bit0 'WR Output RE.Bit1 'CS Output RE.Bit2 'CLK Style = 12 '12:12時間表示 24:24時間表示 '-------------------------------------------------------------------- ' 時刻表示メインループ '-------------------------------------------------------------------- Main_1: '時刻設定後はここに戻る Gosub Get_Time 'RTCの現在値を取得 Min_Prev = Min Gosub Disp_RAM_Clear 'LEDディスプレイRAMクリア Gosub Disp_Page_Change Gosub Disp_RAM_Clear Gosub Disp_Time '時刻の表示 Gosub Disp_Date '月/日の表示 Gosub Disp_Page_Change '表示RAMの切替 Main_Loop: Gosub Get_Time 'RTCより時刻取得 If RC.Bit2 = 0 Then 'SET SW なら時刻設定ルーチンへ Sleep 50 If RC.Bit2 = 0 Then Goto Tset_main Endif If (Min - Min_Prev) = 0 Then '1分たったかどうかを判断 Goto Main_Loop Endif 'Debug "Year=",Year 'デバック時のRTCデータ確認用 'Debug "Mon =",Month 'Debug "Day=",Day 'Debug "WKD=",Weekday 'Debug "H =",Hour 'Debug "M =",Min 'Debug " " Min_Prev = Min Gosub Disp_Time '時刻の表示 Gosub Disp_Date '月/日の表示 Gosub Disp_Page_Change '表示RAMの切替 Goto Main_Loop '以上繰り返し−>メインループへ End '-------------------------------------------------------------------- ' 時刻表示ルーチン 時間を 変数 Hour, Min に入れて呼び出す '-------------------------------------------------------------------- Disp_Time: Gosub DRAM_Clear Debug "Disp_time" 'RAM_A 1桁目 −AM/PM− If Style = 24 Then Goto Disp_Time1 '12時間表示の場合、先頭にAM/PMをつける If Hour < 12 Then Gosub CharB_Am B_shift = 18 'シフトするビット数 Gosub Disp_Time_RAM_A '表示用変数にセット Else Gosub CharB_Pm B_shift = 18 'シフトするビット数 Gosub Disp_Time_RAM_A '表示用変数にセット Hour = Hour - 12 '12時間表示用に数値を計算 Endif Disp_Time1: 'RAM_A 2桁目 −時間10の位− If Hour / 10 > 0 Then '1桁目がゼロ以外の場合 k = Hour / 10 '数値に対応したビットマップデータをFont(n)変数に読み込む Read (k * 14),Font(0),Font(1),Font(2),Font(3),Font(4),Font(5),Font(6),Font(7),Font(8),Font(9),Font(10),Font(11),Font(12),Font(13) Else For i = 0 To 13 'ゼロならLED消灯にする Font(i) = 0 Next Endif B_shift = 10 Gosub Disp_Time_RAM_A 'RAM_A 3桁目 −時間1の位− k=Hour Mod 10 Read (k * 14),Font(0),Font(1),Font(2),Font(3),Font(4),Font(5),Font(6),Font(7),Font(8),Font(9),Font(10),Font(11),Font(12),Font(13) B_shift = 0 Gosub Disp_Time_RAM_A 'RAM_B 1桁目 −コロン− Gosub CharB_Dot B_shift = 18 Gosub Disp_Time_RAM_B 'RAM_B 2桁目 −分10の位− k = Min / 10 Read (k * 14),Font(0),Font(1),Font(2),Font(3),Font(4),Font(5),Font(6),Font(7),Font(8),Font(9),Font(10),Font(11),Font(12),Font(13) B_shift = 10 Gosub Disp_Time_RAM_B 'RAM_B 3桁目 −分1の位− k = Min Mod 10 Read (k * 14),Font(0),Font(1),Font(2),Font(3),Font(4),Font(5),Font(6),Font(7),Font(8),Font(9),Font(10),Font(11),Font(12),Font(13) B_shift = 0 Gosub Disp_Time_RAM_B Ram_Start_Address = 10 Ram_End_Address = 23 Gosub Write_DRAM Return 'RAM A 変数上の表示位置にビットマップをセット Disp_Time_RAM_A: For Col = 0 To 13 DRAM_temp = Font(Col) DRAM_temp = DRAM_temp << B_shift DRAM_A(Col) = DRAM_A(Col) | DRAM_temp Next Return 'RAM B 変数上の表示位置にビットマップをセット Disp_Time_RAM_B: For Col = 0 To 13 DRAM_temp = Font(Col) DRAM_temp = DRAM_temp << B_shift DRAM_B(Col) = DRAM_B(Col) | DRAM_temp Next Return '-------------------------------------------------------------------- ' 月日表示ルーチン 変数 Day, Weekday,Month, Year に入れて呼び出す '-------------------------------------------------------------------- Disp_Date: 'Gosub DRAM_Clear '変数をクリアする 'RAM_A 1桁目 -月10の位- If Month / 10 > 0 Then 'ゼロならLED消灯にする k = Month / 10 '数値に対応したビットマップデータをFont(n)変数に読み込む Read (k * 7 + 140),Font(0),Font(1),Font(2),Font(3),Font(4),Font(5),Font(6),Font(7) Else For i = 0 To 7 Font(i) = 0 Next Endif B_shift = 18 Gosub Disp_Date_RAM_A 'RAM_A 2桁目 -月1の位- k=Month Mod 10 Read (k * 7 + 140),Font(0),Font(1),Font(2),Font(3),Font(4),Font(5),Font(6),Font(7) B_shift = 13 Gosub Disp_Date_RAM_A 'RAM_A 3桁目 -スラッシュ- Gosub CharB_Slash B_shift = 7 Gosub Disp_Date_RAM_A 'RAM_A 4桁目 -日10の位- k = Day / 10 Read (k * 7 + 140),Font(0),Font(1),Font(2),Font(3),Font(4),Font(5),Font(6),Font(7) B_shift = 0 Gosub Disp_Date_RAM_A 'RAM_B 1桁目 -日1の位-  k = Day Mod 10 Read (k * 7 + 140),Font(0),Font(1),Font(2),Font(3),Font(4),Font(5),Font(6),Font(7) B_shift = 18 Gosub Disp_Date_RAM_B 'RAM_B 2桁目曜日 If Weekday = 0 Then '日曜日の場合 Gosub CharB_Nichi Else k=Weekday '数値に対応したビットマップデータをFont(n)変数に読み込む Read (k * 7 + 203),Font(0),Font(1),Font(2),Font(3),Font(4),Font(5),Font(6),Font(7) Endif B_shift = 4 Gosub Disp_Date_RAM_B Ram_Start_Address = 0 Ram_End_Address = 7 Gosub Write_DRAM Return Disp_Date_RAM_A: For Col = 0 To 6 DRAM_temp = Font(Col) DRAM_temp = DRAM_temp << B_shift DRAM_A(Col) = DRAM_A(Col) | DRAM_temp Next Return Disp_Date_RAM_B: For Col = 0 To 6 DRAM_temp = Font(Col) DRAM_temp = DRAM_temp << B_shift DRAM_B(Col) = DRAM_B(Col) | DRAM_temp Next Return '-------------------------------------------------------------------- ' データ作成用変数のクリア '-------------------------------------------------------------------- DRAM_Clear: For Col = 0 To 13 DRAM_A(Col) = &H00 DRAM_B(Col) = &H00 Font(Col) = &H00 Next Return '-------------------------------------------------------------------- ' 表示用RAMにキャラクタデータを書き込むルーチン ' 表示開始行と終了行を 変数 Ram_Start_Address, Ram_End_Address に指定 ' 1行24ビット分のデータ 右ページを DRAM_B(n), 左ページを DRAM_A(n)に入れる '-------------------------------------------------------------------- Write_DRAM: For Col = Ram_Start_Address To Ram_End_Address i = Col - Ram_Start_Address '半ページ 1行24ビット分のシリアルデータを転送 For j = 0 To 23 If DRAM_A(i) Mod 2 = 1 Then 'RAM A シリアルデータビットのセット High RD.Bit1 Else Low RD.Bit1 Endif DRAM_A(i) = DRAM_A(i) / 2 '1ビット右シフト If DRAM_B(i) Mod 2 = 1 Then 'RAM B シリアルデータビットのセット High RD.Bit0 Else Low RD.Bit0 Endif DRAM_B(i) = DRAM_B(i) / 2 '1ビット右シフト 'Sleep 2 High RE.Bit2 '読み込み用クロックパルス 'Sleep 2 Low RE.Bit2 'Sleep 2 Next j Toggle RC.Bit5 '確認LED点滅 RA = Col 'ポートRAに書き込むアドレスをセット High RE.Bit0 'CS(ALE)をHiに 'Sleep 2 High RE.Bit1 'WR(WE)をHiに 'Sleep 2 Low RE.Bit1 'アドレスがラッチされ、転送されたデータが書き込まれる Low RE.Bit0 Next Col Return '---------------------------------------------------------- ' LED表示RAM切替 '---------------------------------------------------------- Disp_Page_Change: Toggle RD.Bit2 Sleep 5 Return '---------------------------------------------------------- ' LED内の表示RAMクリアとRAM変数クリア '---------------------------------------------------------- Disp_RAM_Clear: For i = 0 To 13 DRAM_A(i)=0 DRAM_B(i)=0 Next Ram_Start_Address = 0 Ram_End_Address = 13 Gosub Write_DRAM Ram_Start_Address = 14 Ram_End_Address = 23 Gosub Write_DRAM Return '-------------------------------------------------------------------- ' 時刻設定メインループ '-------------------------------------------------------------------- Tset_main: Gosub Disp_RAM_Clear 'LEDディスプレイクリア Gosub Disp_Page_Change Gosub Disp_RAM_Clear d = 1 'd : 現在のファンクション Gosub Tset_disp Tset_loop: If RC.Bit3 = 0 Then 'up SW Sleep 100 If RC.Bit3 = 0 Then 'チャタリング除去 If d = 1 Then 'Year Year = Year + 1 If Year = 100 Then Year = 1 Gosub Tset_disp Endif If d = 2 Then 'Month Month = Month + 1 If Month = 13 Then Month = 1 Gosub Tset_disp Endif If d = 3 Then 'Day Day = Day + 1 If Day = 32 Then Day = 1 Gosub Tset_disp Endif If d = 4 Then 'Hour Hour = Hour + 1 If Hour = 25 Then Hour = 0 Gosub Tset_disp Endif If d = 5 Then 'Min Min = Min + 1 If Min = 60 Then Min = 0 Gosub Tset_disp Endif If d = 6 Then '表示形式 12/24 If Style = 12 Then Style = 24 Gosub Tset_disp Endif Endif Endif If RC.Bit4 = 0 Then 'down SW Sleep 100 If RC.Bit4 = 0 Then If d = 1 Then 'Year If Year = 0 Then Year = 100 Year = Year -1 Gosub Tset_disp Endif If d = 2 Then 'Month If Month = 1 Then Month = 13 Month = Month - 1 Gosub Tset_disp Endif If d = 3 Then 'Day If Day = 1 Then Day = 32 Day = Day - 1 Gosub Tset_disp Endif If d = 4 Then 'Hour If Hour = 1 Then Hour = 25 Hour = Hour - 1 Gosub Tset_disp Endif If d = 5 Then 'Min If Min = 0 Then Min = 60 Min = Min - 1 Gosub Tset_disp Endif If d = 6 Then '表示形式 12/24 If Style = 24 Then Style = 12 Gosub Tset_disp Endif Endif Endif If RC.Bit2 = 0 Then 'set SW が押された時の処理 Sleep 100 If RC.Bit2 = 0 Then d = d + 1 If d = 7 Then '全てのファンクションが終了したらRTCへのデータ書き込み Gosub Disp_RAM_Clear 'LEDディスプレイクリア Gosub Disp_Page_Change RTC_ad = &H08 RTC_td = (Year/10)*16+(Year Mod 10) Gosub RTC_tset RTC_ad = &H07 RTC_td = (Month/10)*16+(Month Mod 10) Gosub RTC_tset RTC_ad = &H05 RTC_td = (Day/10)*16+(Day Mod 10) Gosub RTC_tset RTC_ad = &H04 RTC_td = (Hour/10)*16+(Hour Mod 10) Gosub RTC_tset RTC_ad = &H03 RTC_td = (Min/10)*16+(Min Mod 10) Gosub RTC_tset Goto Main_1 '時刻表示に戻る Endif Gosub Tset_disp Endif Endif Goto Tset_loop ' 時刻設定表示ルーチン Tset_disp: If d = 1 Then Gosub CharB_Nen i = Year Endif If d = 2 Then Read (210),Font(0),Font(1),Font(2),Font(3),Font(4),Font(5),Font(6),Font(7) i = Month Endif If d = 3 Then Gosub CharB_Nichi i = Day Endif If d = 4 Then Gosub CharB_Ji i = Hour Endif If d = 5 Then Gosub CharB_Fun i = Min Endif If d = 6 Then Gosub CharB_Slash '12/24時間表示の切替時は タイトルがスラッシュ i = Style Endif For Col = 0 To 6 'DRAM_A(n) 変数上の表示位置にビットマップをセット DRAM_temp = Font(Col) DRAM_A(Col) = DRAM_temp << 15 'データを18ビットシフトする Next k=i / 10 Read (k * 7 + 140),Font(0),Font(1),Font(2),Font(3),Font(4),Font(5),Font(6),Font(7) For Col = 0 To 6 DRAM_temp = Font(Col) DRAM_temp = DRAM_temp << 6 'データを7ビットシフトする DRAM_A(Col) = DRAM_A(Col) | DRAM_temp Next k=i Mod 10 Read (k * 7 + 140),Font(0),Font(1),Font(2),Font(3),Font(4),Font(5),Font(6),Font(7) For Col = 0 To 6 DRAM_A(Col) = DRAM_A(Col) | Font(Col) DRAM_B(Col) = 0 Next Ram_Start_Address = 0 Ram_End_Address = 7 Gosub Write_DRAM Gosub Disp_Page_Change Return '==================================================================== ' RTCよりの時刻取得ルーチン '==================================================================== Get_Time: RTC_ad = &H03 '分のアドレス設定 Gosub RTC_load Min = a Min =((&B01111111&Min)/16)*10+Min Mod 16 '分のBCD形式から10進へ変換と不要ビットのマスク処理 RTC_ad = &H04 '時のアドレス設定 Gosub RTC_load Hour = a Hour =((&B00111111&Hour)/16)*10+Hour Mod 16 'AmPm = 0 'If Hour > 12 Then ' AmPm = 1 ' Hour = Hour - 12 'Endif RTC_ad = &H08 '年のアドレス設定 Gosub RTC_load Year = a Year =(Year/16)*10+Year Mod 16 RTC_ad = &H07 '月のアドレス設定 Gosub RTC_load Month = a Month =((&B00011111&Month)/16)*10+Month Mod 16 RTC_ad = &H05 '日のアドレス設定 Gosub RTC_load Day = a Day =((&B00111111&Day)/16)*10+Day Mod 16 'RTC_ad = &H06 '曜日のアドレス設定 ' Gosub RTC_load ' 'Weekday = a ' Weekday =&B00000111 & a 'Debug "a=",a begin: '計算により曜日を求める If(Month = 1) Or (Month = 2) Then Year = Year-1 Month=Month+12 Endif Weekday = (Year+(Year/4)-(Year/100)+(Year/400)+((13*Month+8)/5)+Day) Mod 7 Return '==================================================================== ' RTC制御 サブルーチン '==================================================================== 'RTCからのデータ取り込み RTC_load: Gosub ss '開始条件送出 a = &B10100010 'RTCのスレーブアドレスおよびWビット(書き込み)をaに入れる Gosub dout 'RTCへ送出 Gosub ack 'アクノリッジの確認 a = RTC_ad '読み込むデータのアドレス(ad)をaに入れる Gosub dout 'RTCへ送出 Gosub ack 'アクノリッジの確認 Gosub ss '再度開始条件送出 a = &B10100011 'RTCのスレーブアドレスおよびRビット(読み込み)をaに入れる Gosub dout 'RTCへ送出 Gosub ack 'アクノリッジの確認 Gosub din 'RTCよりデーターを受け取る(この時点でaにデータが入る) Gosub nack 'ノンアクノリッジの送出 Gosub ee '終了条件送出 Return 'RTCへのデータ書き込み RTC_tset: Gosub ss '開始条件送出 a = &B10100010 'RTCのスレーブアドレスおよびWビット(書き込み)をaに入れる Gosub dout 'RTCへ送出 Gosub ack 'アクノリッジの確認 a = RTC_ad '書き込むデータのアドレス(ad)をaに入れる Gosub dout 'RTCへ送出 Gosub ack 'アクノリッジの確認 a = RTC_td '書き込みデータをaに入れる Gosub dout 'RTCへ送出 Gosub ack 'アクノリッジの確認 Gosub ee '終了条件送出 Return ss: 'i2c開始条件処理 High RC.Bit0 'SCLをHIにする High RC.Bit1 'SDAをHIにする Low RC.Bit1 'SDAをLOにする Low RC.Bit0 'SCLをLOにする Return ee: 'i2c終了条件処理 High RC.Bit0 'SCLをHIにする High RC.Bit1 'SDAをHIにする Return ack: 'アクノリッジ確認処理 High RC.Bit1 'SDAをHIにする Input RC.Bit1 'SDAを入力に設定 High RC.Bit0 'SCLをHIにする(クロック信号開始) If RC.Bit1 <> 0 Then Setpos 0,1 Putlcd "RTC エラー...reset" End Endif Low RC.Bit0 'SCLをHIにする(クロック信号終了) Output RC.Bit1 'SDAを状態を出力に設定 Low RC.Bit1 'SDAをLOにする Return sack: 'アクノリッジ出力処理 Low RC.Bit1 'SDAをLOにする(アクノリッジはLOでアクティブ) High RC.Bit0 'SCLをHIにする(クロック信号開始) Low RC.Bit0 'SCLをLOにする(クロック信号終了) Low RC.Bit1 'SDAをLOにする Return nack: 'ノンアクノリッジ出力処理 High RC.Bit1 'SDAをHIにする(アクノリッジはHIでノンアクティブ) High RC.Bit0 'SCLをHIにする(クロック信号開始) Low RC.Bit0 'SCLをLOにする(クロック信号終了) Low RC.Bit1 'SDAをLOにする Return dout: '書き込みデータの出力処理 d=128 '1ビット処理のための定数d For i = 0 To 7 '1〜8ビット処理のためのループ e = a & d 'a=書き込みデータ d=定数 e=ビットデータ '最初に書き込みデータの8ビットの状態を確認(d=d/2) '書き込みデータと定数のANDを行うことで、目的ビットの状態がわかる '次に定数を1/2に(128/2=64)して7ビット目の状態を確認(以後繰り返し) If e = 0 Then 'e(ビットデータ)が0なら以下の処理 Low RC.Bit1 'SDAをLOにする(SDAに0を書き込む) High RC.Bit0 'SCLをHIにする(クロック信号開始) Low RC.Bit0 'SCLをLOにする(クロック信号終了) Low RC.Bit1 'SDAをLOにする(一応・・) Else 'e(ビットデータ)が0以外なら以下の処理(注意!e=1ではない) High RC.Bit1 'SDAをHIにする(SDAに1を書き込む High RC.Bit0 'SCLをHIにする(クロック信号開始) Low RC.Bit0 'SCLをLOにする(クロック信号終了) Low RC.Bit1 'SDAをLOにする Endif d = d / 2 '8〜1ビットを順次取り出すための定数設定 Next i Return din: '読み込みデータの入力処理 Input RC.Bit1 'SDAを入力に設定 a = 0 'a=読み込みデータ(はじめにaを初期化する) For i = 0 To 7 '1〜8ビット処理のためのループ a = a << 1 '読み込んだデータを左へ1シフトする(最初は0だから変わらない) High RC.Bit0 'SCLをHIにする(クロック信号開始) b = RC.Bit1 'SDAの状態をbに入れる(ビットデータ読み込み) a = a + b 'ビットデータの追加(前処理でaは左に1シフトしているので、右隣に読み込んだデータが順次入る) Low RC.Bit0 'SCLをLOにする(クロック信号終了) Next i Output RC.Bit1 'SDAを出力に設定 Return RTC_init: RTC_ad = &h00 'Control 1 レジスタを初期化 RTC_td = &B00100000 Gosub RTC_tset RTC_ad = &h01 RTC_td = &B00000000 'Control 2 レジスタを初期化 Gosub RTC_tset RTC_ad = &h08 'Yearsレジスタ RTC_td = &B00001001 ' 2008年 Gosub RTC_tset RTC_ad = &h07 'Monthsレジスタ RTC_td = &B00010000 ' 1月 Gosub RTC_tset RTC_ad = &h05 'Daysレジスタ RTC_td = &B00010000 ' 1日 Gosub RTC_tset RTC_ad = &H04 'Hoursレジスタ RTC_td = 0 ' 0時 Gosub RTC_tset RTC_ad = &H03 'Minutesレジスタ RTC_td = 0 ' 0分 Gosub RTC_tset RTC_ad = &H02 'Seconds(VL)レジスタ RTC_td = 0 ' 0秒 VL=0 Gosub RTC_tset RTC_ad = &H09 'アラームレジスタ RTC_td = &h80 '停止 Gosub RTC_tset RTC_ad = &H0A 'アラームレジスタ RTC_td = &h80 Gosub RTC_tset RTC_ad = &H0B 'アラームレジスタ RTC_td = &h80 Gosub RTC_tset RTC_ad = &H0C 'アラームレジスタ RTC_td = &h80 Gosub RTC_tset RTC_ad = &H0D 'CLOCK OUT レジスタ RTC_td = 0 '停止 Gosub RTC_tset RTC_ad = &H02 'タイマ割り込み機能レジスタ RTC_td = 0 '割り込み停止 Gosub RTC_tset RTC_ad = &h00 'Control 1 レジスタ RTC_td = 0 '動作開始 Gosub RTC_tset Return '---------------------------------------------------------- ' フォント ビットマップ定義 ' これ以外のフォントは内臓EEPROMに格納 '---------------------------------------------------------- CharB_AM: Font(0) = &H0060 Font(1) = &H0090 Font(2) = &H00F0 Font(3) = &H0090 Font(4) = &H000A Font(5) = &H0015 Font(6) = &H0011 Return CharB_PM: Font(0) = &H00E0 Font(1) = &H0090 Font(2) = &H00E0 Font(3) = &H008A Font(4) = &H0015 Font(5) = &H0011 Font(6) = &H0011 Font(7) = &H0000 Return CharB_Dot: Font(0) = &B000000 Font(1) = &B000000 Font(2) = &B000000 Font(3) = &B001100 Font(4) = &B001100 Font(5) = &B000000 Font(6) = &B000000 Font(7) = &B000000 Font(8) = &B001100 Font(9) = &B001100 Font(10) = &B000000 Font(11) = &B000000 Font(12) = &B000000 Font(13) = &B000000 Return CharB_Slash: Font(0)=&H0000 Font(1)=&H0001 Font(2)=&H0002 Font(3)=&H0004 Font(4)=&H0008 Font(5)=&H0010 Font(6)=&H0000 Return CharB_Nichi: Font(0)=&H007C Font(1)=&H0044 Font(2)=&H0044 Font(3)=&H007C Font(4)=&H0044 Font(5)=&H0044 Font(6)=&H007C Return CharB_Nen: Font(0)=&H0040 Font(1)=&H007E Font(2)=&H0088 Font(3)=&H003E Font(4)=&H0028 Font(5)=&H00FE Font(6)=&H0008 Return CharB_Ji: Font(0)=&H0008 Font(1)=&H00DE Font(2)=&H00A8 Font(3)=&H00FE Font(4)=&H00A4 Font(5)=&H00EC Font(6)=&H0004 Return CharB_Fun: Font(0)=&H0028 Font(1)=&H0044 Font(2)=&H00BA Font(3)=&H0014 Font(4)=&H0024 Font(5)=&H0044 Font(6)=&H0008 Return CharB_Am: Font(0)=&H001C Font(1)=&H0022 Font(2)=&H0022 Font(3)=&H003E Font(4)=&H0022 Font(5)=&H0022 Font(6)=&H0000 Font(7)=&H0000 Font(8)=&H0022 Font(9)=&H0036 Font(10)=&H002A Font(11)=&H002A Font(12)=&H0022 Font(13)=&H0022 Return CharB_Pm: Font(0)=&H003C Font(1)=&H0022 Font(2)=&H0022 Font(3)=&H003C Font(4)=&H0020 Font(5)=&H0020 Font(6)=&H0000 Font(7)=&H0000 Font(8)=&H0022 Font(9)=&H0036 Font(10)=&H002A Font(11)=&H0022 Font(12)=&H0022 Font(13)=&H0022 Return ' ' PIC-BASIC 内臓EEPROMにフォントデータ書き込み ' Largeフォント 8×14ドット ' Smallフォント 7(+1ドットスペース)×7ドット EEPROM_write: 'Large 0 Write 0,&H003C,&H00C3,&H00C3,&H00C3,&H00C3,&H00C3,&H00C3,&H00C3,&H00C3,&H00C3,&H00C3,&H00C3,&H00C3,&H003C 'Large 1 Write 14,&H0018,&H0038,&H0078,&H0018,&H0018,&H0018,&H0018,&H0018,&H0018,&H0018,&H0018,&H0018,&H0018,&H007E 'Large 2 Write 28,&H003C,&H00C3,&H00C3,&H00C3,&H0003,&H0003,&H0003,&H0006,&H000C,&H0018,&H0030,&H0060,&H00C0,&H00FF 'Large 3 Write 42,&H003C,&H00C3,&H00C3,&H0003,&H0003,&H0003,&H003C,&H0003,&H0003,&H0003,&H0003,&H00C3,&H00C3,&H003C 'Large 4 Write 56,&H000E,&H001E,&H0016,&H0036,&H0026,&H0066,&H0046,&H00C6,&H00C6,&H00FF,&H0006,&H0006,&H0006,&H000F 'Large 5 Write 70,&H00FF,&H00C0,&H00C0,&H00C0,&H00C0,&H00FC,&H0003,&H0003,&H0003,&H0003,&H0003,&H0003,&H0003,&H00FC 'Large 6 Write 84,&H007E,&H00C3,&H00C3,&H00C0,&H00C0,&H00C0,&H00FE,&H00C3,&H00C3,&H00C3,&H00C3,&H00C3,&H00C3,&H003C 'Large 7 Write 98,&H00FF,&H00C3,&H00C3,&H0003,&H0003,&H0006,&H000C,&H0018,&H0030,&H0030,&H0030,&H0030,&H0030,&H0030 'Large 8 Write 112,&H007E,&H00C3,&H00C3,&H00C3,&H00C3,&H00C3,&H007E,&H00C3,&H00C3,&H00C3,&H00C3,&H00C3,&H00C3,&H007E 'Large 9 Write 126,&H007E,&H00C3,&H00C3,&H00C3,&H00C3,&H00C3,&H007E,&H0003,&H0003,&H0003,&H0003,&H0003,&H00C3,&H007E 'Small 0 Write 140,&H001C,&H0022,&H0022,&H0022,&H0022,&H0022,&H001C 'Small 1 Write 147,&H0008,&H0018,&H0008,&H0008,&H0008,&H0008,&H001C 'Small 2 Write 154,&H000E,&H0011,&H0001,&H0002,&H0004,&H0008,&H001F 'Small 3 Write 161,&H000E,&H0011,&H0001,&H0006,&H0001,&H0011,&H000E 'Small 4 Write 168,&H0002,&H0006,&H000A,&H0012,&H001F,&H0002,&H0002 'Small 5 Write 175,&H001F,&H0010,&H000E,&H0001,&H0001,&H0011,&H000E 'Small 6 Write 182,&H000E,&H0010,&H0010,&H001E,&H0011,&H0011,&H000E 'Small 7 Write 189,&H001F,&H0001,&H0002,&H0004,&H0008,&H0008,&H0008 'Small 8 Write 196,&H000E,&H0011,&H0011,&H000E,&H0011,&H0011,&H000E 'Small 9 Write 203,&H000E,&H0011,&H0011,&H000F,&H0001,&H0011,&H000E 'Small 月 Write 210,&H007C,&H0044,&H007C,&H0044,&H007C,&H0044,&H0084 'Small 火 Write 217,&H0010,&H0054,&H0054,&H0010,&H0028,&H0044,&H0082 'Small 水 Write 224,&H0010,&H0092,&H0054,&H0038,&H0054,&H0092,&H0092 'Small 木 Write 231,&H0010,&H0010,&H00FE,&H0038,&H0054,&H0054,&H0092 'Small 金 Write 238,&H0038,&H0044,&H00BA,&H0010,&H00FE,&H0054,&H00FE 'Small 土 Write 245,&H0010,&H0010,&H007C,&H0010,&H0010,&H0010,&H00FE Return