┌─┬─┐
+5v ┤ ├ GND
GND-LED-1kΩ ┤ ├
┤ ├
+5V-1kΩ ┤ ├470Ω-SW-GND
└───┘
#include <pic.h>
#include "delay.h"__CONFIG(UNPROTECT & BOREN & MCLRDIS & PWRTEN & WDTDIS & INTIO);
__IDLOC(0100);
ioport(); // I/Oポート設定(関数の一種)のプロトタイプ宣言
main()
{
OSCCAL=_READ_OSCCAL_DATA();GPIO5=0; /* GP5ピンの出力データを0にする */
while(1){ //無限ループ
ioport(); /* I/Oポートの設定 */
if(GPIO2) continue; /* スイッチが押されたら */
//(スイッチオフつまりウィークプルアップされていてGPIO2=1の間はDelayMs(50)を飛ばす)
DelayMs(50); //GPIO2=0だったら50msec待ってから
if(GPIO2) continue; //もう一回押されてるかチェック(チャタリング対策)
//(スイッチオフつまりウィークプルアップされていてGPIO2=1の間はwhile(!GPIO2)へ進む)
if(GPIO5) /* LEDの点滅をトグルする */
GPIO5=0; //High(点灯中)だったらOFFにする
else
GPIO5=1; //そうでなかったらONにするwhile(!GPIO2); /* スイッチがはなされるのを待つ */
//スイッチが押されてLEDの点滅が切り替えられたあと、スイッチをはなしてGPIO2=1にならないとここでループして次に進まない
}
}ioport() // I/Oポート設定(関数)の内容はここにある。
{
WPU2=1; /* GP2ピンでウィーク・プルアップを使う */
GPPU=0; /* ウィーク・プルアップを使う */TRIS2=1; /* GP2ピンは入力ピン */
TRIS5=0; /* GP5ピンは出力ピン */ANS2=0; /* GP2ピンをデジタルI/Oにする */
}
continueはifの条件が真のとき次をスキップする
while(!~)は条件が偽になるまでその場でループ
もうひとつ。スイッチをオンオフした時のGPIOポートのレベル変化(0→1、1→0)を検出してLEDをチカチカする。
#include <pic.h>
#include "delay.h"__CONFIG(UNPROTECT & BOREN & MCLRDIS & PWRTEN & WDTDIS & INTIO);
__IDLOC(0100);
ioport();
main()
{
unsigned char temp,i; //変数tempとiを宣言OSCCAL=_READ_OSCCAL_DATA();
GPIO5=0; /* GP5ピンの出力データを0にする */
ioport(); /* I/Oポートの設定 */
temp=GPIO; /* GPIFを0にする */
//tempにGPIOレジスタの内容を代入(コレが初期値)
GPIF=0;
//GPIFを0に初期化しておくwhile(1){
ioport(); /* I/Oポートの設定 */
if(!GPIF) continue; /* GP2ピンの入力データが変化したら */
//GPIOレジスタの内容に変化が生じてGPIFが1になるまで次のforのループ部分はスキップ
for(i=0;i<6;i++){ /* LEDを0.5秒ごとに3回点滅する */DelayMs(250);
DelayMs(250);if(GPIO5)
GPIO5=0;
else
GPIO5=1;
}temp=GPIO; /* GPIFを0にする */
GPIF=0;
}
}ioport()
{
WPU2=1; /* GP2ピンでウィーク・プルアップを使う */
GPPU=0; /* ウィーク・プルアップを使う */TRIS2=1; /* GP2ピンは入力ピン */
TRIS5=0; /* GP5ピンは出力ピン */ANS2=0; /* GP2ピンをデジタルI/Oにする */
IOCB2=1; /* GP2ピンで入力データの変化を検出する */
}
ioport()関数の中の IOCB2=1; がミソ
わからない点→なぜtempにGPIOレジスタの内容をひかえる?→最初にGPIOレジスタの内容を読みにいっとくと変化検出用ラッチにもデータが登録される。登録されたデータをもとにIO入力データの変化を検出する。コレやっとかないと電源投入しただけでスイッチ押さないでもGPIFが1になってしまい、余分な動作をしてしまうようだ。(temp=GPIOをコメントアウトして確認した。)