7章:LEDシフト表示(1)

    作成2014.03.02

  1. STEP09_Shift
    (1)STEP09_Shiftソースプログラム
    STEP09_Shiftソースプログラムを以下に示します。
    STEP09_Shiftソースプログラムを以下に示します。
    /*****************************
     STEP09_Shift.c
    *****************************/
    #define _LEGACY_HEADERS
    // インクルードファイルの読み込み
    #include <pic.h>
    // コンフィギュレーションワードの設定
    __CONFIG ( UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO );
    // プロトタイプ宣言
    void WaitTime (int cnt);
    // メイン関数
    void main (void)
    {
    	// 1,2,17,18端子を入出力端子に設定
    	CMCON = 0x07;
    	// 電圧レベルの初期設定
    	PORTA = 0xFF;
    	PORTB = 0xFF;
    	// 入出力設定
    	TRISA = 0x20;
    	TRISB = 0x00;
    	// 永久ループ
    	while(1)
    	{
    		// LED1のみ点灯
    		PORTB = 0b11111110;
    		// 待ち時間関数の呼び出し
    		WaitTime(10000);
    		// LED2のみ点灯
    		PORTB = 0b11111101;
    		// 待ち時間関数の呼び出し
    		WaitTime(10000);
    		// LED3のみ点灯
    		PORTB = 0b11111011;
    		// 待ち時間関数の呼び出し
    		WaitTime(10000);
    		// LED4のみ点灯
    		PORTB = 0b11110111;
    		// 待ち時間関数の呼び出し
    		WaitTime(10000);
    		// LED5のみ点灯
    		PORTB = 0b11101111;
    		// 待ち時間関数の呼び出し
    		WaitTime(10000);
    		// LED6のみ点灯
    		PORTB = 0b11011111;
    		// 待ち時間関数の呼び出し
    		WaitTime(10000);
    		// LED7のみ点灯
    		PORTB = 0b10111111;
    		// 待ち時間関数の呼び出し
    		WaitTime(10000);
    		// LED8のみ点灯
    		PORTB = 0b01111111;
    		// 待ち時間関数の呼び出し
    		WaitTime(10000);
    	}
    }
    
    // 待ち時間関数
    void WaitTime (int cnt)
    {
    	while(cnt > 0)
    		cnt--;
    }
    


  2. STEP09_Shiftソースプログラム実行結果
    *実行結果はLEDの点滅で確認できるのですが、ここではRB0、RB1、RB2、RB3の電圧変化を測定します 。RB0、RB1、RB2、RB3の電圧変化測定結果を図7-1に示します。

    *図7-1の電圧変化をみると、RB0、RB1、RB2、RB3の順に電圧が0Vに変化することが確認でします。RB4、RB5、RB6、RB7は測定していませんが同様に変化するはずです。
    *LEDではRB0、RB1、RB2、RB3、RB4、RB5、RB6、RB7の順に点灯することが確認でします。


  3. STEP09_ShiftLoop
    (1)STEP09_ShiftLoopソースプログラム
    STEP09_ShiftLoopソースプログラムを以下に示します。
    /*****************************
     STEP09_ShiftLoop.c
    *****************************/
    // インクルードファイルの読み込み
    #include <pic.h>
    // コンフィギュレーションワードの設定
    __CONFIG ( UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO );
    // プロトタイプ宣言
    void WaitTime (int cnt);
    // メイン関数
    void main (void)
    {
    	// 1,2,17,18端子を入出力端子に設定
    	CMCON = 0x07;
    	// 電圧レベルの初期設定
    	PORTA = 0xFF;
    	PORTB = 0xFF;
    	// 入出力設定
    	TRISA = 0x20;
    	TRISB = 0x00;
    	// LED1のみ点灯
    	PORTB = 0b11111110;
    	// 永久ループ
    	while(1)
    	{
    		for(int cnt=0 ; cnt<7 ; cnt++)
    		{
    			// 待ち時間関数の呼び出し
    			WaitTime(2000);
    			// LEDの点灯箇所を左に1つずらす
    			PORTB = PORTB << 1;
    			// PORTBレジスタが "0b11111110" ではない場合
    			if (PORTB != 0b11111110)
    			{
    				// PORTBレジスタに1プラスする(LED1消灯)
    				PORTB = PORTB + 1;
    			}
    		} 		
    
    		for(int cnt=0 ; cnt<7 ; cnt++)
    		{
    			// 待ち時間関数の呼び出し
    			WaitTime(2000);
    
    			// LEDの点灯箇所を左右に1つずらす
    			PORTB = PORTB >> 1;
    
    			// PORTBレジスタが "0b01111111" ではない場合
    			if (PORTB != 0b01111111)
    			{
    				// PORTBレジスタに128プラスする(LED8消灯)
    				PORTB = PORTB + 128;
    			}
    		} 
    	}
    }
    // 待ち時間関数
    void WaitTime (int cnt)
    {
    	while(cnt > 0)
    		cnt--;
    }
    


  4. C言語シフト演算子
    (1)C言語シフト演算子記述例:PORTB = PORTB << 1;
    (2)変数 PORTBの定義
    volatile unsigned char PORTB@ 0x06;
    は変数 PORTBがアドレス0x06に、volatile(揮発性)、 unsigned(符号無し)、 char(8ビット)で定義されていることを示します。
    (3)PORTB = PORTB << 1;は変数PORTBの内容を1ビット左へシフトすることを示します。
    (4)PORTB=0b11111110の時1ビット左へシフトするとPORTB=0b11111100となります。(左側は切り捨てられ、右側には0が追加されます。
    (5)PORTB=0b11111100となるとLEDが2個点灯することになりまずいので、PORTB = PORTB + 1;の演算を行うとPORTB=0b11111101となり、点灯LEDが左にシフトします。

    (6)PORTB = PORTB >> 1;は変数PORTBの内容を1ビット右へシフトすることを示します。
    (7)PORTB=0b11111101を1ビット右へシフトするとPORTB=0b01111110となります。(右側は切り捨てられ、左側には0が追加されます。
    (8)PORTB=0b01111110ですとLEDが2点灯してしまうため、PORTB = PORTB + 128;の演算を行うとPORTB=0b11111110となり、点灯LEDが右にシフトします。


  5. STEP09_ShiftLoopソースプログラム実行結果
    *実行結果はLEDの点滅で確認できるのですが、ここではRB0、RB1、RB2、RB3の電圧変化を測定します。RB0、RB1、RB2、RB3の電圧変化測定結果を図7-2に示します。

    *図7-2の電圧変化をみると、RB3、RB2、RB1、RB0、RB1、RB2、RB3電圧が0Vに変化することが確認でします。RB4、RB5、RB6、RB7は測定していませんが同様に変化するはずです。
    *LEDではRB7、RB6、RB5、RB4、RB3、RB2、RB1、RB0、RB1、RB2、RB3、RB4、RB5、RB6、RB7の順に点灯することが確認できます。










8章:LEDシフト表示(2)に行く。

トップページに戻る。