LIST P=16F84 #include <p16F84.inc> __CONFIG _CP_OFF & _LP_OSC & _PWRTE_ON & _WDT_OFF ;コンフィグレーションビットの設定 ;_LP_OSC 低電力振動子(一般的に200kHz以下) ;_XT_OSC 低周波数振動子(4MHzまで) ;_HS_OSC 高周波数振動子(4-20MHzまで) ;_RC_OSC 抵抗とコンデンサによる発振 ;_WDT_ON ウォッチドッグタイマを有効にする ;_WDT_OFF ウォッチドッグタイマを無効にする ;_PWRTE_ON 電源投入直後のリセット期間を有効にする ;_PWRTE_OFF 電源投入直後のリセット期間を無効にする ;_CP_ON プログラムの読み取りを可能にする ;_CP_OFF プログラムの読み取りを不可能にする ;--------------------------------------------------------------- ;アドレスに名前を付ける ;--------------------------------------------------------------- ;割り込み時にレジスタを退避させるメモリ w_temp equ 0x0C status_temp equ 0x0D pos1 equ 0x0E pos2 equ 0x0F ;ウェイト用メモリ wait_val1 equ 0x10 wait_val2 equ 0x11 ;PIC16F84では0x0Cから0x4Fまでが使用可能 ;*************************************************************** ;リセットベクタ ;*************************************************************** org 0 goto start ;*************************************************************** ;割り込みベクタ ;*************************************************************** ;割り込みの設定 ; INTCONレジスタ ; 0bit RBIF RB4〜RB7の状態変化割込みフラグ ; 1bit INTF RB0/INTの割込みフラグ ; 2bit T0IF TMR0タイマ割込みフラグ ; 3bit RBIE RB4〜RB7の割込み許可ビット ; 4bit INTE RB0/INTの割込み許可ビット ; 5bit T0IE TMR0タイマの割込み許可ビット ; 6bit EEIE データEEPROM書き込み完了割込み許可 ; 7bit GIE 全体割込み許可ビット ;*************************************************************** org 4 ;レジスタの退避 movwf w_temp movf STATUS,w clrf STATUS movwf status_temp ;各割り込みに対して適切なアドレスにジャンプさせる btfsc INTCON,RBIF goto int0 btfsc INTCON,INTF goto int1 btfsc INTCON,T0IF goto int2 intret bcf INTCON,RBIF ;RB4~RB7割り込みフラグリセット bcf INTCON,INTF ;RB0/INT割り込みフラグリセット bcf INTCON,T0IF ;タイマー割り込みフラグリセット ;レジスタの復帰 clrf STATUS movf status_temp,w movwf STATUS swapf w_temp,f swapf w_temp,w retfie ;割り込みから復帰 ;--------------------------------------------------------------- ;RB4〜RB7割り込みにより実行 ;--------------------------------------------------------------- int0 ;RB4~RB7割り込み ;割り込み時の処理をここに記述 goto intret ;--------------------------------------------------------------- ;RB0/INT割り込みにより実行 ;--------------------------------------------------------------- int1 ;RB0/INT割り込み ;割り込み時の処理をここに記述 goto intret ;--------------------------------------------------------------- ;タイマー割り込みにより実行 ;--------------------------------------------------------------- int2 ;タイマー割り込み ;タイマーにはクロックが1/4周期で供給されるため、 ;10MHzクロックでは 1/2500000secとなる ;1/19200 sec(52 usec)毎にタイマー割り込みを入れるために ;減算タイマー値に256-130=0x7Eを設定 ;しかし、割り込みから、ここまでに0x0Eほどかかるため加算する movlw 0x7E+0x0E ;タイマー値リセット movwf TMR0 ;割り込み時の処理をここに記述 goto intret ;ジャンプ ;*************************************************************** ;スタート ;*************************************************************** start ;--------------------------------------------------------------- ;ポートの設定 ;--------------------------------------------------------------- clrf PORTA clrf PORTB bsf STATUS,5 ;ページを1に切り替え movlw b'00000000 movwf TRISA ;portAの00000000を入力に設定 movlw b'00000000 movwf TRISB ;portBの00000000を入力に設定(全て出力に設定) bcf STATUS,5 ;ページを0に切り替え ;--------------------------------------------------------------- ;*************************************************************** ;割り込みの設定 ; INTCONレジスタ ; 0bit RBIF RB4〜RB7の状態変化割込みフラグ ; 1bit INTF RB0/INTの割込みフラグ ; 2bit T0IF TMR0タイマ割込みフラグ ; 3bit RBIE RB4〜RB7の割込み許可ビット ; 4bit INTE RB0/INTの割込み許可ビット ; 5bit T0IE TMR0タイマの割込み許可ビット ; 6bit EEIE データEEPROM書き込み完了割込み許可 ; 7bit GIE 全体割込み許可ビット ;*************************************************************** clrf INTCON ;--------------------------------------------------------------- ;RB0/INT割り込みの設定 ;--------------------------------------------------------------- bsf STATUS,5 ;ページを1に切り替え bcf OPTION_REG,6 ;RB0のエッジ設定は立ち上がり bcf STATUS,5 ;ページを0に切り替え ; bsf INTCON,INTE ;RB0/INT割り込み発生許可 ;--------------------------------------------------------------- ;RB4〜RB7割り込みの設定 ;--------------------------------------------------------------- ; bsf INTCON,RBIE ;RB4〜RB7割り込み ;--------------------------------------------------------------- ;タイマー割り込みの設定 ;--------------------------------------------------------------- ; movlw 0x00 ;タイマー値リセット ; movwf TMR0 ; bsf STATUS,5 ;ページを1に切り替え ; bsf OPTION_REG,0 ;PS0 プリスケーラの設定 ; bsf OPTION_REG,1 ;PS1 ; bsf OPTION_REG,2 ;PS2 ; bsf OPTION_REG,3 ;PSA プリスケーラをTMRで使用する場合は0,WDTで使用する場合は1 ; bcf OPTION_REG,5 ;T0CS タイマ0の入力先 1でRA4ピン入力,0でクロック1/4入力 ; bcf STATUS,5 ;ページを0に切り替え ; bsf INTCON,T0IE ;タイマ割り込み発生許可 ;--------------------------------------------------------------- ;割り込みの開始 ;--------------------------------------------------------------- ; bsf INTCON,GIE ;割り込み許可 ;*************************************************************** ;メイン ;*************************************************************** init main call wait_long ;初期化 ; 7654SE LCDの端子に出力するためのビット位置 MOVLW b'00110000 call lcd_out ; 7654SE LCDの端子に出力するためのビット位置 MOVLW b'00110000 call lcd_out ; 7654SE LCDの端子に出力するためのビット位置 MOVLW b'00110000 call lcd_out ;4ビットモードに変更 ; 7654SE LCDの端子に出力するためのビット位置 MOVLW b'00100000 call lcd_out ;ディスプレイをONにしてカーソルONにする ; 7654SE LCDの端子に出力するためのビット位置 MOVLW b'00000000 call lcd_out ; 7654SE LCDの端子に出力するためのビット位置 MOVLW b'11100000 call lcd_out ;2行表示の設定 ; 7654SE LCDの端子に出力するためのビット位置 MOVLW b'00100000 call lcd_out ; 7654SE LCDの端子に出力するためのビット位置 MOVLW b'11000000 call lcd_out ;カーソルを任意の位置に移動 ; 7654SE LCDの端子に出力するためのビット位置 MOVLW b'11000000 call lcd_out ; 7654SE LCDの端子に出力するためのビット位置 MOVLW b'00000000 call lcd_out ;カーソルの位置に文字を表示する ; 7654SE LCDの端子に出力するためのビット位置 MOVLW b'00111000 call lcd_out ; 7654SE LCDの端子に出力するためのビット位置 MOVLW b'00001000 call lcd_out sleep goto main ;--------------------------------------------------------------- ;Wレジスタの内容をLCDに送り一定時間待つ ;--------------------------------------------------------------- lcd_out MOVWF pos1 ;WレジスタからFレジスタに代入 MOVWF pos2 ;WレジスタからFレジスタに代入 BSF pos2, 2 ;EをONにする MOVFW pos2 MOVWF PORTB ;WレジスタからFレジスタに代入 call wait_short MOVFW pos1 MOVWF PORTB ;WレジスタからFレジスタに代入 call wait_short clrf PORTB return ;--------------------------------------------------------------- ;短い時間のウエイト ;--------------------------------------------------------------- wait_short MOVLW 0x00 MOVWF wait_val1 wait_short_loop0 decfsz wait_val1,F goto wait_short_loop0 ; return ;--------------------------------------------------------------- ;長い時間のウエイト ;--------------------------------------------------------------- wait_long MOVLW 0x00 MOVWF wait_val1 wait_long1 MOVLW 0x00 MOVWF wait_val2 wait_long2 decfsz wait_val2,F goto wait_long2 decfsz wait_val1,F goto wait_long1 return END