RBポートの割り込みでボタンのプッシュを検出したいのですが?

RBポートの割り込みはB4-B7のピンが入出力で変化したとき発生します。 よって、割り込みがかけられたとき、どこは変化したかは分かりません。 そこで、プログラマーは変化する前のポートの状態を保持しておき、割り込みが掛かったときどこがどのように変化したかを知ることができます。 さらに、ボタンがただ1回押されたときでも、スイッチ接点のチャタリングにより予期しない割り込みか掛かってしまう場合もあります。これは機械式の接点では避けられないものでこれに対応したプログラムが要求されます。 そこで、簡単なサンプルを示します。:

	#int_rb
	rb_isr ( ) {
		byte changes;
		changes = last_b ^ port_b;
		last_b = port_b;
		if (bit_test(changes,4 )&& !bit_test(last_b,4)) {
			//b4 went low
		}
		if (bit_test(changes,5)&& !bit_test (last_b,5)) {
			//b5 went low
		}
		.
		.
		.
		delay-ms (100); //debounce
	}

ディレイに100mSを与えているのは、瞬間的に押された場合や、チャタリングをキャンセルするためです。また、これにより100mS以上でないと割り込み関数ISRは呼ばれません。 もう少しエレガントな方法は、キーが押されたときの割り込みでタイマーを使用してタイマーがオーバーフローしたときにポートが変化していなければピンの変化があったとすれば良いと思われます。