;--------------------------------------------------------------------- ; マトリクスLEDによるデジタルクロック ; 2008.12.30 ; naka ; マトリクスLED ; 下図のような 5x17 で■の場所のみLEDがある ; ; ■■■□■■■□□□■■■□■■■ ; ■■■□■■■□■□■■■□■■■ ; ■■■□■■■□□□■■■□■■■ ; ■■■□■■■□■□■■■□■■■ ; ■■■□■■■□□□■■■□■■■ ; ; 数字フォント ; ■■■ ■ ■■■ ■■■ ■ ■ ; ■ ■ ■■ ■ ■ ■ ■ ; ■ ■ ■ ■■■ ■■■ ■■■ ; ■ ■ ■ ■ ■ ■ ; ■■■ ■■■ ■■■ ■■■ ■ ; ; ■■■ ■■■ ■■■ ■■■ ■■■ ; ■ ■ ■ ■ ■ ■ ■ ; ■■■ ■■■ ■ ■■■ ■■■ ; ■ ■ ■ ■ ■ ■ ■ ; ■■■ ■■■ ■ ■■■ ■■■ ; ; 機能など ; ・瞬断対策として1Fの電気二重層キャパシタでバックアップ(約10分) ; (電源断の間はLED表示はOFF) ; ・周囲の明るさに応じて、LEDの明るさを5段階に変更(PWM) ; ;--------------------------------------------------------------------- ; I/Oポート ; (1). RA1〜5 [out] : アノード側TR ; (2). RB0〜7,RC0〜RC4 [out] : カソード側TR ; (3). RC5 [in] : 時刻設定セット/ADJUST SW ; (4). RC6 [in] : 時刻設定モードSW ; (5). RC7 [in] : 瞬断検知用(5Vを監視) ; (6). RA0(AN0) [in] : 明るさ情報 ;--------------------------------------------------------------------- ;--------------------------------------------------------------------- ; デバイス定義 ;--------------------------------------------------------------------- LIST P=PIC16F873A INCLUDE "P16F873A.INC" __CONFIG _HS_OSC & _CPD_OFF & _CP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _DEBUG_OFF ERRORLEVEL -302 ;アセンブル時のバンク警告メッセージ抑制 ;--------------------------------------------------------------------- ; 変数レジスタの定義(BANK0) ;--------------------------------------------------------------------- H10PTN EQU 020H ; 020H-022H 10時数字パターン H01PTN EQU 023H ; 023H-025H 01時数字パターン COLPTN EQU 026H ; 026H : パターン M10PTN EQU 027H ; 027H-029H 10分数字パターン M01PTN EQU 02AH ; 02AH-02CH 01時数字パターン ROWCNT EQU 02DH ; 表示ラインカウンタ(0〜12) ; H10DGT EQU 030H ; 10時 H01DGT EQU 031H ; 01時 M10DGT EQU 032H ; 10分 M01DGT EQU 033H ; 01分 SECDIG EQU 034H ; 秒 SECFLG EQU 035H ; 0 : 秒フラグ ; 1 : 明るさセンスフラグ SECLOW EQU 036H ; 秒カウンタ(下位) SECHIGH EQU 037H ; 秒カウンタ(上位) ; FLAG EQU 040H ; 0 : モードスイッチ ; 1 : セットスイッチ ; 2 : 時刻設定モード(点滅判断) ; 3 : 空き ; 4 : 10時設定中 ; 5 : 1時設定中 ; 6 : 10分設定中 ; 7 : 1分設定中 OFFSET EQU 041H WKCNT EQU 042H NUMBER EQU 043H WAIT EQU 044H SMPLCNT EQU 045H ; チャタリング回避用(割り込み10回:3.2ms) BRTNES EQU 046H ; 現在の明るさ DSPCNT EQU 047H ; 表示カウンタ(割り込み4回に1度切り替え) ; NOWVOL EQU 048H ; 明るさ測定電圧(今回の電圧) PRVVOL EQU 049H ; 前回測定時の電圧 TMPVOL EQU 04AH ; 一時電圧 ; BKUPW EQU 060H ; Wレジ待避用 BKUPS EQU 061H ; STATUSレジ待避用 BKUPFR EQU 062H ; FSRレジ待避用 BKUPPCL EQU 063H ; PCLHレジ待避用 ; ; 最後は 07FH ;--------------------------------------------------------------------- ; マクロ定義 ;--------------------------------------------------------------------- BANK0 MACRO BCF STATUS,RP0 ;BANK0に切り替える ENDM BANK1 MACRO BSF STATUS,RP0 ;BANK1に切り替える ENDM ;--------------------------------------------------------------------- ; 割り込みベクタ ;--------------------------------------------------------------------- ORG 00H ; リセット時の飛び込み先 RESET GOTO START ; ORG 04H ; 割り込み時の飛び込み先 INTER ; GOTO INTRUPT ; ;--------------------------------------------------------------------- ; メイン ;--------------------------------------------------------------------- START CALL INIT ; 初期化 MAIN BTFSC FLAG,1 ; ADJUSTモード CALL ADJTIME ; BTFSC FLAG,0 ; 時刻設定モード CALL SETTIME ; BTFSS SECFLG,0 ; 秒フラグ確認 GOTO MAIN ; BCF SECFLG,0 ; 秒フラグクリア CALL COUNTUP CALL SET4DGT GOTO MAIN ; ;--------------------------------------------------------------------- ; 初期化 ;--------------------------------------------------------------------- INIT BCF INTCON,GIE ;全割込み禁止 ; MOVLW B'10000000' ; ADCS:FOSC/32:10, CHS:ch0/000 MOVWF ADCON0 ; BANK1 MOVLW B'00001110' ; ADDF:0,ADCS2:0, AN0以外をデジタル入出力 MOVWF ADCON1 MOVLW B'00000001' MOVWF TRISA ;ポートAは0入力(アナログ)、1-5出力 CLRF TRISB ;ポートBは全て出力端子 MOVLW B'11100000' MOVWF TRISC ;ポートCはRC0〜4は出力、RC5〜7は入力 BANK0 ; BCF INTCON,GIE ; 割り込み禁止 BANK1 ;割り込みタイマーセット MOVLW H'81' ; プリスケーラを4にする MOVWF OPTION_REG ; 3.125KHzで割り込みが入るはず BANK0 ; clock 12.8MHz -> 3.2Mcycle ; 3.2Mcycle/(4*256)=3.125KHz(=320usec毎) ; CLRF ROWCNT ; クリア CLRF FLAG CLRF ROWCNT ; 表示ラインカウンタクリア CLRF SECLOW ; 秒カウンタ(下位)クリア CLRF SECHIGH ; 秒カウンタ(上位)クリア CLRF SECFLG ; 秒フラグクリア CLRF SECDIG CLRF M01DGT CLRF M10DGT CLRF H01DGT CLRF H10DGT CALL SET4DGT ; 初期値" 0:00"表示 MOVLW D'3' MOVWF SMPLCNT ; SW状態のサンプリング間隔(3*320us=約1ms) CLRF BRTNES ; 明るさ CLRF PRVVOL ; 明るさ測定時の前回電圧 CLRF DSPCNT ; BSF INTCON,T0IE ;RTCCマスクイネーブル BSF INTCON,GIE ;割り込み許可 RETURN ; ;--------------------------------------------------------------------- ; 割り込み処理で1秒のカウントと、時刻のダイナミック表示を行う。 ; 3,125回で1秒 ; 3.125KHz(320us毎)の割り込みで表示バッファを順次ポート出力する。 ;--------------------------------------------------------------------- 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 ; 割り込みフラグリセット ; ; 1秒カウント ; INCF SECLOW,F BTFSC STATUS,Z INCF SECHIGH,F ; MOVLW D'12' ; 12*256 + 53 = 3125 SUBWF SECHIGH,W ; BTFSS STATUS,Z ; GOTO END1S ; 1秒カウント終わり MOVLW D'53' ; SUBWF SECLOW,W BTFSS STATUS,Z GOTO END1S ; 1秒カウント終わり ; CLRF SECLOW CLRF SECHIGH BSF SECFLG,0 ; 1秒経ったのでSECFLGセット END1S BTFSC PORTC,7 ; 停電監視 GOTO DISPROW ; 表示 CALL DISPOFF ; LED消灯 GOTO INTRTRN ; リターン ; DISPROW ; 時刻設定モード時に数字を点滅 BTFSC FLAG,2 ; モード確認 CALL BLNKDGT ; MOVF DSPCNT,F ; 表示切り替えタイミング確認(割り込み4回に1回) BTFSS STATUS,Z ; 320us * 4 * 13列 = 16.64ms = 60Hz GOTO DISPSKP ; それ以外のタイミングでは表示切り替えスキップ ; 表示列の切り替え CALL DISPOFF ; まずLED消灯 MOVLW D'8' ; 8未満と以上でPORT切り替え SUBWF ROWCNT,W BTFSC STATUS,C GOTO SETROWH ; 8以上ならPORTC MOVF ROWCNT,W CALL DECBIT MOVWF PORTB CLRF PORTC GOTO DISPROWE SETROWH CALL DECBIT MOVWF PORTC CLRF PORTB DISPROWE ; 表示バッファ内容を1列分出力 CALL WAIT20US ; 列スキャン側のTrの反応が遅いのでWait ; MOVLW H10PTN ; 表示バッファ(10時)の先頭アドレス ADDWF ROWCNT,W ; 現在の列カウンタを足す MOVWF FSR ; FSR にアドレスをセット COMF INDF,W ; 現在の列の内容を反転して読み込む MOVWF PORTA ; PortAに出力 ; INCF ROWCNT,F ; 次回、次の列を表示するためにインクリメント MOVLW D'13' SUBWF ROWCNT,W BTFSC STATUS,Z CLRF ROWCNT DISPSKP MOVF BRTNES,F BTFSC STATUS,Z CALL WAIT20US ; 0 の時(夜中)は20us幅の明るさ INCF DSPCNT,W ; 明るさ(0〜4)との比較 SUBWF BRTNES,W BTFSC STATUS,C GOTO $+2 ; 表示継続、明るさ取得へ CALL DISPOFF ; 表示OFF ; BTFSS SECFLG,1 ; 明るさ取得はコロンが消えたタイミング(2秒毎) GOTO SMPLSW ; コロンが点灯していると明るさを誤認識する場合があるので。 CALL GETBRT ; 約60us要 BCF SECFLG,1 ; 明るさ取得フラグクリア ; SMPLSW INCF DSPCNT,W ANDLW H'03' MOVWF DSPCNT ; ; スイッチの状態確認 DECFSZ SMPLCNT,F ; チャタリング回避のためのサンプル時間確認 GOTO INTRTRN ; リターン ; MOVLW D'3' ; 次回のためにカウンタセット MOVWF SMPLCNT ; BCF FLAG,0 ; モードスイッチクリア BTFSS PORTC,6 BSF FLAG,0 ; モードスイッチON ; BCF FLAG,1 ; セット/ADJUSTスイッチクリア BTFSS PORTC,5 BSF FLAG,1 ; セットスイッチON ; 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レジ値をビット位置にデコード ;--------------------------------------------------------------------- DECBIT 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 ; ;--------------------------------------------------------------------- ; 表示OFF ;--------------------------------------------------------------------- DISPOFF CLRF PORTB CLRF PORTC MOVLW B'01111110' MOVWF PORTA RETURN ;--------------------------------------------------------------------- ; 時刻設定モード時の桁点滅 ;--------------------------------------------------------------------- BLNKDGT MOVF SECHIGH,F ; 0 or 6のとき、表示ON BTFSC STATUS,Z GOTO CHKONL MOVLW D'6' SUBWF SECHIGH,W BTFSS STATUS,Z GOTO CHKOFF CHKONL MOVF SECLOW,F BTFSS STATUS,Z GOTO CHKOFF BLNKON MOVF H10DGT,W MOVWF NUMBER MOVLW H10PTN MOVWF FSR CALL DSPDGT ; 表示バッファに表示パターン格納 ; MOVF H01DGT,W MOVWF NUMBER MOVLW H01PTN MOVWF FSR CALL DSPDGT ; 表示バッファに表示パターン格納 ; MOVF M10DGT,W MOVWF NUMBER MOVLW M10PTN MOVWF FSR CALL DSPDGT ; 表示バッファに表示パターン格納 ; MOVF M01DGT,W MOVWF NUMBER MOVLW M01PTN BLNKON2 MOVWF FSR CALL DSPDGT ; 表示バッファに表示パターン格納 RETURN ; CHKOFF MOVLW D'3' ; 3 or 9 で表示オフ SUBWF SECHIGH,W BTFSC STATUS,Z GOTO CHKOFFL MOVLW D'9' SUBWF SECHIGH,W BTFSS STATUS,Z RETURN CHKOFFL MOVF SECLOW,F BTFSS STATUS,Z RETURN BLNKOFF BTFSS FLAG,4 GOTO $+4 CLRF H10PTN CLRF H10PTN+1 CLRF H10PTN+2 ; BTFSS FLAG,5 GOTO $+4 CLRF H01PTN CLRF H01PTN+1 CLRF H01PTN+2 ; BTFSS FLAG,6 GOTO $+4 CLRF M10PTN CLRF M10PTN+1 CLRF M10PTN+2 ; BTFSS FLAG,7 RETURN CLRF M01PTN CLRF M01PTN+1 CLRF M01PTN+2 RETURN ; ;--------------------------------------------------------------------- ; 時刻アジャスト(秒を四捨五入:30秒以上なら分繰り上げ) ;--------------------------------------------------------------------- ADJTIME MOVLW D'30' SUBWF SECDIG,W BTFSC STATUS,C CALL CNTUPMIN ; 分をカウントアップ ; CLRF SECLOW ; 秒カウンタ(下位)クリア CLRF SECHIGH ; 秒カウンタ(上位)クリア CLRF SECDIG ; 秒をクリア BCF SECFLG,0 ; 秒フラグクリア CALL SET4DGT ; 表示 ; BTFSC FLAG,1 ; スイッチが離される迄待つ GOTO $-1 ; RETURN ; ;--------------------------------------------------------------------- ; 時刻設定モード(時、分の各桁毎に数字をカウントアップ) ;--------------------------------------------------------------------- SETTIME BSF FLAG,2 ; 時刻設定モード BTFSC FLAG,0 ; モードSWが離されるまで待つ GOTO $-1 ; SET10H BSF FLAG,4 ; 10の位 設定モード(数字が点滅) BTFSC FLAG,1 ; セットスイッチが押された? GOTO INC10H ; BTFSS FLAG,0 ; モードスイッチが押された? GOTO SET10H BCF FLAG,4 CALL BLNKON BTFSC FLAG,0 ; モードSWが離されるまで待つ GOTO $-1 GOTO SET01H INC10H INCF H10DGT,F MOVLW D'3' SUBWF H10DGT,W BTFSC STATUS,Z CLRF H10DGT ; BTFSC FLAG,1 ; 離されるまで待つ GOTO $-1 GOTO SET10H ; SET01H BSF FLAG,5 ; 1の位 設定モード(数字が点滅) BTFSC FLAG,1 ; セットスイッチが押された? GOTO INC01H ; BTFSS FLAG,0 ; モードスイッチが押された? GOTO SET01H BCF FLAG,5 CALL BLNKON BTFSC FLAG,0 ; モードSWが離されるまで待つ GOTO $-1 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 ; BTFSC FLAG,1 ; 離されるまで待つ GOTO $-1 GOTO SET01H ; SET10M BSF FLAG,6 ; 1の位 設定モード(数字が点滅) BTFSC FLAG,1 ; セットスイッチが押された? GOTO INC10M ; BTFSS FLAG,0 ; モードスイッチが押された? GOTO SET10M BCF FLAG,6 CALL BLNKON BTFSC FLAG,0 ; モードSWが離されるまで待つ GOTO $-1 GOTO SET01M ; INC10M INCF M10DGT,F MOVLW D'6' SUBWF M10DGT,W BTFSC STATUS,Z CLRF M10DGT ; BTFSC FLAG,1 ; 離されるまで待つ GOTO $-1 GOTO SET10M ; SET01M BSF FLAG,7 ; 1の位 設定モード(数字が点滅) BTFSC FLAG,1 ; セットスイッチが押された? GOTO INC01M ; BTFSS FLAG,0 ; モードスイッチが押された? GOTO SET01M BCF FLAG,7 CALL BLNKON BTFSC FLAG,0 ; モードスイッチが離されたらモード終わり GOTO $-1 GOTO SETEND INC01M INCF M01DGT,F MOVLW D'10' SUBWF M01DGT,W BTFSC STATUS,Z CLRF M01DGT ; BTFSC FLAG,1 ; 離されるまで待つ GOTO $-1 GOTO SET01M ; SETEND BCF FLAG,2 ; 時刻設定モード終了 CLRF SECLOW ; 秒カウンタ(下位)クリア CLRF SECHIGH ; 秒カウンタ(上位)クリア CLRF SECDIG ; 秒をクリア BCF SECFLG,0 ; 秒フラグクリア CALL SET4DGT ; 表示 RETURN ; ;--------------------------------------------------------------------- ; 時刻カウントアップ ;--------------------------------------------------------------------- COUNTUP CALL TGLCOL ; :(コロン)表示をトグル ; INCF SECDIG,F ; 秒カウントアップ MOVLW D'60' SUBWF SECDIG,W BTFSS STATUS,Z RETURN CLRF SECDIG ; 秒クリア ; CNTUPMIN INCF M01DGT,F ; 分(1の位)カウントアップ MOVLW D'10' SUBWF M01DGT,W BTFSS STATUS,Z RETURN CLRF M01DGT ; INCF M10DGT,F ; 分(10の位)カウントアップ MOVLW D'6' SUBWF M10DGT,W BTFSS STATUS,Z RETURN CLRF M10DGT ; INCF H01DGT,F ; 時(1の位)カウントアップ MOVLW D'10' SUBWF H01DGT,W BTFSC STATUS,Z GOTO H10UP ; MOVLW D'4' ; 24時のチェック SUBWF H01DGT,W BTFSS STATUS,Z RETURN MOVLW D'2' SUBWF H10DGT,W BTFSS STATUS,Z RETURN CLRF H01DGT CLRF H10DGT RETURN H10UP CLRF H01DGT INCF H10DGT,F ; 時(10の位)カウントアップ RETURN ; ;--------------------------------------------------------------------- ; :(コロン)の表示/非表示(呼び出すたびにトグルする) ;--------------------------------------------------------------------- TGLCOL BTFSS COLPTN,2 ; 表示中ならクリア GOTO TGLCOL1 CLRF COLPTN BSF SECFLG,1 ; 明るさセンスフラグ・オン RETURN TGLCOL1 MOVLW B'00010100' ; :(コロン) MOVWF COLPTN RETURN ; ;--------------------------------------------------------------------- ; 4桁分の時刻を表示バッファに格納 ;--------------------------------------------------------------------- SET4DGT MOVF H10DGT,W BTFSC STATUS,Z GOTO CLRH10 ; ゼロサプレス MOVWF NUMBER MOVLW H10PTN ; 表示バッファ MOVWF FSR CALL DSPDGT ; 表示バッファに表示パターン格納 GOTO SETH01 CLRH10 CLRF H10PTN CLRF H10PTN+1 CLRF H10PTN+2 SETH01 MOVF H01DGT,W MOVWF NUMBER MOVLW H01PTN ; 表示バッファ MOVWF FSR CALL DSPDGT ; 表示バッファに表示パターン格納 ; MOVF M10DGT,W MOVWF NUMBER MOVLW M10PTN ; 表示バッファ MOVWF FSR CALL DSPDGT ; 表示バッファに表示パターン格納 SETM01 MOVF M01DGT,W MOVWF NUMBER MOVLW M01PTN ; 表示バッファ MOVWF FSR CALL DSPDGT ; 表示バッファに表示パターン格納 ; RETURN ;--------------------------------------------------------------------- ; 一桁分の数字(3x5ドット)を表示バッファに設定 ; NUMBER:数値(0〜9) ... 破壊される ; FSR :表示バッファアドレスの先頭を格納 ... 破壊される ;--------------------------------------------------------------------- ORG H'200' DSPDGT CLRF OFFSET ; 列カウンタクリア MOVLW D'3' 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'00111110' RETLW B'00100010' RETLW B'00111110' RETLW B'00000000' ; digit 1 RETLW B'00100100' RETLW B'00111110' RETLW B'00100000' RETLW B'00000000' ; digit 2 RETLW B'00111010' RETLW B'00101010' RETLW B'00101110' RETLW B'00000000' ; digit 3 RETLW B'00101010' RETLW B'00101010' RETLW B'00111110' RETLW B'00000000' ; digit 4 RETLW B'00001110' RETLW B'00001000' RETLW B'00111110' RETLW B'00000000' ; digit 5 RETLW B'00101110' RETLW B'00101010' RETLW B'00111010' RETLW B'00000000' ; digit 6 RETLW B'00111110' RETLW B'00101010' RETLW B'00111010' RETLW B'00000000' ; digit 7 RETLW B'00000010' RETLW B'00111010' RETLW B'00000110' RETLW B'00000000' ; digit 8 RETLW B'00111110' RETLW B'00101010' RETLW B'00111110' RETLW B'00000000' ; digit 9 RETLW B'00101110' RETLW B'00101010' RETLW B'00111110' RETLW B'00000000' ; ;--------------------------------------------------------------------- ; Waitルーチン ;--------------------------------------------------------------------- WAIT20US ; 20us wait ( 64cycle .. 1cycle = 0.313us) MOVLW D'20' ;1cycle MOVWF WAIT ;1cycle W20USLP DECFSZ WAIT,F ;1cycle*19+2cycle=21cycle GOTO W20USLP ;2cycle*19 =38cycle NOP ;1cycle RETURN ;2cycle ; ;--------------------------------------------------------------------- ; 明るさの測定 ( 5階調 明:4 - 3 - 2 - 1 - 0:暗) ;--------------------------------------------------------------------- GETBRT BSF ADCON0,0 ; A/Dオン CALL WCHARGE ; チャージ待ち BSF ADCON0,2 ; A/D変換開始 BTFSC ADCON0,2 ; A/D変換が終わるまでループ GOTO $-1 ; BCF ADCON0,0 ; A/Dオフ ; MOVF ADRESH,W ; A/D変換結果を格納(上位8ビットのみ使用) MOVWF NOWVOL SUBWF PRVVOL,W ; 前回の電圧と比較 BTFSC STATUS,Z ; 変化なしならリターン RETURN BTFSC STATUS,C ; 明るさに敏感に反応しないように、 GOTO GETBRT2 ; 暗くなる時(電圧上昇時)にマイナスオフセットでヒステリシス MOVLW D'10' ; (少し余分に暗くならないと明るさが変わらないように) 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 ; 明るさへの変換 BTFSC TMPVOL,7 ; 電圧が高い(暗い) RETLW D'0' BTFSC TMPVOL,6 ; RETLW D'1' BTFSC TMPVOL,5 ; RETLW D'2' BTFSC TMPVOL,4 ; RETLW D'3' RETLW D'4' ; 明るい ;--------------------------------------------------------------------- WCHARGE ; 約20usec MOVLW D'20' MOVWF WKCNT WCHGLP DECFSZ WKCNT,F GOTO WCHGLP RETURN ; ;--------------------------------------------------------------------- END ;--------------------------------------------------------------------- ; 終わり ;---------------------------------------------------------------------