kuroの覚え書き

96の個人的覚え書き

スイッチを押して入力



┌─┬─┐
+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をコメントアウトして確認した。)