; Copyright 2004 Sugihara Toshio. #include ; PIC12F675 ; Clock=Internal RC NO Clock 4MHz 1M order/s ; WDT=off, PowerUpTimer=on ; Protect=off, Oscllator=Internal RC ; GP3=MCLR, BrownOutDetect=off ; 変数の定義 kando equ H'20' ;感度 wait1 equ H'21' wait2 equ H'22' advalue equ H'23' ledcount equ H'24' ;表示制御用 ; はじまり ; リセットで始まる場合 org H'00' boot goto start ; 割り込みではじまる場合 org H'04' warikomi bsf STATUS,5 ;Select Bank 1 clrf PIE1 clrf STATUS ;Select Bank 0 movf GPIO, W ;Read GPIO to stop warikomi status clrf ADCON0 clrf PIR1 clrf INTCON ;Clear GPIF retfie ; 通常の起動 start ;割り込みの禁止 clrf INTCON ;bank0が選択されている ; I/Oの初期化 clrf GPIO movlw H'07' ; コンパレータを使わない movwf CMCON bsf STATUS,RP0 ;Select Bank 1 movlw B'11111011';ポート2以外はすべて入力 movwf TRISIO movlw B'00110000';ポート4,5だけプルアップ movwf WPU bcf OPTION_REG, 7 ; プルアップを有効に movlw B'00110001'; 内蔵RCでポート0を movwf ANSEL ; AD変換ポートに設定 bcf STATUS,RP0 ;Select Bank 0 clrf GPIO ;LEDは消灯 ; 変数の初期化 movlw H'ff' movwf kando ;初期状態は最高感度 clrf ledcount nextloop ;LEDを1回点滅 bsf GPIO,2 ;On call wait200 bcf GPIO,2 ;Off call wait200 mainloop ;感度が0だったらSLEEPする movf kando,F btfss STATUS,Z goto checkdown ;感度が0のときは割り込みを設定 clrf GPIO movf GPIO, W ;割り込み前の状態固定 bsf STATUS,RP0 ;Select Bank 1 movlw B'00010000';Set GP4 as movwf IOC ;interruptable bit clrf STATUS ;Select bank 0 clrf INTCON ;Clear INTCON bsf INTCON, 3 ;Set Port change enable bit bsf INTCON, 7 ;Set Global Interrupt Enable bit ; Sleep する sleep nop ; 割り込みする前にこれが実行されると思う nop ; 割り込みのあとはここから実行される ;起きた後。 clrf INTCON ;割り込み禁止 clrf kando ;今の感度は0 goto upkando ;感度アップルーチンへ直行する checkdown btfsc GPIO,5 goto checkup ;青色ボタン(下)が押された場合 btfss kando,7 ;最上位ビットが1 goto checkup ;の場合だけ処理する ;左へ1ビットシフト。穴は0で埋める bcf STATUS,C rlf kando,F goto nextloop checkup btfsc GPIO,4 goto checkad ;黄色ボタン(上)が押された場合 upkando btfsc kando,0 ;最下位ビットが0 goto checkad ;の場合だけ処理する ;右へ1ビットシフト。穴は1で埋める bsf STATUS,C rrf kando,F goto nextloop checkad ;割り込みの設定 clrf INTCON bsf STATUS,5 movlw B'01000000' movwf PIE1 clrf STATUS bsf INTCON,7 bsf INTCON,6 ;AD変換をする clrf ADCON0 bsf ADCON0,0 ;電源オン bsf ADCON0,7 ;LOWbitsを大きくとるモード bsf ADCON0,1 ;変換開始 ;変換終了を待つ sleep nop nop ; 割り込み機能を解除 clrf INTCON bsf STATUS,5 ;バンク1を選択 clrf PIE1 ;変換結果を保存(下8bitsに上2bitsをかぶせる) movf ADRESL,W clrf STATUS ;バンク0を選択 movwf advalue ;下7bitsを保存 btfsc ADRESH, 1 ;上2bitsのどちらかでも bsf advalue,7 ;1の場合は、bit7を上げる btfsc ADRESH, 0 bsf advalue,7 ;光らせるかを判定 movf kando,W andwf advalue,W btfss STATUS,Z ;発光ループを上げる? call lcup ;はい。 ;いいえ。 ; ledcountが正の間だけ点灯 movf ledcount,F btfsc STATUS,Z ;ledcountは0? goto ledoff ;はい。消灯。 ;いいえ、点灯。 ledon bsf GPIO,2 decf ledcount,F ;カウンタを1下げる goto afterad ledoff bcf GPIO,2 afterad goto mainloop ;LEDを光らせるカウンタを設定 lcup movlw D'4' movwf ledcount return ;およそ200ms待つ wait200 movlw D'195' movwf wait1 movlw D'0' movwf wait2 wait200p2 nop decfsz wait2,F goto wait200p2 decfsz wait1,F goto wait200p2 return end