PORTB_OLD equ 0x23 DARK_TH equ 0x24 movfw PORTB andlw B'00000011' ; スイッチのついているビットだけ取り出す movwf PORTB_OLD ; 直前のPORTBの値として覚えておく movlw 0xff movwf DARK_TH ; 真っ暗でないと反応しない loop ; A-D変換する bsf ADCON0,GO ; A-D変換開始 btfsc ADCON0,GO ; A-D変換終了まで待つ goto $-1 movfw PORTB ; 時刻tのスイッチの状態をwへ andlw B'00000001' ; スイッチ0のついているビットだけ取り出す xorwf PORTB_OLD,f ; 排他的論理和をとりスイッチの状態が ; 変わったかチェックする(wは変化しない) ; 変化がないなら0になる movwf PORTB_OLD ; w (時刻tのスイッチの状態)を代入(zは変化しない) btfsc STATUS,Z ; 0かチェック goto chk01 ; 0なので変化していない ;; スイッチ0が押されたかチェック btfsc PORTB_OLD,0 ; スイッチ0が0かチェック goto chk01 ; 0なので変化していない ;; スイッチ0が押された movfw ADRESH movwf DARK_TH chk01 movfw ADRESH ; w に変換結果を代入 subwf DARK_TH,w ; 暗さの閾値と比較をする ; DARK_TH−wの結果が負(Cが0)なら暗い btfss STATUS,C goto blink_LED ; LEDを点滅させる ;; 20ms 待つ movlw D'20' movwf CT_DELAY_LOOP call delay1ms decfsz CT_DELAY_LOOP,f goto $-2 goto loop リスト5-6 Copyright 2005 Noriaki Mitsunaga