●LEDプログラム 16F819LED01
;****************************************************************************************** ;* ●LEDプログラム 16F819LED01 ●言語:MPASMアセンブラ * ;****************************************************************************************** ; ;PIC16F84Aからの現状移行時で、変更した主な箇所です。 ; ;------------------------------------------------------------------------------------------ ; ;■取り合えず動かす為の変更箇所は・・・ ; ;・標準ヘッダ、定義ファイルの変更 ; LIST P=PIC16F84A → P=PIC16F819 ; INCLUDE "P16F84A.INC" → "P16F819.INC" ; ;・汎用レジスタの開始アドレスの変更 ( 'OC' → '20' ) ; ;------------------------------------------------------------------------------------------ ; ;■不具合事象に対応した変更箇所は・・・ ; ;・RB3からのLEDが点灯しなかったので ; コンフィグレーションビットの設定項目を追加(_LVP_OFF)して、RB3を汎用入出力ピンとした。 ; ;------------------------------------------------------------------------------------------ ; ;■ちょっと、試したい事が・・・ ; ;・MCLRピン(RA5)の抵抗接続を取り除きたいので ; コンフィグレーションビットの設定項目を追加(_MCLR_OFF)して、RA5をデジタル入力ピンとした。 ; ;・内部クロック周波数(4MHz)を使用したいので ; コンフィグレーションビットで、内部クロックモード(_INTRC_IO)を指定設定して ; OSCCONレジスタは、周波数4MHz(IRCF2:1,IRCF1:1,IRCF0:0)を選択設定した。 ; ;------------------------------------------------------------------------------------------ ; ; 【 PIC16F819 】 ; ___________________ ____________________ ; | V | ; | | ; 未使用 <--+ 1 RA2 PORTA(BIT2) | PORTA(BIT1) RA1 18 +--> 未使用 ; 未使用 <--+ 2 RA3 PORTA(BIT3) | PORTA(BIT0) RA0 17 +--> 未使用 ; 未使用 <--+ 3 RA4 PORTA(BIT4) | PORTA(BIT7) RA7 16 +--> 未使用 ; --+ 4 RA5 | PORTA(BIT6) RA6 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=PIC16F819 ;標準ヘッダー INCLUDE "P16F819.INC" ;定義ファイルを取り込む ;------------------------------------------------------------------------------------------ ;****************************************************************************************** ;* コンフィグレーションビットの設定 * ;****************************************************************************************** ; ; ●クロック発振モード(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 _INTRC_IO & _WDT_OFF & _PWRTE_ON & _MCLR_OFF & _LVP_OFF & _CP_OFF ;****************************************************************************************** ;* IDワードの設定 * ;****************************************************************************************** __IDLOCS H'0001' ;IDワード ← プログラムのバージョン ;****************************************************************************************** ;* 変数項目 汎用レジスタ ■バンク0(96バイト:20Ch〜7Fh番地) * ;****************************************************************************************** TIMCNT1 EQU H'20' ;タイマーカウンター1 TIMCNT2 EQU H'21' ;タイマーカウンター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 ) ;---内部クロック周波数(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 ) 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(タイマーカウンター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 ;プログラムの終了