●LEDプログラム 16F84ALED01
;****************************************************************************************** ;* ●LEDプログラム 16F84ALED01 ●言語:MPASMアセンブラ * ;****************************************************************************************** ; ; 【 PIC16F84A 】 ; ___________________ ____________________ ; | V | ; | | ; 未使用 <--+ 1 RA2 PORTA(BIT2) | PORTA(BIT1) RA1 18 +--> 未使用 ; 未使用 <--+ 2 RA3 PORTA(BIT3) | PORTA(BIT0) RA0 17 +--> 未使用 ; 未使用 <--+ 3 RA4 PORTA(BIT4) | OSC1 16 +--< オシレータ端子 ; --+ 4 MCLR | OSC2 15 +--> オシレータ端子 ; 0V --+ 5 Vss (-) | (+) Vdd 14 +-- 3〜5V+ ; LED(0) <--+ 6 RB0 PORTB(BIT0) | PORTB(BIT7) RB7 13 +--> LED(7) ; LED(1) <--+ 7 RB1 PORTB(BIT1) | PORTB(BIT6) RB6 12 +--> LED(6) ; LED(2) <--+ 8 RB2 PORTB(BIT2) | PORTB(BIT5) RB5 11 +--> LED(5) ; LED(3) <--+ 9 RB3 PORTB(BIT3) | PORTB(BIT4) RB4 10 +--> LED(4) ; | | ; +----------------------------------------+ ; Copyright (c) 2009.01.31 by T.EJIRI ;------------------------------------------------------------------------------------------ ERRORLEVEL -302 ;バンク指定の確認 Warning Message[302]非表示にする ;------------------------------------------------------------------------------------------ LIST P=PIC16F84A ;標準ヘッダー INCLUDE "P16F84A.INC" ;定義ファイルを取り込む ;------------------------------------------------------------------------------------------ ;****************************************************************************************** ;* コンフィグレーションビットの設定 * ;****************************************************************************************** ; ; ●クロック発振モード(OSC)の指定 :_HS_OSC :4MHz〜20MHz(水晶振動子orセラミック振動子) ; ●ウォッチドックタイマの動作指定:_WDT_OFF :ウォッチドックタイマ(WDT)の動作を禁止する ; ●パワーアップタイマの許可指定 :_PWRTE_ON :パワーアップタイマ(PWRTE)の動作を許可する ; ●コードプロテクトの指定 :_CP_OFF :コードプロテクト(CP)しない ; __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF ;****************************************************************************************** ;* IDワードの設定 * ;****************************************************************************************** __IDLOCS H'0001' ;IDワード ← プログラムのバージョン ;****************************************************************************************** ;* 変数項目 汎用レジスタ(68バイト:0Ch〜4Fh番地)    * ;****************************************************************************************** TIMCNT1 EQU H'0C' ;タイマーカウンター1 TIMCNT2 EQU H'0D' ;タイマーカウンター2 ;****************************************************************************************** ;* LED出力パターンデータ ( 0:消灯 1:点灯 )    * ;****************************************************************************************** LEDOFF EQU B'00000000' ;PORTB(全て)消灯 LED0 EQU B'00000001' ;PORTB(RB0)のみ点灯、以外は消灯 LED1 EQU B'00000010' ;PORTB(RB1)のみ点灯、以外は消灯 LED2 EQU B'00000100' ;PORTB(RB2)のみ点灯、以外は消灯 LED3 EQU B'00001000' ;PORTB(RB3)のみ点灯、以外は消灯 LED4 EQU B'00010000' ;PORTB(RB4)のみ点灯、以外は消灯 LED5 EQU B'00100000' ;PORTB(RB5)のみ点灯、以外は消灯 LED6 EQU B'01000000' ;PORTB(RB6)のみ点灯、以外は消灯 LED7 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 ) ;---ポートの初期化--- CLRF TRISA ;PORTAは全て出力モードに設定する CLRF TRISB ;PORTBは全て出力モードに設定する BCF STATUS,RP0 ;■バンク0にする ( ステータスレジスタのRP0 ← 0 ) CALL LED_A_OFF_RTN ;LED(PORTA)未使用処理 RETURN ;****************************************************************************************** ;* LED(PORTA)未使用処理 * ;****************************************************************************************** LED_A_OFF_RTN MOVLW B'0000' ;Wレジスタ ← PORTA(RA0〜RA3)を消灯する MOVWF PORTA ;PORTAポート ← Wレジスタ RETURN ;****************************************************************************************** ;* 主処理                                  * ;****************************************************************************************** MAIN_RTN CALL LED_B_OFF_RTN ;LED(PORTB)消灯処理 CALL LED_B_OUT_RTN ;LED(PORTB)出力処理 GOTO MAIN_RTN ;MAIN_RTNへ ジャンプする(永久ループ) ;****************************************************************************************** ;* LED(PORTB)消灯処理 * ;****************************************************************************************** LED_B_OFF_RTN MOVLW LEDOFF ;Wレジスタ ← PORTB(RB0〜RB7)を消灯する MOVWF PORTB ;PORTBポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) RETURN ;****************************************************************************************** ;* LED(PORTB)出力処理 * ;****************************************************************************************** LED_B_OUT_RTN MOVLW LED0 ;Wレジスタ    ← PORTB(RB0)を点灯する MOVWF PORTB ;PORTBポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LED1 ;Wレジスタ    ← PORTB(RB1)を点灯する MOVWF PORTB ;PORTBポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LED2 ;Wレジスタ    ← PORTB(RB2)を点灯する MOVWF PORTB ;PORTBポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LED3 ;Wレジスタ    ← PORTB(RB3)を点灯する MOVWF PORTB ;PORTBポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LED4 ;Wレジスタ    ← PORTB(RB4)を点灯する MOVWF PORTB ;PORTBポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LED5 ;Wレジスタ    ← PORTB(RB5)を点灯する MOVWF PORTB ;PORTBポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LED6 ;Wレジスタ    ← PORTB(RB6)を点灯する MOVWF PORTB ;PORTBポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) MOVLW LED7 ;Wレジスタ    ← PORTB(RB7)を点灯する MOVWF PORTB ;PORTBポート ← Wレジスタ CALL TIM_RTN ;サブルーチンを呼ぶ(タイマー処理) RETURN ;****************************************************************************************** ;* タイマー処理 * ;****************************************************************************************** TIM_RTN MOVLW D'255' ;Wレジスタ ← 255 MOVWF TIMCNT1 ;TIMCNT1(タイマーカウンター) ← Wレジスタ TIM_LOOP1 MOVLW D'255' ;Wレジスタ ← 255 MOVWF TIMCNT2 ;TIMCNT2(タイマーカウンター) ← 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 ;プログラムの終了