●LEDプログラム 16F88LED02
;****************************************************************************************** ;* ●LEDプログラム 16F88LED02 ●言語:MPASMアセンブラ * ;****************************************************************************************** ; ;・参考のLEDプログラム(16F819LED02)を流用して作成 ; ; LED点灯の順番は ; ;  PORTA( RA0→ RA1→ RA2→ RA3→ RA4→ RA6→ RA7 ) ;   ↓ ;  PORTB( RB0→ RB1→ RB2→ RB3→ RB4→ RB5→ RB6→ RB7 )、これを繰り返す。 ; ;------------------------------------------------------------------------------------------ ; ; 【 PIC16F88 】 ; ___________________ ____________________ ; | V | ; | | ; LEDA2(03) <--+ 1 RA2 PORTA(BIT2) | PORTA(BIT1) RA1 18 +--> LEDA1(02) ; LEDA3(04) <--+ 2 RA3 PORTA(BIT3) | PORTA(BIT0) RA0 17 +--> LEDA0(01) ; LEDA4(05) <--+ 3 RA4 PORTA(BIT4) | PORTA(BIT7) RA7 16 +--> LEDA7(07) ; 未使用 >--+ 4 RA5 PORTA(BIT5) | PORTA(BIT6) RA6 15 +--> LEDA6(06) ; 0V --+ 5 Vss (-) | (+) Vdd 14 +-- 3〜5V+ ; LEDB0(08) <--+ 6 RB0 PORTB(BIT0) | PORTB(BIT7) RB7 13 +--> LEDB7(15) ; LEDB1(09) <--+ 7 RB1 PORTB(BIT1) | PORTB(BIT6) RB6 12 +--> LEDB6(14) ; LEDB2(10) <--+ 8 RB2 PORTB(BIT2) | PORTB(BIT5) RB5 11 +--> LEDB5(13) ; LEDB3(11) <--+ 9 RB3 PORTB(BIT3) | PORTB(BIT4) RB4 10 +--> LEDB4(12) ; | | ; +----------------------------------------+ ; Copyright (c) 2013.03.17 by T.EJIRI ;------------------------------------------------------------------------------------------ ERRORLEVEL -302 ;バンク指定の確認 Warning Message[302]非表示にする ;------------------------------------------------------------------------------------------ LIST P=PIC16F88 ;標準ヘッダー INCLUDE "P16F88.INC" ;定義ファイルを取り込む ;------------------------------------------------------------------------------------------ ;****************************************************************************************** ;* コンフィグレーションビット(CONFIG1)の設定 * ;****************************************************************************************** ; ; ●クロック発振モード(OSC)の指定 :_INTRC_IO :内部クロックモード(INTOSC)を使用する ; (RA6,RA7は汎用入出力ピンとなる) ; ●ウォッチドックタイマの動作指定:_WDT_OFF :ウォッチドックタイマ(WDT)の動作を禁止する ; ●パワーアップタイマの許可指定 :_PWRTE_ON :パワーアップタイマ(PWRTE)の動作を許可する ; ●MCLRピンの機能選択指定  :_MCLR_OFF :RA5はデジタル入力ピンとする ;                        (MCLRは内部でVddに接続) ; ●低電圧書き込み許可の指定 :_LVP_OFF :低電圧書き込みを禁止する ; (RB3は汎用入出力ピンとなる) ; ●コードプロテクトの指定 :_CP_OFF :コードプロテクト(CP)しない ; __CONFIG _CONFIG1, _INTRC_IO & _WDT_OFF & _PWRTE_ON & _MCLR_OFF & _LVP_OFF & _CP_OFF ;****************************************************************************************** ;* コンフィグレーションビット(CONFIG2)の設定 * ;****************************************************************************************** ; ; ●内部外部クロック切替モード(IESO)の指定 :_IESO_OFF :(無効)にする ; ●フェールセーフクロックモニタ(FCMEN)の指定 :_FCMEN_OFF :(無効)にする __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF ;****************************************************************************************** ;* IDワードの設定 * ;****************************************************************************************** __IDLOCS H'0002' ;IDワード ← プログラムのバージョン ;****************************************************************************************** ;* 変数項目 汎用レジスタ ■バンク0(96バイト:20Ch〜7Fh番地)    * ;****************************************************************************************** TIMCNT1 EQU H'20' ;タイマーカウンター1 TIMCNT2 EQU H'21' ;タイマーカウンター2 ;****************************************************************************************** ;* LED出力パターンデータ ( 0:消灯 1:点灯 )    * ;****************************************************************************************** LEDOFF EQU B'00000000' ;PORTB(全て)消灯 LEDA0 EQU B'00000001' ;PORTA(RA0)のみ点灯、以外は消灯 LEDA1 EQU B'00000010' ;PORTA(RA1)のみ点灯、以外は消灯 LEDA2 EQU B'00000100' ;PORTA(RA2)のみ点灯、以外は消灯 LEDA3 EQU B'00001000' ;PORTA(RA3)のみ点灯、以外は消灯 LEDA4 EQU B'00010000' ;PORTA(RA4)のみ点灯、以外は消灯 LEDA6 EQU B'01000000' ;PORTA(RA6)のみ点灯、以外は消灯 LEDA7 EQU B'10000000' ;PORTA(RA7)のみ点灯、以外は消灯 LEDB0 EQU B'00000001' ;PORTB(RB0)のみ点灯、以外は消灯 LEDB1 EQU B'00000010' ;PORTB(RB1)のみ点灯、以外は消灯 LEDB2 EQU B'00000100' ;PORTB(RB2)のみ点灯、以外は消灯 LEDB3 EQU B'00001000' ;PORTB(RB3)のみ点灯、以外は消灯 LEDB4 EQU B'00010000' ;PORTB(RB4)のみ点灯、以外は消灯 LEDB5 EQU B'00100000' ;PORTB(RB5)のみ点灯、以外は消灯 LEDB6 EQU B'01000000' ;PORTB(RB6)のみ点灯、以外は消灯 LEDB7 EQU B'10000000' ;PORTB(RB7)のみ点灯、以外は消灯 ;****************************************************************************************** ;* プログラムの開始 (リセット・ベクタ)                   * ;****************************************************************************************** ORG 0 ;リセット・ベクタ(0h番地) GOTO START ;STARTへ ジャンプする ;****************************************************************************************** ;* 割り込み (割り込みベクタ)                   * ;****************************************************************************************** ORG 4 ;割り込みベクタ(4h番地) GOTO START ;STARTへ ジャンプする ;****************************************************************************************** ;* プログラム・メイン処理の開始                    * ;****************************************************************************************** ORG 5 ;プログラムの開始アドレス(5h番地) START CALL INT_RTN ;初期処理 CALL MAIN_RTN ;主処理 ;****************************************************************************************** ;* 初期処理                   * ;****************************************************************************************** INT_RTN BSF STATUS,RP0 ;■バンク1にする ( ステータスレジスタのRP0 ← 1 ) ;---内部クロック周波数(4MHz)を設定する MOVLW B'01100000' ;Wレジスタ ← 4MHz(IRCF2:1,IRCF1:1,IRCF0:0)を選択する MOVWF OSCCON ;OSCCONレジスタ ← Wレジスタ ;---ポートの初期化--- CLRF TRISA ;PORTAは全て出力モードに設定する CLRF TRISB ;PORTBは全て出力モードに設定する BCF STATUS,RP0 ;■バンク0にする ( ステータスレジスタのRP0 ← 0 ) ;---LED(PORTA、PORTB)消灯処理 CALL LED_A_OFF_RTN ;LED(PORTA)消灯処理 CALL LED_B_OFF_RTN ;LED(PORTB)消灯処理 RETURN ;****************************************************************************************** ;* LED(PORTA)消灯処理 * ;****************************************************************************************** LED_A_OFF_RTN MOVLW LEDOFF ;Wレジスタ    ← PORTの消灯設定 MOVWF PORTA ;PORTAポート ← Wレジスタ RETURN ;****************************************************************************************** ;* LED(PORTB)消灯処理 * ;****************************************************************************************** LED_B_OFF_RTN MOVLW LEDOFF ;Wレジスタ    ← PORTの消灯設定 MOVWF PORTB ;PORTBポート ← Wレジスタ RETURN ;****************************************************************************************** ;* 主処理                                  * ;****************************************************************************************** MAIN_RTN CALL LED_OUT_RTN ;LED(PORTA、PORTB)出力処理 GOTO MAIN_RTN ;MAIN_RTNへ ジャンプする(永久ループ) ;****************************************************************************************** ;* LED(PORTA、PORTB)出力処理 * ;****************************************************************************************** LED_OUT_RTN ;---PORTAの出力--- MOVLW LEDA0 ;Wレジスタ    ← PORTA(RA0)を点灯する MOVWF PORTA ;PORTAポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LEDA1 ;Wレジスタ    ← PORTA(RA1)を点灯する MOVWF PORTA ;PORTAポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LEDA2 ;Wレジスタ    ← PORTA(RA2)を点灯する MOVWF PORTA ;PORTAポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LEDA3 ;Wレジスタ    ← PORTA(RA3)を点灯する MOVWF PORTA ;PORTAポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LEDA4 ;Wレジスタ    ← PORTA(RA4)を点灯する MOVWF PORTA ;PORTAポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LEDA6 ;Wレジスタ    ← PORTA(RA6)を点灯する MOVWF PORTA ;PORTAポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LEDA7 ;Wレジスタ    ← PORTA(RA7)を点灯する MOVWF PORTA ;PORTAポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) CALL LED_A_OFF_RTN ;LED(PORTA)消灯処理 ;---PORTBの出力--- MOVLW LEDB0 ;Wレジスタ    ← PORTB(RB0)を点灯する MOVWF PORTB ;PORTBポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LEDB1 ;Wレジスタ    ← PORTB(RB1)を点灯する MOVWF PORTB ;PORTBポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LEDB2 ;Wレジスタ    ← PORTB(RB2)を点灯する MOVWF PORTB ;PORTBポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LEDB3 ;Wレジスタ    ← PORTB(RB3)を点灯する MOVWF PORTB ;PORTBポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LEDB4 ;Wレジスタ    ← PORTB(RB4)を点灯する MOVWF PORTB ;PORTBポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LEDB5 ;Wレジスタ    ← PORTB(RB5)を点灯する MOVWF PORTB ;PORTBポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LEDB6 ;Wレジスタ    ← PORTB(RB6)を点灯する MOVWF PORTB ;PORTBポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LEDB7 ;Wレジスタ    ← PORTB(RB7)を点灯する MOVWF PORTB ;PORTBポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) CALL LED_B_OFF_RTN ;LED(PORTB)消灯処理 RETURN ;****************************************************************************************** ;* タイマー処理 * ;****************************************************************************************** TIM_RTN MOVLW D'255' ;Wレジスタ ← 255 MOVWF TIMCNT1 ;TIMCNT1(タイマーカウンター1) ← Wレジスタ TIM_LOOP1 MOVLW D'255' ;Wレジスタ ← 255 MOVWF TIMCNT2 ;TIMCNT2(タイマーカウンター2) ← Wレジスタ TIM_LOOP2 NOP ;空ステップ NOP ;空ステップ NOP ;空ステップ NOP ;空ステップ NOP ;空ステップ NOP ;空ステップ NOP ;空ステップ NOP ;空ステップ NOP ;空ステップ NOP ;空ステップ DECFSZ TIMCNT2,F ;(TIMCNT2=TIMCNT2−1)=0の時 次の命令をスキップする GOTO TIM_LOOP2 ;TIM_LOOP2へ ジャンプする(タイマーカウンタ2、ループ) DECFSZ TIMCNT1,F ;(TIMCNT1=TIMCNT1−1)=0の時 次の命令をスキップする GOTO TIM_LOOP1 ;TIM_LOOP1へ ジャンプする(タイマーカウンタ1、ループ) RETURN ;****************************************************************************************** END ;プログラムの終了