作成2014.03.04
STEP13_BinaryCounter
(1)STEP13_BinaryCounter
STEP13_BinaryCounterソースプログラムを以下に示します。
/*****************************
 STEP13_BinaryCounter.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 = 0b00101111;
	TRISB = 0x00;
	
	// 永久ループ
	while(1)
	{
		// SW1がONの場合
		if(RA0 == 0)
		{
			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
			WaitTime (500);
			
			// SW1がONの間ループ
			while( RA0 == 0 )
				;
			
			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
			WaitTime (500);
			
			// PORTレジスタの値が0ではない場合
			if(PORTB != 0b00000000)
			{
				// PORTBレジスタを1マイナスする
				PORTB = PORTB - 1;
			}
		}
		// SW2がONの間
		else if(RA1 == 0)
		{
			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
			WaitTime (500);
			
			// SW2がONの間ループ
			while(RA1 == 0)
				;
			
			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
			WaitTime (500);
			
			// 
			if(PORTB != 0b11111111)
			{
				// PORTBレジスタを1プラスする
				PORTB = PORTB + 1;
			}
		}
		
		// SW3がONの間
		else if(RA2 == 0)
		{
			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
			WaitTime (500);
			
			// SW3がONの間ループ
			while(RA2 == 0)
				;
			
			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
			WaitTime (500);
			
			// PORBレジスタをクリア
			PORTB = 0b00000000;
		}
		// SW4がONの間
		else if(RA3 == 0)
		{
			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
			WaitTime (500);
			
			// SW4がONの間ループ
			while(RA3 == 0)
				;
			
			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
			WaitTime (500);
			
			// PORTBレジスタに255を代入
			PORTB = 0b11111111;
		}
	}
}
// 待ち時間関数
void WaitTime ( int cnt )
{
	while (cnt > 0)
		cnt--;
}
 
(2)STEP13_BinaryCounterソースプログラムの実行
* SW1を1回押すとLEDの2進表示値が1だけ増加します。
*SW2を1回押すとLEDの2進表示値が1だけ減少します。
*SW3を押すとLEDの2進表示値が0b11111111となります。
*SW4を押すとLEDの2進表示値が0b00000000となります。
STEP13_RisingEdgeFailed
(1)STEP13_RisingEdgeFailedソースプログラム
STEP13_RisingEdgeFailedソースプログラムを以下に示します。
/*****************************
 STEP13_RisingEdgeFailed.c
*****************************/
#define _LEGACY_HEADERS
// インクルードファイルの読み込み
#include <pic.h>
// コンフィギュレーションワードの設定
__CONFIG ( UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO );
// メイン関数
void main (void)
{
	// 1,2,17,18端子を入出力端子に設定
	CMCON = 0x07;
	
	// 電圧レベルの初期設定
	PORTA = 0xFF;
	PORTB = 0xFF;
	
	// 入出力設定
	TRISA = 0b00101111;
	TRISB = 0x00;
	
	// 永久ループ
	while(1)
	{
		// SW1がONの場合
		if( RA0 == 0 )
		{
			// SW1がONの間ループ
			while( RA0 == 0 )
				;
			
			// LED1状態反転
			RB0 = ~RB0;
		}
	}
}
 
(2)STEP13_RisingEdgeFailedソースプログラムの実行
*SW1入力信号のRA0の電圧変化とLED1出力信号のRB0の電圧変化を測定した結果を図11-1に示します。

 図11-1からSW1のチャタリングによりLED1の出力が誤動作することが確認できます。
STEP13_RisingEdgeSuccessful
(1)STEP13_RisingEdgeSuccessfulソースプログラム
STEP13_RisingEdgeSuccessfulソースプログラムを以下に示します。
/*****************************
 STEP13_RisingEdgeSuccessful.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 = 0b00100011;
	TRISB = 0x00;
	
	// 永久ループ
	while(1)
	{
		// SW1がONの場合
		if(RA0 == 0)
		{
			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
			WaitTime (500);
			
			// SW1がONの間ループ
			while (RA0 == 0)
				;
			
			// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
			WaitTime (500);
			
			// 
			RB0 = ~RB0;
		}
	}
}
// 待ち時間関数
void WaitTime ( int cnt )
{
	while (cnt > 0)
		cnt--;
}
 
(2)STEP13_RisingEdgeSuccessfulソースプログラムの実行
*SW1入力信号のRA0の電圧変化とLED1出力信号のRB0の電圧変化を測定した結果を図11-2に示します。

 図11-2からSW1のチャタリングによるLED1出力の誤動作を約10msのディレイで防止することが確認できます。