;--------------------------------------------------------------------- ; 試験管デジタル時計 (V2は砂時計型ラーメンタイマ付き) ; V3は電源再投入のタイミングで砂時計と通常時計の切り替え ; V3.1 V3のバグ修正 ; ; V3.1 2015.7.29 naka ; V3 2015.7.25 naka ; V2 2015.7.5 naka ; 2015.4.30 naka ; PIC16F887 (4MHz) + RTC(DS3234S) ; ; 【機能など】 ; ・横表示 HH:MM:SS、縦表示 HH:MM ; ・変化する数字がスクロールアップ表示するモード ; ・時刻は高精度RTC、バッテリバックアップ ; ・周囲の明るさに応じて、LEDの明るさを4段階で変更(ソフトPWM) ; ・電源投入時、消失時のアニメーション表示 ; ・電源投入時に砂時計型3分計を表示 ; ; 【更新履歴】 ; ・V3.1 2015.7.29 ; V3でスクロールアップ表示モードの際、深夜00:00:00になる時に表示が ; 正しくならないバグを修正(V3で入ってしまったバグでした)。 ; また、時刻設定時に23時を超えた時刻を設定できてしまい、暴走することが ; あったバグを修正(これはV1,V2,V3共通のバグ)。 ; ・V3 2015.7.25 ; 砂時計表示と通常表示を電源再投入のタイミングで切り替えられるように改善。 ; ・V2 2015.7.5 ; 電源投入時に砂時計型ラーメンタイマを起動するように改善。 ; ; 【マトリクスLED配置】 ; ; 列 0 1 2 3 4 5 6 7 8 9 A B C D 0 1 2 3 4 5 6 7 8 9 A B C D (14 x 2) ; 行 0 ○●○○●●●○○○●●●○●○●○○○●●●○●●●○ ; 1 ○●○○○○●○●○○○●○●○●○●○●○○○●○○○ ; 2 ○●○○●●●○○○●●●○●●●○○○●●●○●●●○ ; 3 ○●○○●○○○●○○○●○○○●○●○○○●○●○●○ ; 4 ○●○○●●●○○○●●●○○○●○○○●●●○●●●○ ; →→→→→→→→→→→→→→ ; @AB… →→→→→→→→→→→→→→ ; スキャン @AB… ; ; 【数字フォント】 5x7ドット(横表示時) ; ; ●●● ● ●●● ●●● ● ● ; ● ● ● ● ● ● ● ; ● ● ● ●●● ●●● ●●● ; ● ● ● ● ● ● ; ●●● ● ●●● ●●● ● ; ; ●●● ●●● ●●● ●●● ●●● ; ● ● ● ● ● ● ● ; ●●● ●●● ● ●●● ●●● ; ● ● ● ● ● ● ● ; ●●● ●●● ● ●●● ●●● ; ; 【ピンアサイン】 ; ; (1). RA0〜4,RB0〜4 [out] : 行 5pin x 2 LEDアノード側 ; (2). RC0〜7,RD0〜5 [out] : 列(スキャン側)14pin LEDカソード(ドライブTr)側 ; (3). RD6 [out] : RTC xCS ; (4). RD7 [out] : RTC SCLK ; (5). RA5 [out] : RTC DIN ; (6). RA6 [in] : RTC DOUT ; (7). RA7 [in] : RTC xINT/SQW ; (8). RE0/AN5 [in] : Analog CDS (明るさセンス) ; (10). RE1 [in] : 時間設定タクトSW MODE ; (11). RE2 [in] : 時間設定タクトSW SET ; (12). RB5 [in] : 電源監視 ; ;--------------------------------------------------------------------- ;--------------------------------------------------------------------- ; デバイス定義 ;--------------------------------------------------------------------- LIST P=PIC16F887 INCLUDE "P16F887.INC" __CONFIG _CONFIG1, _DEBUG_OFF & _LVP_OFF & _MCLRE_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT __CONFIG _CONFIG2 ERRORLEVEL -302 ;アセンブル時のバンク警告メッセージ抑制 ;--------------------------------------------------------------------- ; 変数レジスタの定義(BANK0) ;--------------------------------------------------------------------- LEDBUF EQU 020H ; LED表示バッファ(0〜13列分) 020H〜02DH 裏バッファ 090H〜 LEDBUF2 EQU 02EH ; 14〜27列分) 02EH〜03BH LEDBUFX EQU 03CH ; 3CH-3FH BOFFSET EQU 040H ; 表示バッファオフセット(H'80':裏バッファ) PABUF EQU 041H ; PortA Buffer PBBUF EQU 042H ; PortB Buffer PDBUF EQU 043H ; PortD Buffer H10DGT EQU 044H ; 時 10の位 H01DGT EQU 045H ; 時 1の位 M10DGT EQU 046H ; 分 10の位 M01DGT EQU 047H ; 分 1の位 S10DGT EQU 048H ; 秒 10の位 S01DGT EQU 049H ; 秒 1の位 H10DGTP EQU 04AH ; 前回の時 10の位(数字のスクロールアップ表示用) H01DGTP EQU 04BH ; 前回の時 1の位 M10DGTP EQU 04CH ; 前回の分 10の位 M01DGTP EQU 04DH ; 前回の分 1の位 S10DGTP EQU 04EH ; 前回の秒 10の位 S01DGTP EQU 04FH ; 前回の秒 1の位 DPMODE EQU 050H ; 表示モード DSPFLG EQU 051H SECTRG EQU 052H PWMCNT EQU 053H ROWCNT EQU 054H BLCNTH EQU 055H ; 点滅用カウンタHigh(割り込み内でカウントアップ) BLCNTL EQU 056H ; 点滅用カウンタLow BLKFLG EQU 057H SWFLG EQU 058H ; スイッチ状態フラグ ; 0 : モードスイッチ ; 1 : セットスイッチ ; 2 : 時刻設定モード(点滅判断) ; 3 : 空き ; 4 : 10時設定中 ; 5 : 1時設定中 ; 6 : 10分設定中 ; 7 : 1分設定中 SWLCNT EQU 059H ; SW長押しチェック用カウンタ WKCNT EQU 05AH WKCNT2 EQU 05BH WCNT1 EQU 05CH ; wait用カウンタ WCNT2 EQU 05DH ; wait用カウンタ WTIME EQU 05EH TMP EQU 05FH WK EQU 060H OFFSET EQU 061H SMPLCNT EQU 062H ; タクトスイッチのサンプリング用カウンタ NUMBER EQU 063H BRTNES EQU 064H ; 明るさ TMPVOL EQU 065H NOWVOL EQU 066H PRVVOL EQU 067H RTCADDR EQU 068H ; RTC アドレス RTCDATA EQU 069H ; RTC データ TXBUF EQU 06AH ; SPI通信用バッファ RTCFLG EQU 06BH ANS EQU 06CH ; 砂時計表示用 ODD EQU 06DH ; 〃 SNDSEC EQU 06EH ; 〃 ANSDIV3 EQU 06FH ; 〃 EE_ADDR EQU 070H EE_DATA EQU 071H BKUPW EQU 072H ;Wレジ待避用 BKUPS EQU 073H ;STATUSレジ待避用 BKUPFR EQU 074H ;FSRレジ待避用 BKUPPCL EQU 075H ;PCLHレジ待避用 ; SNDSECL EQU 076H ; 砂時計の時間カウント用 SNDSECH EQU 077H SNDSECF EQU 078H ; BINTIML EQU 079H BINTIMM EQU 07AH BINTIMH EQU 07BH BINTIMPL EQU 07CH BINTIMPM EQU 07DH BINTIMPH EQU 07EH ;-------------------------------------------------------------------------- ; EEPROM ;-------------------------------------------------------------------------- ORG H'2100' ; EEPROM DE D'00' ; 表示モードデフォルト ;--------------------------------------------------------------------- ; マクロ定義 ;--------------------------------------------------------------------- BANK0 MACRO BCF STATUS,RP0 ;BANK0に切り替える BCF STATUS,RP1 ; BCF STATUS,IRP ;間接アドレス用 ENDM BANK1 MACRO BSF STATUS,RP0 ;BANK1に切り替える BCF STATUS,RP1 ; BCF STATUS,IRP ;間接アドレス用 ENDM BANK2 MACRO BCF STATUS,RP0 ;BANK2に切り替える BSF STATUS,RP1 ; BSF STATUS,IRP ;間接アドレス用 ENDM BANK3 MACRO BSF STATUS,RP0 ;BANK3に切り替える BSF STATUS,RP1 ; ENDM ;--------------------------------------------------------------------- ; リセット ;--------------------------------------------------------------------- ORG 00H ; リセット時の飛び込み先 RESET GOTO START ; ORG 04H ; 割り込み時の飛び込み先 INTER ; GOTO INTRUPT ; ;--------------------------------------------------------------------- ; メイン ;--------------------------------------------------------------------- START CALL INIT ; 初期化 ; BTFSS RTCFLG,7 ; OSF=1(発振停止だったか? 発振停止なら時刻設定へ) GOTO MAIN ; ◆誤動作するようなら、上記BTFSS行をコメントアウト ; CALL CLRTIME ; 00:00:00 にする CALL SETTIME ; 時刻設定 CALL WRTRTC ; 設定した時刻をRTCに書き込む CALL BKUPTIM CALL DISPLAY1 GOTO MAINLP ; MAIN CALL TIMLAG ; 前回電源断からの時間経過確認 BTFSS STATUS,Z GOTO MAIN_PON ; CALL SNDFALL ; 砂時計(約3分)表示 BTFSC STATUS,Z GOTO MODE_SW CALL W10S ; 約10秒 砂が落ちきった状態を表示 BTFSC STATUS,Z GOTO MODE_SW ; MAIN_PON CALL REDRTC CALL PWRON MAINLP BTFSS PORTB,5 ; 電源断チェック GOTO BLACKOUT ; BTFSC SWFLG,1 ; ADJUSTモード CALL ADJTIM ; CALL CHKSW1P ; Modeスイッチ BTFSS STATUS,Z GOTO CHKBRT MODE_SW CALL CHKSW1R ; Modeスイッチ開放待ち BTFSS STATUS,Z GOTO MODE1 CALL SETTIME ; 時刻設定モード GOTO CHKBRT MODE1 CALL DSPMODE ; 表示モード切替 ; CHKBRT CALL GETBRT ; 明るさ測定(約60us要) ; ; 秒トリガ確認 BCF STATUS,C RRF SECTRG,F ; 前回の状態をビット0にシフト ; BCF SECTRG,1 BTFSC PORTA,7 ; 1Hz割り込み監視 BSF SECTRG,1 ; MOVF SECTRG,W SUBLW H'01' ; 前回High, 今回Low なら秒トリガ BTFSS STATUS,Z GOTO MAINLP ; CALL REDRTC ; RTCから時刻情報を取り出す CALL CHKMIDN ; 夜中の零時確認(電源断の時刻をリセット) CALL DISPLAY2 ; GOTO MAINLP ; ;--------------------------------------------------------------------- ; デバイスのポート、割り込み関係の初期化 ;--------------------------------------------------------------------- INIT BCF INTCON,GIE ;全割込み禁止 ; MOVLW B'10010100' ; ADCS:FOSC/32:10, AN5:0101 MOVWF ADCON0 BANK3 MOVLW B'00100000' ; AN5アナログ入力 MOVWF ANSEL CLRF ANSELH BANK1 MOVLW B'00000000' MOVWF ADCON1 CLRF WPUB ; weak pullup disable ; MOVLW B'11000000' ; PortA MOVWF TRISA MOVLW B'11100000' ; PortB MOVWF TRISB MOVLW B'00000000' ; PortC MOVWF TRISC MOVLW B'00000000' ; PortD MOVWF TRISD MOVLW B'00000111' ; PortE MOVWF TRISE ; ;割り込みタイマーセット(LEDのダイナミック点灯ほかのため) MOVLW B'00001000' ;TIM0プリスケーラを使わない MOVWF OPTION_REG ; BANK0 ;clock4MHz -> 1Mcycle ;1Mcycle/256 = 3906Hz = 0.256ms ; (1画面14列×4PWM表示=56なので1画面3906/56=約70Hzで表示) ; CALL CSINACT ; SPI CS無効 CALL LEDOFF CALL CLRBUF ; 表示バッファクリア ; CLRF ROWCNT CLRF PWMCNT CLRF SWFLG CLRF SECTRG ; CLRF BLCNTH CLRF BLCNTL ; CLRF BOFFSET MOVLW H'00' ; 先頭アドレス MOVWF EE_ADDR CALL RDEEPROM MOVWF DPMODE ; CLRF SMPLCNT ; CLRF SNDSECL CLRF SNDSECH CLRF SNDSECF ; CALL INTRTC ; RTCの動作モード設定、および発振停止確認 ; BSF INTCON,T0IE ; RTCCマスクイネーブル BSF INTCON,GIE ; 割り込み許可 ; RETURN ; ;--------------------------------------------------------------------- ; 割り込み処理でダイナミック表示、スイッチのサンプリング ;--------------------------------------------------------------------- INTRUPT ;レジスタ待避 MOVWF BKUPW ; バックアップ(Wレジ) SWAPF STATUS,W ; バックアップ(STATUSレジ) MOVWF BKUPS MOVF FSR,W ; バックアップ(FSRレジ) MOVWF BKUPFR MOVF PCLATH,W ; バックアップ(PCLHレジ) MOVWF BKUPPCL ; BCF INTCON,T0IF ; 割り込みフラグリセット ; INCF SNDSECL,F ; 砂時計用 MOVF SNDSECL,W SUBLW D'254' BTFSS STATUS,Z GOTO SNDSECE CLRF SNDSECL INCF SNDSECH,F MOVF SNDSECH,W SUBLW D'16' ; 0.256MS x 254 x 16 = 1.04sec BTFSS STATUS,Z GOTO SNDSECE CLRF SNDSECH BSF SNDSECF,0 SNDSECE ; ; 時刻設定モード時に数字を点滅 BTFSS SWFLG,2 ; モード確認 GOTO CHKPWM ; 点滅用カウンタ(0.256ms*256*2=0.13秒) MOVLW D'1' ADDWF BLCNTL,F BTFSC STATUS,C INCF BLCNTH,F MOVF BLCNTH,W SUBLW D'2' BTFSS STATUS,Z GOTO CHKPWM CLRF BLCNTH CALL BLNKDGT ; LEDBUFを強制書き換え ; CHKPWM ; LED 一旦消灯(カソード側OFF) CALL LEDOFF ; ; PWM表示確認 MOVF PWMCNT,W SUBWF BRTNES,W ; PWMCNT <= BRTNES(暗い:0-3:明るい) なら表示 BTFSS STATUS,C GOTO SKIPDSP ; 表示しない ; SETANODE ; 表示バッファ内容を1列分(前半)出力 MOVF PABUF,W ANDLW B'11100000' MOVWF PABUF MOVLW LEDBUF ; 表示バッファの先頭アドレス ADDWF ROWCNT,W ; 現在の列カウンタを足す MOVWF FSR ; FSR にアドレスをセット MOVF INDF,W ; 現在の列の内容を読み込む ANDLW B'00011111' IORWF PABUF,F MOVF PABUF,W MOVWF PORTA ; PortAに出力 ; ; 表示バッファ内容を1列分(後半)出力 MOVF PBBUF,W ANDLW B'11100000' MOVWF PBBUF MOVLW LEDBUF2 ; 表示バッファの後半先頭アドレス ADDWF ROWCNT,W ; 現在の列カウンタを足す MOVWF FSR ; FSR にアドレスをセット MOVF INDF,W ; 現在の列の内容を読み込む ANDLW B'00011111' IORWF PBBUF,F MOVF PBBUF,W MOVWF PORTB ; PortBに出力 ; SETCATHODE MOVF ROWCNT,W CALL DECBIT1 ; ROWCNTからアクティブな列のbit番号に変換 MOVWF PORTC ; MOVF ROWCNT,W CALL DECBIT2 ; PORTD用を取り出す IORWF PDBUF,F MOVF PDBUF,W MOVWF PORTD ; INCF ROWCNT,F ; 次回、次の列を表示するためにインクリメント MOVF ROWCNT,W SUBLW D'14' BTFSC STATUS,Z CLRF ROWCNT ; SKIPDSP INCF PWMCNT,W ; PWM用カウンタ(0〜3) ANDLW B'00000011' MOVWF PWMCNT ; ; タクトスイッチ確認 INCF SMPLCNT,F ; チャタリング回避のためのサンプル時間確認(0.256ms*10=2.56msごと) MOVF SMPLCNT,W SUBLW D'10' BTFSS STATUS,Z GOTO INTRTRN ; CLRF SMPLCNT ; 次回のためにカウンタセット ; BCF SWFLG,0 ; モードスイッチクリア BTFSS PORTE,1 BSF SWFLG,0 ; モードスイッチON ; BCF SWFLG,1 ; セット/ADJUSTスイッチクリア BTFSS PORTE,2 BSF SWFLG,1 ; セットスイッチON ; INCF SWLCNT,F ; スイッチ長押しカウンタ ; INTRTRN ; ;レジスタ復元 MOVF BKUPPCL,W ;復元(PCLATH) MOVWF PCLATH MOVF BKUPFR,W ;復元(FSRレジ) MOVWF FSR SWAPF BKUPS,W ;復元(STATUSレジ) MOVWF STATUS SWAPF BKUPW,F ;復元(Wレジ) SWAPF BKUPW,W ; RETFIE ; ;--------------------------------------------------------------------- ; Wレジ値をビット位置にデコード ;--------------------------------------------------------------------- DECBIT1 ; portC用 CLRF PCLATH ; テーブルは 000H〜0FFH番地内にある ADDWF PCL,F RETLW B'00000001' ;0 RETLW B'00000010' ;1 RETLW B'00000100' ;2 RETLW B'00001000' ;3 RETLW B'00010000' ;4 RETLW B'00100000' ;5 RETLW B'01000000' ;6 RETLW B'10000000' ;7 RETLW B'00000000' ;8 RETLW B'00000000' ;9 RETLW B'00000000' ;A RETLW B'00000000' ;B RETLW B'00000000' ;C RETLW B'00000000' ;D DECBIT2 ; portD用 CLRF PCLATH ADDWF PCL,F RETLW B'00000000' ;0 RETLW B'00000000' ;1 RETLW B'00000000' ;2 RETLW B'00000000' ;3 RETLW B'00000000' ;4 RETLW B'00000000' ;5 RETLW B'00000000' ;6 RETLW B'00000000' ;7 RETLW B'00000001' ;8 RETLW B'00000010' ;9 RETLW B'00000100' ;A RETLW B'00001000' ;B RETLW B'00010000' ;C RETLW B'00100000' ;D ; ;--------------------------------------------------------------------- ; 表示モード設定 ; DPMODE=0 : HH:MM:SS 表示 ; DPMODE=1 : HH:MM 縦表示 ; DPMODE=2 : HH:MM:SS 表示(変化する数字が縦スクロール) ; DPMODE=3 : HH:MM 縦表示 ( 〃 ) ;--------------------------------------------------------------------- DSPMODE INCF DPMODE,W ANDLW H'03' MOVWF DPMODE ; MOVWF EE_DATA MOVLW H'00' MOVWF EE_ADDR CALL WRTEEPROM ; CALL DISPLAY1 RETURN ; ;--------------------------------------------------------------------- ; 表示モードに応じた時刻表示 ;--------------------------------------------------------------------- DISPLAY1 ; 電源投入時/モード切替時/ADJ時の最初の表示 BSF DSPFLG,0 GOTO DISPLAY3 DISPLAY2 BCF DSPFLG,0 ; DISPLAY3 MOVF DPMODE,W CLRF PCLATH ADDWF PCL,F GOTO DPMODE0 GOTO DPMODE1 GOTO DPMODE2 GOTO DPMODE3 ; DPMODE0 CALL TIM2LED RETURN ; DPMODE1 CALL TIM2LEDV RETURN ; DPMODE2 CLRW BTFSS DSPFLG,0 MOVLW H'80' MOVWF BOFFSET CALL TIM2LED CLRF BOFFSET BTFSS DSPFLG,0 CALL SCRLUP RETURN ; DPMODE3 CLRW BTFSS DSPFLG,0 MOVLW H'80' MOVWF BOFFSET CALL TIM2LEDV CLRF BOFFSET BTFSS DSPFLG,0 CALL SCRLUPV RETURN ; ;--------------------------------------------------------------------- ; LED消灯 ;--------------------------------------------------------------------- LEDOFF CLRF PORTC MOVF PDBUF,W ANDLW B'11000000' MOVWF PDBUF MOVWF PORTD RETURN ; ;--------------------------------------------------------------------- ; 時刻設定モード時の桁点滅 ;--------------------------------------------------------------------- BLNKDGT BTFSS BLKFLG,0 GOTO BLNKOFF BLNKON BCF BLKFLG,0 BTFSS SWFLG,4 GOTO BLNKON1 MOVF LEDBUFX,W MOVWF LEDBUF MOVF LEDBUFX+D'1',W MOVWF LEDBUF +D'1' MOVF LEDBUFX+D'2',W MOVWF LEDBUF +D'2' RETURN BLNKON1 BTFSS SWFLG,5 GOTO BLNKON2 MOVF LEDBUFX,W MOVWF LEDBUF +D'4' MOVF LEDBUFX+D'1',W MOVWF LEDBUF +D'5' MOVF LEDBUFX+D'2',W MOVWF LEDBUF +D'6' RETURN BLNKON2 BTFSS SWFLG,6 GOTO BLNKON3 MOVF LEDBUFX,W MOVWF LEDBUF +D'10' MOVF LEDBUFX+D'1',W MOVWF LEDBUF +D'11' MOVF LEDBUFX+D'2',W MOVWF LEDBUF +D'12' RETURN BLNKON3 BTFSS SWFLG,7 RETURN MOVF LEDBUFX,W MOVWF LEDBUF +D'14' MOVF LEDBUFX+D'1',W MOVWF LEDBUF +D'15' MOVF LEDBUFX+D'2',W MOVWF LEDBUF +D'16' RETURN ; BLNKOFF BSF BLKFLG,0 BTFSS SWFLG,4 GOTO BLNKOFF1 CLRF LEDBUF CLRF LEDBUF+D'1' CLRF LEDBUF+D'2' RETURN ; BLNKOFF1 BTFSS SWFLG,5 GOTO BLNKOFF2 CLRF LEDBUF+D'4' CLRF LEDBUF+D'5' CLRF LEDBUF+D'6' RETURN ; BLNKOFF2 BTFSS SWFLG,6 GOTO BLNKOFF3 CLRF LEDBUF+D'10' CLRF LEDBUF+D'11' CLRF LEDBUF+D'12' RETURN ; BLNKOFF3 BTFSS SWFLG,7 RETURN CLRF LEDBUF+D'14' CLRF LEDBUF+D'15' CLRF LEDBUF+D'16' RETURN ; ;--------------------------------------------------------------------- ; 時刻アジャスト(秒を四捨五入:30秒以上なら分を繰り上げて秒を00に、 ; 30秒未満なら秒切捨てて00にする) ;--------------------------------------------------------------------- ADJTIM MOVF S10DGT,W SUBLW D'2' ; 10の位が2を超えていたら(3以上なら) BTFSS STATUS,C CALL INCTIM ; 分以上をインクリメント ; CLRF S10DGT ; 秒をクリア(10の位) CLRF S01DGT ; 秒をクリア(1の位) CALL DISPLAY1 ; 表示 ; BTFSC SWFLG,1 ; スイッチが離される迄待つ GOTO $-1 ; CALL WRTRTC ; 設定した時刻をRTCに書き込む RETURN ; ;--------------------------------------------------------------------- ; 分以上を繰り上げる ;--------------------------------------------------------------------- INCTIM ; 分をインクリメント INCF M01DGT,F ; 1の位 MOVF M01DGT,W SUBLW D'10' BTFSS STATUS,Z RETURN CLRF M01DGT ; 1の位を0クリア INCF M10DGT,F ; 10の位 MOVF M10DGT,W SUBLW D'6' ; 60なら時をインクリメント BTFSS STATUS,Z RETURN CLRF M10DGT ; 分を0クリア ; ; 時をインクリメント INCF H01DGT,F ; 1の位 MOVF H01DGT,W SUBLW D'4' ; 24の可能性確認 BTFSS STATUS,Z GOTO INCTIM2 MOVF H10DGT,W SUBLW D'2' BTFSS STATUS,Z GOTO INCTIM2 ; CLRF H01DGT ; 0時 CLRF H10DGT RETURN ; INCTIM2 MOVF H01DGT,W SUBLW D'10' BTFSS STATUS,Z RETURN CLRF H01DGT INCF H10DGT,F ; 10の位 RETURN ;--------------------------------------------------------------------- ; 時刻設定モード(時、分の各桁毎に数字をカウントアップ、秒は設定できず常に00) ;--------------------------------------------------------------------- SETTIME BSF SWFLG,2 ; 時刻設定モード ; CLRF S10DGT ; 秒は設定できない 00 のみ CLRF S01DGT CALL TIM2LED ; 時刻設定時は横表示のみ CLRF BLCNTH ; 設定桁の点滅用カウンタクリア CLRF BLCNTL CLRF BLKFLG CLRF S10DGT ; 秒をクリア(10の位) CLRF S01DGT ; 秒をクリア(1の位) ; BSF SWFLG,4 ; 10の位 設定モード MOVLW LEDBUFX ; Modeスイッチ長押し認識後に点滅のため MOVWF FSR MOVF H10DGT,W CALL DSPDGT BTFSC SWFLG,0 ; モードSWが離されるまで待つ GOTO $-1 SET10H CALL BLNKH10 BTFSC SWFLG,1 ; セットスイッチが押された? GOTO INC10H BTFSS SWFLG,0 ; モードスイッチが押された? GOTO SET10H BTFSC SWFLG,0 ; モードSWが離されるまで待つ GOTO $-1 CALL BLNKON BCF SWFLG,4 GOTO SET01H INC10H INCF H10DGT,F MOVLW D'3' SUBWF H10DGT,W BTFSC STATUS,Z CLRF H10DGT ; CALL BLNKH10 ; BTFSC SWFLG,1 ; 離されるまで待つ GOTO $-1 GOTO SET10H ; SET01H BTFSS H10DGT,1 ; 20時台のときに4以上だったら0クリア GOTO SET01H2 MOVF H01DGT,W SUBLW D'3' BTFSS STATUS,C CLRF H01DGT ; 0クリア ; SET01H2 BSF SWFLG,5 ; 1の位 設定モード(数字が点滅) CALL BLNKH01 BTFSC SWFLG,1 ; セットスイッチが押された? GOTO INC01H ; BTFSS SWFLG,0 ; モードスイッチが押された? GOTO SET01H BTFSC SWFLG,0 ; モードSWが離されるまで待つ GOTO $-1 CALL BLNKON BCF SWFLG,5 GOTO SET10M INC01H INCF H01DGT,F MOVLW D'4' ; 20時台のときは3迄 BTFSS H10DGT,1 MOVLW D'10' SUBWF H01DGT,W BTFSC STATUS,Z CLRF H01DGT ; CALL BLNKH01 ; BTFSC SWFLG,1 ; 離されるまで待つ GOTO $-1 GOTO SET01H ; SET10M BSF SWFLG,6 ; 1の位 設定モード(数字が点滅) CALL BLNKM10 BTFSC SWFLG,1 ; セットスイッチが押された? GOTO INC10M BTFSS SWFLG,0 ; モードスイッチが押された? GOTO SET10M BTFSC SWFLG,0 ; モードSWが離されるまで待つ GOTO $-1 CALL BLNKON BCF SWFLG,6 GOTO SET01M INC10M INCF M10DGT,F MOVLW D'6' SUBWF M10DGT,W BTFSC STATUS,Z CLRF M10DGT ; CALL BLNKM10 BTFSC SWFLG,1 ; 離されるまで待つ GOTO $-1 GOTO SET10M ; SET01M BSF SWFLG,7 ; 1の位 設定モード(数字が点滅) CALL BLNKM01 BTFSC SWFLG,1 ; セットスイッチが押された? GOTO INC01M ; BTFSS SWFLG,0 ; モードスイッチが押された? GOTO SET01M BTFSC SWFLG,0 ; モードスイッチが離されたらモード終わり GOTO $-1 CALL BLNKON BCF SWFLG,7 GOTO SETEND INC01M INCF M01DGT,F MOVLW D'10' SUBWF M01DGT,W BTFSC STATUS,Z CLRF M01DGT ; CALL BLNKM01 BTFSC SWFLG,1 ; 離されるまで待つ GOTO $-1 GOTO SET01M ; SETEND CALL TIM2LED ; 表示 CALL WRTRTC ; 設定した時刻をRTCに書き込む BCF SWFLG,2 ; 時刻設定モード終了 RETURN ; BLNKH10 MOVLW LEDBUFX MOVWF FSR MOVF H10DGT,W CALL DSPDGT RETURN BLNKH01 MOVLW LEDBUFX MOVWF FSR MOVF H01DGT,W CALL DSPDGT RETURN BLNKM10 MOVLW LEDBUFX MOVWF FSR MOVF M10DGT,W CALL DSPDGT RETURN BLNKM01 MOVLW LEDBUFX MOVWF FSR MOVF M01DGT,W CALL DSPDGT RETURN ;--------------------------------------------------------------------- ; 時刻設定をゼロクリア ;--------------------------------------------------------------------- CLRTIME CLRF H10DGT CLRF H01DGT CLRF M10DGT CLRF M01DGT CLRF S10DGT CLRF S01DGT RETURN ; ;--------------------------------------------------------------------- ; 一桁分の数字(3x5ドット)を表示バッファに設定 ; W :数値(0〜9) ... 破壊される ; FSR :表示バッファアドレスの先頭を格納 ;--------------------------------------------------------------------- ; ORG H'200' DSPDGT MOVWF NUMBER CLRF OFFSET ; 列カウンタクリア MOVLW D'4' MOVWF WKCNT DSPDGTL CALL DIGITDT ; 数値の先頭1列分を取り出す MOVWF INDF ; 表示バッファに書き出す INCF OFFSET,F ; 1列進める INCF FSR,F ; 表示バッファを進める DECFSZ WKCNT,F GOTO DSPDGTL RETURN ; DIGITDT ;数字の1列分のデータを取り出し MOVF OFFSET,F ;offsetが0か判断 BTFSS STATUS,Z ; 0ならスキップ GOTO DIGITDT1 ; 0以外ならoffsetをインクリメント ; 0でない→その数字の最初の1列 ; 数値を4倍してoffsetへ BCF STATUS,C ;キャリークリア RLF NUMBER,F RLF NUMBER,W MOVWF OFFSET DIGITDT1 MOVLW H'02' MOVWF PCLATH MOVF OFFSET,W ADDWF PCL,F ; digit 0 RETLW B'00011111' RETLW B'00010001' RETLW B'00011111' RETLW B'00000000' ; digit 1 RETLW B'00000000' RETLW B'00011111' RETLW B'00000000' RETLW B'00000000' ; digit 2 RETLW B'00011101' RETLW B'00010101' RETLW B'00010111' RETLW B'00000000' ; digit 3 RETLW B'00010101' RETLW B'00010101' RETLW B'00011111' RETLW B'00000000' ; digit 4 RETLW B'00000111' RETLW B'00000100' RETLW B'00011111' RETLW B'00000000' ; digit 5 RETLW B'00010111' RETLW B'00010101' RETLW B'00011101' RETLW B'00000000' ; digit 6 RETLW B'00011111' RETLW B'00010101' RETLW B'00011101' RETLW B'00000000' ; digit 7 RETLW B'00000001' RETLW B'00011101' RETLW B'00000011' RETLW B'00000000' ; digit 8 RETLW B'00011111' RETLW B'00010101' RETLW B'00011111' RETLW B'00000000' ; digit 9 RETLW B'00010111' RETLW B'00010101' RETLW B'00011111' RETLW B'00000000' ; digit A RETLW B'00011110' RETLW B'00000101' RETLW B'00011110' RETLW B'00000000' ; digit B RETLW B'00011111' RETLW B'00010101' RETLW B'00001010' RETLW B'00000000' ; digit C RETLW B'00001110' RETLW B'00010001' RETLW B'00010001' RETLW B'00000000' ; digit D RETLW B'00011111' RETLW B'00010001' RETLW B'00001110' RETLW B'00000000' ; digit E RETLW B'00011111' RETLW B'00010101' RETLW B'00010101' RETLW B'00000000' ; digit F RETLW B'00011111' RETLW B'00000101' RETLW B'00000101' RETLW B'00000000' ; ;--------------------------------------------------------------------- ; 一桁分の縦数字(5x5ドット)を表示バッファに設定 ; W :数値(0〜9) ... 破壊される ; FSR :表示バッファアドレスの先頭を格納 ;--------------------------------------------------------------------- DSPDGTV MOVWF NUMBER MOVWF WK CLRF OFFSET ; 列カウンタクリア MOVLW D'6' MOVWF WKCNT DSPDGTVL CALL DIGITDTV ; 数値の先頭1列分を取り出す MOVWF INDF ; 表示バッファに書き出す INCF OFFSET,F ; 1列進める INCF FSR,F ; 表示バッファを進める DECFSZ WKCNT,F GOTO DSPDGTVL RETURN ; DIGITDTV ;数字の1列分のデータを取り出し MOVF OFFSET,F ;offsetが0か判断 BTFSS STATUS,Z ; 0ならスキップ GOTO DIGITDT1V ; 0以外ならoffsetをインクリメント ; 0でない→その数字の最初の1列 ; 数値を6倍してoffsetへ BCF STATUS,C ;キャリークリア RLF NUMBER,F RLF NUMBER,W RLF WK,F ADDWF WK,W MOVWF OFFSET DIGITDT1V MOVLW H'02' MOVWF PCLATH MOVF OFFSET,W ADDWF PCL,F ; digit 0 ; さかさまに定義 RETLW B'00011111' RETLW B'00011001' RETLW B'00011001' RETLW B'00011001' RETLW B'00011111' RETLW B'00000000' ; digit 1 RETLW B'00011111' RETLW B'00001100' RETLW B'00001100' RETLW B'00001100' RETLW B'00001110' RETLW B'00000000' ; digit 2 RETLW B'00011111' RETLW B'00000001' RETLW B'00011111' RETLW B'00011000' RETLW B'00011111' RETLW B'00000000' ; digit 3 RETLW B'00011111' RETLW B'00011000' RETLW B'00011110' RETLW B'00011000' RETLW B'00011111' RETLW B'00000000' ; digit 4 RETLW B'00011000' RETLW B'00011000' RETLW B'00011111' RETLW B'00011001' RETLW B'00011001' RETLW B'00000000' ; digit 5 RETLW B'00011111' RETLW B'00011000' RETLW B'00011111' RETLW B'00000001' RETLW B'00011111' RETLW B'00000000' ; digit 6 RETLW B'00011111' RETLW B'00011001' RETLW B'00011111' RETLW B'00000001' RETLW B'00011111' RETLW B'00000000' ; digit 7 RETLW B'00001100' RETLW B'00001100' RETLW B'00011000' RETLW B'00011000' RETLW B'00011111' RETLW B'00000000' ; digit 8 RETLW B'00011111' RETLW B'00011001' RETLW B'00011111' RETLW B'00011001' RETLW B'00011111' RETLW B'00000000' ; digit 9 RETLW B'00011111' RETLW B'00011000' RETLW B'00011111' RETLW B'00011001' RETLW B'00011111' RETLW B'00000000' ; digit A RETLW B'00010011' RETLW B'00010011' RETLW B'00011111' RETLW B'00010011' RETLW B'00001110' RETLW B'00000000' ; digit B RETLW B'00001111' RETLW B'00010011' RETLW B'00001111' RETLW B'00010011' RETLW B'00001111' RETLW B'00000000' ; digit C RETLW B'00001110' RETLW B'00010011' RETLW B'00000011' RETLW B'00010011' RETLW B'00001110' RETLW B'00000000' ; digit D RETLW B'00001111' RETLW B'00010011' RETLW B'00010011' RETLW B'00010011' RETLW B'00001111' RETLW B'00000000' ; digit E RETLW B'00011111' RETLW B'00000011' RETLW B'00011111' RETLW B'00000011' RETLW B'00011111' RETLW B'00000000' ; digit F RETLW B'00000011' RETLW B'00000011' RETLW B'00001111' RETLW B'00000011' RETLW B'00011111' RETLW B'00000000' ; ;--------------------------------------------------------------------- ; 電源投入時のアニメ表示(列方向 0→27 へ流れる) ; 表バッファをシフトし、裏バッファの27列から順次、表バッファの0列にコピー ;--------------------------------------------------------------------- PWRON MOVLW H'80' MOVWF BOFFSET ; BTFSC DPMODE,0 ; 表示モード確認 GOTO PWRON1 CALL TIM2LED ; 横表示、現在の時刻を裏バッファに格納 GOTO PWRON2 PWRON1 CALL TIM2LEDV ; 縦表示、現在の時刻を裏バッファに格納 PWRON2 CLRF BOFFSET ; MOVLW D'15' MOVWF WTIME MOVLW D'28' MOVWF WKCNT PWRONLP CALL SHIFT ; MOVF WKCNT,W ADDLW LEDBUF-D'1' MOVWF FSR BSF FSR,7 ; 裏バッファ MOVF INDF,W MOVWF LEDBUF ; 表バッファの先頭にコピー BCF FSR,7 CALL WANIM BTFSS WKCNT,0 DECF WTIME,F ; 次第に加速するように DECFSZ WKCNT,F GOTO PWRONLP RETURN ; SHIFT MOVLW D'27' MOVWF WKCNT2 SHIFTLP MOVF WKCNT2,W ADDLW LEDBUF-D'1' MOVWF FSR MOVF INDF,W INCF FSR,F MOVWF INDF DECFSZ WKCNT2,F GOTO SHIFTLP RETURN ;--------------------------------------------------------------------- ; 電源消失時のアニメ表示+LED消灯(列方向 27→0 へ流れる) ;--------------------------------------------------------------------- BLACKOUT CALL BKUPTIM ; LEDBUFのbitが落ちていく感じ ; MOVLW D'28' MOVLW D'36' MOVWF WTIME MOVLW D'27' MOVWF WKCNT BLOUTLP1 MOVF WKCNT,W MOVWF WKCNT2 MOVLW LEDBUF+1 MOVWF FSR BLOUTLP2 MOVF INDF,W DECF FSR,F MOVWF INDF INCF FSR,F INCF FSR,F DECFSZ WKCNT2,F GOTO BLOUTLP2 DECF FSR,F CLRF INDF ; CALL WANIM DECF WTIME,F ; 次第に加速するように ; DECFSZ WKCNT,F GOTO BLOUTLP1 DECF FSR,F MOVLW H'1F' ; 最後にコンデンサの電荷をなくすために表示 MOVWF INDF ; GOTO $ ;--------------------------------------------------------------------- ; 電源消失時のアニメ表示+LED消灯(行方向0→4 へ流れる)未使用 ;--------------------------------------------------------------------- BLACKOUT2 ; LEDBUFのbitが落ちていく感じ MOVLW D'5' MOVWF WKCNT BLOUTLP21 MOVLW D'28' MOVWF WKCNT2 MOVLW LEDBUF MOVWF FSR BLOUTLP22 BCF STATUS,C RLF INDF,F INCF FSR,F DECFSZ WKCNT2,F GOTO BLOUTLP22 ; CALL W40MS ; DECFSZ WKCNT,F GOTO BLOUTLP21 ; RETURN ;--------------------------------------------------------------------- ; 6桁分の時刻を表示バッファに格納 (表バッファと裏バッファを選択) ; BOFFSET=0 : 表、BOFFSET=H'80':裏 ;--------------------------------------------------------------------- TIM2LED MOVLW LEDBUF ; 表示バッファ ADDWF BOFFSET,W MOVWF FSR ; MOVF H10DGT,W BTFSC STATUS,Z GOTO CLRH10 ; ゼロサプレス CALL DSPDGT ; 表示バッファに表示パターン格納 GOTO SETH01 CLRH10 CALL DSPBLANK SETH01 MOVF H01DGT,W CALL DSPDGT ; 表示バッファに表示パターン格納 ; CALL SETCOLON SETM10 MOVF M10DGT,W CALL DSPDGT ; 表示バッファに表示パターン格納 SETM01 MOVF M01DGT,W CALL DSPDGT ; 表示バッファに表示パターン格納 ; CALL SETCOLON SETS10 MOVF S10DGT,W CALL DSPDGT ; 表示バッファに表示パターン格納 SETS01 MOVF S01DGT,W CALL DSPDGT ; 表示バッファに表示パターン格納 ; RETURN ; DSPBLANK ; ゼロサプレス用の空白セット CLRW MOVWF INDF INCF FSR,F MOVWF INDF INCF FSR,F MOVWF INDF INCF FSR,F MOVWF INDF INCF FSR,F RETURN SETCOLON MOVLW B'00001010' MOVWF INDF INCF FSR,F CLRW MOVWF INDF INCF FSR,F RETURN ;--------------------------------------------------------------------- ; 4桁分の縦時刻を表示バッファに格納 ;--------------------------------------------------------------------- TIM2LEDV MOVLW LEDBUF ; 表示バッファ ADDWF BOFFSET,W MOVWF FSR ; SETM01V MOVF M01DGT,W CALL DSPDGTV ; 表示バッファに表示パターン格納 SETM10V MOVF M10DGT,W CALL DSPDGTV ; 表示バッファに表示パターン格納 ; CALL SETCOLONV ; SETH01V MOVF H01DGT,W CALL DSPDGTV ; 表示バッファに表示パターン格納 ; MOVF H10DGT,W BTFSC STATUS,Z GOTO CLRH10V ; ゼロサプレス CALL DSPDGTV ; 表示バッファに表示パターン格納 RETURN CLRH10V CALL DSPBLANKV RETURN ; DSPBLANKV ; ゼロサプレス用の空白セット CLRF INDF INCF FSR,F CLRF INDF INCF FSR,F CLRF INDF INCF FSR,F CLRF INDF INCF FSR,F CLRF INDF INCF FSR,F CLRF INDF INCF FSR,F RETURN SETCOLONV CLRF INDF INCF FSR,F MOVLW B'00001010' MOVWF INDF INCF FSR,F CLRF INDF INCF FSR,F CLRF INDF INCF FSR,F RETURN ;--------------------------------------------------------------------- ; 表示バッファの縦スクロール ; 変化した桁のみスクロールする。 ; 表バッファ●が上方にスクロールして、裏バッファ○が表示される。 ; ; (cur) (1) (2) (3) (4) (5) (6) ; ●●● ● ● ● ● ● ● ●●● ○○○ ; ● ● ● ● ● ● ●●● ○○○ ○ ○ ; ● ● ● ● ●●● ○○○ ○ ○ ○ ○ ; ● ● ●●● ○○○ ○ ○ ○ ○ ○ ○ ; ●●● ○○○ ○ ○ ○ ○ ○ ○ ○○○ ; ;--------------------------------------------------------------------- SCRLUP MOVLW D'6' MOVWF WKCNT SCRLUPLP MOVF S01DGT,W SUBWF S01DGTP,W ; 1秒前と比較 BTFSS STATUS,Z CALL SCRUPS01 ; 1秒の桁をスクロールアップ ; MOVF S10DGT,W SUBWF S10DGTP,W ; 1秒前と比較 BTFSS STATUS,Z CALL SCRUPS10 ; 10秒の桁をスクロールアップ ; MOVF M01DGT,W SUBWF M01DGTP,W ; 1秒前と比較 BTFSS STATUS,Z CALL SCRUPM01 ; 1分の桁をスクロールアップ ; MOVF M10DGT,W SUBWF M10DGTP,W ; 1秒前と比較 BTFSS STATUS,Z CALL SCRUPM10 ; 10分の桁をスクロールアップ ; MOVF H01DGT,W SUBWF H01DGTP,W ; 1秒前と比較 BTFSS STATUS,Z CALL SCRUPH01 ; 1時の桁をスクロールアップ ; MOVF H10DGT,W SUBWF H10DGTP,W ; 1秒前と比較 BTFSS STATUS,Z CALL SCRUPH10 ; 10時の桁をスクロールアップ ; CALL WSCRUP DECFSZ WKCNT,F GOTO SCRLUPLP RETURN SCRUPS01 MOVLW LEDBUF+D'24' MOVWF FSR CALL SCRUPDGT RETURN SCRUPS10 MOVLW LEDBUF+D'20' MOVWF FSR CALL SCRUPDGT RETURN SCRUPM01 MOVLW LEDBUF+D'14' MOVWF FSR CALL SCRUPDGT RETURN SCRUPM10 MOVLW LEDBUF+D'10' MOVWF FSR CALL SCRUPDGT RETURN SCRUPH01 MOVLW LEDBUF+D'4' MOVWF FSR CALL SCRUPDGT RETURN SCRUPH10 MOVLW LEDBUF+D'0' MOVWF FSR CALL SCRUPDGT RETURN ;--------------------------------------------------------------------- ; ひと桁のスクロールアップ ; 対象桁の先頭アドレスをFSRに格納して呼び出す ;--------------------------------------------------------------------- SCRUPDGT MOVLW D'3' MOVWF WKCNT2 SUPDGTLP BSF FSR,7 ; 裏LEDバッファにする RRF INDF,F ; シフトしてLSBをキャリーへ CLRF WK RRF WK,F RRF WK,W BCF FSR,7 ; 表LEDバッファに戻す IORWF INDF,F BCF STATUS,C RRF INDF,F ; 表LEDバッファを縦スクロール(右シフト) INCF FSR,F DECFSZ WKCNT2,F GOTO SUPDGTLP RETURN ; ;--------------------------------------------------------------------- ; ひと桁の縦スクロールアップ ; 対象桁の先頭アドレスをFSRに格納して呼び出す ;--------------------------------------------------------------------- SCRLUPV MOVLW D'6' MOVWF WKCNT SCRLUPVLP MOVF M01DGT,W SUBWF M01DGTP,W ; 1秒前と比較 BTFSS STATUS,Z CALL SCRUPVM01 ; 1分の桁をスクロールアップ ; MOVF M10DGT,W SUBWF M10DGTP,W ; 1秒前と比較 BTFSS STATUS,Z CALL SCRUPVM10 ; 10分の桁をスクロールアップ ; MOVF H01DGT,W SUBWF H01DGTP,W ; 1秒前と比較 BTFSS STATUS,Z CALL SCRUPVH01 ; 1時の桁をスクロールアップ ; MOVF H10DGT,W SUBWF H10DGTP,W ; 1秒前と比較 BTFSS STATUS,Z CALL SCRUPVH10 ; 10時の桁をスクロールアップ ; CALL WSCRUP DECFSZ WKCNT,F GOTO SCRLUPVLP RETURN ; SCRUPVM01 MOVLW LEDBUF+D'4' MOVWF FSR CALL SCRUPVDGT RETURN SCRUPVM10 MOVLW LEDBUF+D'10' MOVWF FSR CALL SCRUPVDGT RETURN SCRUPVH01 MOVLW LEDBUF+D'20' MOVWF FSR CALL SCRUPVDGT RETURN SCRUPVH10 MOVLW LEDBUF+D'26' MOVWF FSR CALL SCRUPVDGT RETURN SCRUPVDGT MOVF FSR,W MOVWF OFFSET ; MOVLW D'4' MOVWF WKCNT2 MOVLW D'5' SUBWF OFFSET,W ADDWF WKCNT,W MOVWF FSR BSF FSR,7 ; 裏バッファ MOVF INDF,W MOVWF TMP BCF FSR,7 MOVF OFFSET,W MOVWF FSR SUPVDGTLP2 DECF FSR,F MOVF INDF,W INCF FSR,F MOVWF INDF DECF FSR,F DECFSZ WKCNT2,F GOTO SUPVDGTLP2 ; MOVF TMP,W ; 裏バッファの値 MOVWF INDF ; RETURN ; ;--------------------------------------------------------------------- ; RTCの初期化 ;--------------------------------------------------------------------- INTRTC ; RTCのバッテリバックアップが有効か確認(最初に電源入れたときも同じ) ; 制御、ステータスレジスタ MOVLW H'0F' MOVWF RTCADDR CALL GETRTC MOVF RTCDATA,W MOVWF RTCFLG ; ; 制御レジスタの設定 MOVLW H'8E' ; 書き込みアドレス MOVWF RTCADDR CLRF RTCDATA ; 方形波周波数1Hz, 方形波出力オン、アラームオフなど CALL PUTRTC ; ; 制御、ステータスレジスタ MOVLW H'8F' ; 書き込みアドレス MOVWF RTCADDR CLRF RTCDATA BSF RTCDATA,4 ; 温度補正の時間間隔:128秒 CALL PUTRTC ; RETURN ;--------------------------------------------------------------------- ; RTCに時刻情報を書き出す ;--------------------------------------------------------------------- WRTRTC MOVLW H'80' ; 秒 MOVWF RTCADDR SWAPF S10DGT,W MOVWF RTCDATA ; 上位4ビットにセット MOVF S01DGT,W IORWF RTCDATA,F ; 下位4ビットにセット CALL PUTRTC ; MOVLW H'81' ; 分 MOVWF RTCADDR SWAPF M10DGT,W MOVWF RTCDATA ; 上位4ビットにセット MOVF M01DGT,W IORWF RTCDATA,F ; 下位4ビットにセット CALL PUTRTC ; MOVLW H'82' ; 時 MOVWF RTCADDR SWAPF H10DGT,W MOVWF RTCDATA ; 上位4ビットにセット MOVF H01DGT,W IORWF RTCDATA,F ; 下位4ビットにセット CALL PUTRTC ; RETURN ; ;--------------------------------------------------------------------- ; RTCから時刻情報を読み出す ;--------------------------------------------------------------------- REDRTC MOVF H10DGT,W ; 現在の情報を記憶(スクロール表示のため) MOVWF H10DGTP MOVF H01DGT,W MOVWF H01DGTP MOVF M10DGT,W MOVWF M10DGTP MOVF M01DGT,W MOVWF M01DGTP MOVF S10DGT,W MOVWF S10DGTP MOVF S01DGT,W MOVWF S01DGTP ; REDRTC2 ; 電源断時の時刻読み出し用 MOVLW H'00' ; 秒 MOVWF RTCADDR CALL GETRTC MOVF RTCDATA,W ANDLW H'0F' ; 下位4ビット(秒) MOVWF S01DGT SWAPF RTCDATA,W ANDLW H'0F' ; 上位4ビット(10秒) MOVWF S10DGT ; MOVLW H'01' ; 分 MOVWF RTCADDR CALL GETRTC MOVF RTCDATA,W ANDLW H'0F' ; 下位4ビット(分) MOVWF M01DGT SWAPF RTCDATA,W ANDLW H'0F' ; 上位4ビット(10分) MOVWF M10DGT ; MOVLW H'02' ; 時 MOVWF RTCADDR CALL GETRTC MOVF RTCDATA,W ANDLW H'0F' ; 下位4ビット(時) MOVWF H01DGT SWAPF RTCDATA,W ANDLW H'0F' ; 上位4ビット(10時) MOVWF H10DGT ; RETURN ; ;--------------------------------------------------------------------- ; RTCに1バイト書き出す; RTCADDRにアドレスセット、RTCDATAにデータセット ;--------------------------------------------------------------------- PUTRTC CALL CSACT ; チップセレクト CALL TXADDR ; アドレス送信 CALL TXDATA ; データ送信 CALL CSINACT ; チップセレクト解除 RETURN ; ;--------------------------------------------------------------------- ; RTCから1バイト読み出す; RTCADDRにアドレスセット、RTCDATAにデータが返る ;--------------------------------------------------------------------- GETRTC CALL CSACT ; チップセレクト CALL TXADDR ; アドレス送信 CALL RXDATA ; データ受信 CALL CSINACT ; チップセレクト解除 RETURN ;--------------------------------------------------------------------- ; RTC Chip Select ;--------------------------------------------------------------------- CSACT BCF PDBUF,6 ; Chip Select Low MOVF PDBUF,W MOVWF PORTD RETURN CSINACT BSF PDBUF,6 ; Chip Select High MOVF PDBUF,W MOVWF PORTD RETURN ; ;--------------------------------------------------------------------- ; RTC SCK ;--------------------------------------------------------------------- SCK_LOW BCF PDBUF,7 ; SCK Low MOVF PDBUF,W MOVWF PORTD RETURN SCK_HIGH BSF PDBUF,7 ; SCK High MOVF PDBUF,W MOVWF PORTD RETURN ; ;--------------------------------------------------------------------- ; RTCへアドレス、データ送信 ;--------------------------------------------------------------------- TXADDR MOVF RTCADDR,W MOVWF TXBUF GOTO TX TXDATA MOVF RTCDATA,W MOVWF TXBUF ; TX MOVLW D'8' MOVWF WKCNT TXLP CALL SCK_LOW ; DATA BCF PABUF,5 ; Data buff 一旦low BTFSC TXBUF,7 BSF PABUF,5 ; Data buff High MOVF PABUF,W MOVWF PORTA RLF TXBUF,F ; CALL SCK_HIGH ; DECFSZ WKCNT,F GOTO TXLP RETURN ;--------------------------------------------------------------------- ; RTCからデータ受信 ;--------------------------------------------------------------------- RXDATA MOVLW D'8' MOVWF WKCNT CLRF RTCDATA BCF STATUS,C RXLP CALL SCK_LOW ; DATA RLF RTCDATA,F BTFSC PORTA,6 ; RTC DOUT BSF RTCDATA,0 ; High ; CALL SCK_HIGH ; DECFSZ WKCNT,F GOTO RXLP RETURN ;--------------------------------------------------------------------- ; Waitルーチン ;--------------------------------------------------------------------- W1MS ; 1ミリ秒(割り込みを考慮) MOVLW D'152' MOVWF WCNT1 W1MSLP GOTO $+1 DECFSZ WCNT1,F GOTO W1MSLP RETURN ; W40MS ; 40ミリ秒 MOVLW D'40' MOVWF WCNT2 W40MSLP CALL W1MS DECFSZ WCNT2,F GOTO W40MSLP RETURN ; W250MS ; 250ミリ秒 MOVLW D'240' MOVWF WCNT2 W250MSLP CALL W1MS DECFSZ WCNT2,F GOTO W250MSLP RETURN ; W10S ; 10秒 MOVLW D'40' MOVWF WK W10SLP CALL GETBRT ; 明るさ測定(約60us要) CALL CHKSW1P ; Modeスイッチ 確認 BTFSC STATUS,Z ; Z=1 でリターン RETURN CALL W250MS DECFSZ WK,F GOTO W10SLP BCF STATUS,Z RETURN ; W1MSSU ; WSCRUP用1ミリ秒(割り込みを考慮) MOVLW D'152' MOVWF WCNT1 W1MSSULP BTFSS PORTB,5 ; 電源断チェック GOTO BLACKOUT DECFSZ WCNT1,F GOTO W1MSSULP RETURN ; WSCRUP ; 数字桁のスクロールアップ待ち時間(40ミリ秒) MOVLW D'40' MOVWF WCNT2 WSCRUPLP CALL W1MSSU DECFSZ WCNT2,F GOTO WSCRUPLP RETURN ; WANIM ; 落下用wait MOVF WTIME,W MOVWF WCNT2 WANIMLP CALL W1MS DECFSZ WCNT2,F GOTO WANIMLP RETURN ;--------------------------------------------------------------------- ; 明るさの測定 ( 4階調 明:3 - 2 - 1 - 0:暗) ;--------------------------------------------------------------------- ORG H'500' GETBRT BSF ADCON0,0 ; A/Dオン CALL WCHARGE ; チャージ待ち BSF ADCON0,1 ; A/D変換開始 BTFSC ADCON0,1 ; A/D変換が終わるまでループ GOTO $-1 ; BCF ADCON0,0 ; A/Dオフ ; SWAPF ADRESH,W ; A/D変換結果を格納(上位4ビットのみ使用) ANDLW H'0F' MOVWF NOWVOL SUBWF PRVVOL,W ; 前回の電圧と比較 BTFSC STATUS,Z ; 変化なしならリターン RETURN BTFSC STATUS,C ; 明るさに敏感に反応しないように、 GOTO GETBRT2 ; 暗くなる時(電圧上昇時)にマイナスオフセットでヒステリシス MOVLW D'1' ; (少し余分に暗くならないと明るさが変わらないように) SUBWF NOWVOL,W BTFSS STATUS,C ; マイナスになったら0 CLRW GOTO GETBRT3 GETBRT2 MOVF NOWVOL,W GETBRT3 MOVWF TMPVOL CALL VOL2BRT ; 電圧から明るさへの変換 MOVWF BRTNES MOVF NOWVOL,W MOVWF PRVVOL RETURN ; VOL2BRT ; 明るさへの変換 MOVLW H'05' MOVWF PCLATH MOVF TMPVOL,W ADDWF PCL,F RETLW D'3' ; 0 明るい RETLW D'3' ; 1 RETLW D'3' ; 2 RETLW D'3' ; 3 RETLW D'3' ; 4 RETLW D'2' ; 5 RETLW D'2' ; 6 RETLW D'2' ; 7 RETLW D'2' ; 8 RETLW D'1' ; 9 RETLW D'1' ; A RETLW D'1' ; B RETLW D'0' ; C RETLW D'0' ; D RETLW D'0' ; E RETLW D'0' ; F 暗い ;--------------------------------------------------------------------- WCHARGE ; 約20usec MOVLW D'20' MOVWF WKCNT WCHGLP DECFSZ WKCNT,F GOTO WCHGLP RETURN ; ;--------------------------------------------------------------------- ; LEDBUFをクリア ;--------------------------------------------------------------------- CLRBUF MOVLW D'28' MOVWF WKCNT MOVLW LEDBUF MOVWF FSR CLRBUFL CLRF INDF INCF FSR,F DECFSZ WKCNT,F GOTO CLRBUFL ; MOVLW D'28' MOVWF WKCNT MOVLW LEDBUF+H'80' MOVWF FSR CLRBUFL2 CLRF INDF INCF FSR,F DECFSZ WKCNT,F GOTO CLRBUFL2 RETURN ; ;--------------------------------------------------------------------- ; SW状態判定 ;--------------------------------------------------------------------- CHKSW1P ; SW1が押されたかチェック BCF STATUS,Z BTFSS SWFLG,0 RETURN BSF STATUS,Z CLRF SWLCNT ; 長押しカウンタクリア RETURN ; CHKSW1R ; SW1が離されたことをチェック Z=1 長押し BCF STATUS,Z ; Zクリア BTFSS SWFLG,0 ; SW1チェック RETURN ; 離された ; CALL CHKSWL ; 長押しチェック BTFSS STATUS,Z GOTO CHKSW1R RETURN ; 長押し CHKSWL ; 長押し判定 MOVF SWLCNT,W SUBLW D'250' ; 割り込み0.256ms * 10 * 250 = 640ms で長押し判定 RETURN ; Z=1 長押し ; ;--------------------------------------------------------------------- ; 明るさ測定・表示 (00〜FFで表示)(動作確認用) ;--------------------------------------------------------------------- DSPBRT CALL GETBRT ; 明るさ測定(約60us要) ; MOVLW LEDBUF+D'0' MOVWF FSR MOVF NOWVOL,W CALL DSPDGT ; MOVLW LEDBUF+D'4' MOVWF FSR MOVF BRTNES,W CALL DSPDGT RETURN ; ;--------------------------------------------------------------------- ; EEPROM読み出し ;--------------------------------------------------------------------- RDEEPROM BANKSEL EEADR MOVF EE_ADDR,W MOVWF EEADR ; Data Memory ; Address to read BANKSEL EECON1 BCF EECON1,EEPGD ; Point to DATA memory BSF EECON1,RD ; EE Read BANKSEL EEDAT MOVF EEDAT,W ; W = EEDATL BANK0 RETURN ;--------------------------------------------------------------------- ; EEPROM書き込み ;--------------------------------------------------------------------- WRTEEPROM BANKSEL EEADR ; MOVF EE_ADDR,W ; MOVWF EEADR ; Data Memory Address to write MOVF EE_DATA,W ; MOVWF EEDAT ; Data Memory Value to write BANKSEL EECON1 BCF EECON1,EEPGD ; Point to DATA memory BSF EECON1,WREN ; Enable writes BCF INTCON,GIE ; Disable INTs. BTFSC INTCON,GIE GOTO $-2 MOVLW 55h ; MOVWF EECON2 ; Write 55h MOVLW 0AAh ; MOVWF EECON2 ; Write AAh BSF EECON1,WR ; Set WR bit to begin write BSF INTCON,GIE ; Enable Interrupts NOP NOP BCF EECON1,WREN BSF INTCON,GIE ; Enable INTs. BANK0 RETURN ;--------------------------------------------------------------------- ; テストパターン表示 ;--------------------------------------------------------------------- TESTPAT MOVLW B'00000001' MOVWF LEDBUF MOVLW B'00000010' MOVWF LEDBUF+D'1' MOVLW B'00000100' MOVWF LEDBUF+D'2' MOVLW B'00001000' MOVWF LEDBUF+D'3' MOVLW B'00010000' MOVWF LEDBUF+D'4' MOVLW B'00001000' MOVWF LEDBUF+D'5' MOVLW B'00000100' MOVWF LEDBUF+D'6' MOVLW B'00000010' MOVWF LEDBUF+D'7' MOVLW B'00000001' MOVWF LEDBUF+D'8' MOVLW B'00000010' MOVWF LEDBUF+D'9' MOVLW B'00000100' MOVWF LEDBUF+D'10' MOVLW B'00001000' MOVWF LEDBUF+D'11' MOVLW B'00010000' MOVWF LEDBUF+D'12' MOVLW B'00001000' MOVWF LEDBUF+D'13' MOVLW B'00011111' MOVWF LEDBUF+D'14' MOVLW B'00011110' MOVWF LEDBUF+D'15' MOVLW B'00011100' MOVWF LEDBUF+D'16' MOVLW B'00011000' MOVWF LEDBUF+D'17' MOVLW B'00010000' MOVWF LEDBUF+D'18' MOVLW B'00011000' MOVWF LEDBUF+D'19' MOVLW B'00011100' MOVWF LEDBUF+D'20' MOVLW B'00011110' MOVWF LEDBUF+D'21' MOVLW B'00011111' MOVWF LEDBUF+D'22' MOVLW B'00011110' MOVWF LEDBUF+D'23' MOVLW B'00011100' MOVWF LEDBUF+D'24' MOVLW B'00011000' MOVWF LEDBUF+D'25' MOVLW B'00010000' MOVWF LEDBUF+D'26' MOVLW B'00011000' MOVWF LEDBUF+D'27' RETURN ;--------------------------------------------------------------------- ; 3分の砂時計表示(RTCのクロックではなく、割り込みによる時間カウント) ; 1ドットが約3秒 x 5ドット(1段)が15秒、4段で1分が目安 ;--------------------------------------------------------------------- ORG H'600' SNDFALL CALL DSPSND ; 砂時計、初期表示 CLRF SNDSEC CLRF ANS CLRF ODD SNDFALL1 MOVLW LEDBUF + D'14' MOVWF FSR CALL GETBRT ; 明るさ測定(約60us要) SNDFALL2 BTFSS PORTB,5 ; 電源断チェック GOTO BLACKOUT ; BTFSC INDF,2 ; 砂が溜まっているところまで落ちる様子を表示 GOTO SNDFALL1 ; MOVLW H'04' ; 砂が流れ落ちる様子 MOVWF INDF CALL WSNDFALL ; 一粒が1ドット落ちる待ち時間 CLRF INDF DECF FSR,F ; CALL CHKSW1P ; Modeスイッチ 確認(押されたら即リターン) BTFSC STATUS,Z ; Z=1 でリターン RETURN ; ; 約1秒たっていたら砂の表示更新 BTFSS SNDSECF,0 GOTO SNDFALL2 ; BCF SNDSECF,0 MOVF FSR,W ; FSR退避 MOVWF WK CALL SNDCKDSP ; 砂の表示 MOVF WK,W MOVWF FSR ; FSR復帰 ; INCF SNDSEC,F ; 約180秒(0.256ms x 254 x 16 x 173 = 179.98s)たっていたら終了(RETURN) MOVF SNDSEC,W SUBLW D'173' BTFSS STATUS,Z GOTO SNDFALL2 CLRF LEDBUF + D'15' BCF STATUS,Z RETURN ; time outで抜ける ; WSNDFALL MOVLW D'14' MOVWF WCNT2 WSNDFALLLP CALL W1MS DECFSZ WCNT2,F GOTO WSNDFALLLP RETURN ;--------------------------------------------------------------------- ; 砂のパターン表示 ;--------------------------------------------------------------------- SNDCKDSP CLRF SNDSECL CLRF SNDSECH CLRF SNDSECF ; CALL DIV15 ; 15で割る CALL OFFROW CALL DSPROW RETURN ; OFFROW ; 埋まる途中の行の点灯 MOVF ODD,W CALL DIV3 ; 3(秒)で割る MOVF ANSDIV3,W MOVWF TMP BCF STATUS,C RLF TMP,F ; MOVF ANS,W SUBLW LEDBUF + D'27' MOVWF FSR CALL OFFROWPAT RETURN ;--------------------------------------------------------------------- ; 上側の減っていく砂と、下に溜まる砂の様子 ;--------------------------------------------------------------------- OFFROWPAT MOVLW H'06' MOVWF PCLATH MOVF TMP,W ADDWF PCL,F BCF INDF,2 RETURN BCF INDF,1 RETURN BCF INDF,3 RETURN BCF INDF,0 RETURN BCF INDF,4 RETURN DSPROW ; 埋まる途中の行の点灯 MOVF ODD,W CALL DIV3 ; 3(秒)で割る MOVF ANSDIV3,W MOVWF TMP ; MOVLW LEDBUF ADDWF ANS,W MOVWF FSR CALL DSPROWPAT1 MOVWF INDF INCF FSR,F CALL DSPROWPAT2 MOVWF INDF RETURN DSPROWPAT1 MOVLW H'06' MOVWF PCLATH MOVF TMP,W ADDWF PCL,F RETLW B'00000110' RETLW B'00001110' RETLW B'00001110' RETLW B'00001111' RETLW B'00011111' DSPROWPAT2 MOVLW H'06' MOVWF PCLATH MOVF TMP,W ADDWF PCL,F RETLW B'00000000' RETLW B'00000000' RETLW B'00000100' RETLW B'00000100' RETLW B'00000100' DIV15 ; 引き算を繰り返して計算 CLRF ANS CLRF ODD MOVF SNDSEC,W MOVWF TMP DIV15LP MOVLW D'15' SUBWF TMP,F BTFSS STATUS,C GOTO DIV15_1 INCF ANS,F GOTO DIV15LP DIV15_1 MOVLW D'15' ADDWF TMP,W MOVWF ODD RETURN DIV3 ; 引き算を繰り返して計算 MOVWF TMP CLRF ANSDIV3 DIV3LP MOVLW D'3' SUBWF TMP,F BTFSS STATUS,C RETURN INCF ANSDIV3,F GOTO DIV3LP ;--------------------------------------------------------------------- ; 開始前の砂の様子 ;--------------------------------------------------------------------- DSPSND ; 最初のパターン表示 MOVLW D'11' MOVWF WKCNT MOVLW LEDBUF+D'27' MOVWF FSR DSPSNDLP1 MOVLW H'1F' MOVWF INDF DECF FSR,F DECFSZ WKCNT,F GOTO DSPSNDLP1 ; MOVLW B'00001110' MOVWF INDF DECF FSR,F MOVLW B'00000100' MOVWF INDF DECF FSR,F ; MOVLW D'15' MOVWF WKCNT DSPSNDLP2 CLRF INDF DECF FSR,F DECFSZ WKCNT,F GOTO DSPSNDLP2 MOVLW H'04' MOVWF LEDBUF ; RETURN ;--------------------------------------------------------------------- ; 電源断時と電源再投入時の時間差確認 ;--------------------------------------------------------------------- TIMLAG CALL RSTRTIM ; 電源断時の時刻読み出し CALL BCD2BIN ; バイナリに変換 MOVF BINTIML,W MOVWF BINTIMPL MOVF BINTIMM,W MOVWF BINTIMPM MOVF BINTIMH,W MOVWF BINTIMPH CALL REDRTC ; 現在(電源投入時)の時刻読み出し CALL BCD2BIN ; バイナリに変換 ; CALL TIMSUB ; 電源断からの経過時間 BTFSC BINTIMH,7 ; マイナスなら0時を跨いだので、強制時計モード. GOTO MODE_CLK ; 深夜零時にリセットしているので通常は起きないはずだが、 ; ; 零時に電源が入っていなかったときのため MOVLW D'3' MOVWF BINTIMPL CLRF BINTIMPM CLRF BINTIMPH CALL TIMSUB ; 経過時間 - 3秒 BTFSC BINTIMH,7 ; マイナスなら3秒以内なので、砂時計モード GOTO MODE_SND ; MODE_CLK ; 通常時計モード BCF STATUS,Z RETURN MODE_SND ; 砂時計モード BSF STATUS,Z RETURN ;--------------------------------------------------------------------- ; 24ビット引き算 ;--------------------------------------------------------------------- TIMSUB ; 24ビットの引き算(BINTIMx - BINTIMPx) MOVF BINTIMPL,W SUBWF BINTIML,F MOVLW D'1' BTFSS STATUS,C SUBWF BINTIMM,F BTFSS STATUS,C SUBWF BINTIMH,F ; MOVF BINTIMPM,W SUBWF BINTIMM,F MOVLW D'1' BTFSS STATUS,C SUBWF BINTIMH,F ; MOVF BINTIMPH,W SUBWF BINTIMH,F RETURN ;--------------------------------------------------------------------- ; 午前零時に電源断時刻をリセット(SRAM) ;--------------------------------------------------------------------- CHKMIDN MOVF H10DGT,F BTFSS STATUS,Z RETURN MOVF H01DGT,F BTFSS STATUS,Z RETURN MOVF M10DGT,F BTFSS STATUS,Z RETURN MOVF M01DGT,F BTFSS STATUS,Z RETURN MOVF S10DGT,F BTFSS STATUS,Z RETURN MOVF S01DGT,F BTFSS STATUS,Z RETURN CALL BKUPTIM RETURN ;--------------------------------------------------------------------- ; 電源断時に、時刻をSRAMに格納 ;--------------------------------------------------------------------- BKUPTIM CALL REDRTC2 ; MOVLW H'98' ; SRAMアドレス 書込みアドレス MOVWF RTCADDR CALL PUTRTC CLRF RTCDATA ; SRAMアドレス '00' CALL PUTRTC ; 連続データアクセスでアドレスは自動インクリメント ; MOVLW H'99' ; SRAMデータ 書込みアドレス MOVWF RTCADDR ; SWAPF S10DGT,W ; 10秒 MOVWF RTCDATA ; 上位4ビットにセット MOVF S01DGT,W IORWF RTCDATA,F ; 下位4ビットにセット CALL PUTRTC ; SWAPF M10DGT,W MOVWF RTCDATA ; 上位4ビットにセット MOVF M01DGT,W IORWF RTCDATA,F ; 下位4ビットにセット CALL PUTRTC ; SWAPF H10DGT,W MOVWF RTCDATA ; 上位4ビットにセット MOVF H01DGT,W IORWF RTCDATA,F ; 下位4ビットにセット CALL PUTRTC ; RETURN ;--------------------------------------------------------------------- ; SRAMから電源断時の時刻を読み出し ;--------------------------------------------------------------------- RSTRTIM MOVLW H'98' ; SRAMアドレス 書込みアドレス MOVWF RTCADDR CALL PUTRTC CLRF RTCDATA ; SRAMアドレス '00' CALL PUTRTC ; 連続データアクセスでアドレスは自動インクリメント ; MOVLW H'19' ; SRAMデータ 読み出しアドレス MOVWF RTCADDR ; CALL GETRTC MOVF RTCDATA,W ANDLW H'0F' ; 下位4ビット(秒) MOVWF S01DGT SWAPF RTCDATA,W ANDLW H'0F' ; 上位4ビット(10秒) MOVWF S10DGT ; CALL GETRTC MOVF RTCDATA,W ANDLW H'0F' ; 下位4ビット(分) MOVWF M01DGT SWAPF RTCDATA,W ANDLW H'0F' ; 上位4ビット(10分) MOVWF M10DGT ; CALL GETRTC MOVF RTCDATA,W ANDLW H'0F' ; 下位4ビット(時) MOVWF H01DGT SWAPF RTCDATA,W ANDLW H'0F' ; 上位4ビット(10時) MOVWF H10DGT ; RETURN ;--------------------------------------------------------------------- ; BCD2BIN ;--------------------------------------------------------------------- BCD2BIN CLRF BINTIML ; バイナリ時刻レジスタ CLRF BINTIMM CLRF BINTIMH MOVF S01DGT,W ; 1秒 MOVWF BINTIML MOVF S10DGT,W ; 10秒 MOVWF TMP CALL SEC10S ADDWF BINTIML,F ; BCF STATUS,C RLF M01DGT,W ; 1分 MOVWF TMP CALL SEC01M ADDWF BINTIML,F BTFSC STATUS,C INCF BINTIMM,F INCF TMP,F CALL SEC01M ADDWF BINTIMM,F ; BCF STATUS,C RLF M10DGT,W ; 10分 MOVWF TMP CALL SEC10M ADDWF BINTIML,F BTFSC STATUS,C INCF BINTIMM,F INCF TMP,F CALL SEC10M ADDWF BINTIMM,F ; BCF STATUS,C RLF H01DGT,W ; 1時 MOVWF TMP CALL SEC01H ADDWF BINTIML,F BTFSC STATUS,C INCF BINTIMM,F INCF TMP,F CALL SEC01H ADDWF BINTIMM,F ; MOVF H10DGT,W ; 10時 MOVWF TMP BCF STATUS,C RLF TMP,F BCF STATUS,C RLF TMP,F CALL SEC10H ADDWF BINTIML,F BTFSC STATUS,C INCF BINTIMM,F INCF TMP,F CALL SEC10H ADDWF BINTIMM,F BTFSC STATUS,C INCF BINTIMH,F INCF TMP,F CALL SEC10H ADDWF BINTIMH,F RETURN SEC10S MOVLW H'07' MOVWF PCLATH MOVF TMP,W ADDWF PCL,F RETLW D'0' RETLW D'10' RETLW D'20' RETLW D'30' RETLW D'40' RETLW D'50' SEC01M MOVLW H'07' MOVWF PCLATH MOVF TMP,W ADDWF PCL,F RETLW D'0' RETLW D'0' RETLW D'60' ; 1分->60秒 RETLW D'0' RETLW D'120' ; 2分->120秒 RETLW D'0' RETLW D'180' ; 3分->180秒 RETLW D'0' RETLW D'240' ; 4分->240秒 RETLW D'0' RETLW H'2C' ; 5分->300秒 RETLW H'01' RETLW H'68' ; 6分->360秒 RETLW H'01' RETLW H'A4' ; 7分->420秒 RETLW H'01' RETLW H'E0' ; 8分->480秒 RETLW H'01' RETLW H'1C' ; 9分->540秒 RETLW H'02' SEC10M MOVLW H'07' MOVWF PCLATH MOVF TMP,W ADDWF PCL,F RETLW D'0' ; 0分 RETLW D'0' RETLW D'58' ; 10分->600秒 RETLW D'02' RETLW H'B0' ; 20分->1200秒 RETLW H'04' RETLW H'08' ; 30分->1800秒 RETLW H'07' RETLW H'60' ; 40分->2400秒 RETLW H'09' RETLW H'B8' ; 50分->3000秒 RETLW H'0B' SEC01H ; 時->秒 MOVLW H'07' MOVWF PCLATH MOVF TMP,W ADDWF PCL,F RETLW H'00' ;0秒 RETLW H'00' RETLW H'10' ; 1時->3600秒 RETLW H'0E' RETLW H'20' ; 2時->7200秒 RETLW H'1C' RETLW H'30' ; 3時->10800秒 RETLW H'2A' RETLW H'40' ; 4時->14400秒 RETLW H'38' RETLW H'50' ; 5時->18000秒 RETLW H'46' RETLW H'60' ; 6時->21600秒 RETLW H'54' RETLW H'70' ; 7時->25200秒 RETLW H'62' RETLW H'80' ; 8時->28800秒 RETLW H'70' RETLW H'90' ; 9時->32400秒 RETLW H'7E' SEC10H ; 10時->秒 MOVLW H'07' MOVWF PCLATH MOVF TMP,W ADDWF PCL,F RETLW H'00' ;0秒 RETLW H'00' RETLW H'00' RETLW H'00' RETLW H'A0' ;10H->36000秒 RETLW H'8C' RETLW H'00' RETLW H'00' RETLW H'40' ;20H->72000秒 RETLW H'19' RETLW H'01' RETLW H'00' ;--------------------------------------------------------------------- END ;--------------------------------------------------------------------- ; 終わり ;---------------------------------------------------------------------