キッチンタイマーの製作(2)MCCで入出力ポートの追加
マイコンのクロック設定をMCCを用いて設定します。
MCCを用いて入出力ポートの割当を行います。
今回割り当てるポートは
・入力:RA2、RA3、RA4
・出力:RB0、RB1 ※RB0はRP0と同じピン、RB1はRP1と同じピン
Pin Manager.GridウィンドウのPin Module項目のGPIO:input行とRA2,3,4と交差するところをクリックすると鍵がかかる仕組みになっています。。
RB0,RB1は出力ポートで使えるようになっているので今回は触らなくてもOKです。
Generateボタンをクリックします。
次のような警告がでますが、Yesをクリックします。
これで入力ポートが3本追加できました。ポートの値を取得する関数
IO_RA2_GetValue()
IO_RA3_GetValue()
IO_RA4_GetValue()
を用いて、ポートの入力がHighかLowを調べることができます。
<追加するプログラム>
【グローバル変数】
//------[ global(広域)変数定義 ]------
unsigned char SW1 = 0x01; // スイッチデータのビット位置
unsigned char SW2 = 0x02; // スイッチデータのビット位置
unsigned char SW3 = 0x04; // スイッチデータのビット位置
unsigned char bSwData; // スイッチデータの格納変数
unsigned char bSwDataOld; // スイッチデータの格納変数(過去)
unsigned char bSwDataSave; // スイッチデータの変化検出用変数
【スイッチの取り込みとチャタリング除去処理】
void SwScan(void) {
unsigned char bWk = 0;
if (IO_RA2_GetValue() == HIGH) { // HIGHでオンのケース
bWk |= SW1;
}
if (IO_RA3_GetValue() == HIGH) { // HIGHでオンのケース
bWk |= SW2;
}
if (IO_RA4_GetValue() == HIGH) { // HIGHでオンのケース
bWk |= SW3;
}
// スイッチの二度読み
if (bSwDataOld == bWk) {
bSwData = bWk; //前回と一致したのでスイッチデータを確定する
}
bSwDataOld = bWk; // 今回の値を保存
}
【スイッチの変化検出処理関数】
void swOperation (void) {
// SWに変化があったか判別
if (bSwData != bSwDataSave) {
// SW1操作判別
if ((bSwData & SW1) == LOW) {
IO_RB0_SetHigh(); // LEDを点灯
} else {
IO_RB0_SetLow(); // LEDを消灯
}
// SW2操作判別
if ((bSwData & SW2) == LOW) {
IO_RB1_SetHigh(); // LEDを点灯
} else {
IO_RB1_SetLow(); // LEDを消灯
}
// SW3操作判別
if ((bSwData & SW3) == LOW) {
} else {
}
}
bSwDataSave = bSwData; // 変化検出用旧データを更新
}
【メイン関数】
int main(void){
// initialize the device
SYSTEM_Initialize();
int loopCnt = 1;
//永久ループ
while (1) {
SwScan(); // スイッチの取り込みとチャタリング除去処理
switch (loopCnt) {
case 1:
// SWが押された時のLED点灯処理
swOperation();
break;
case 2:
// ○○○処理
break;
case 3:
// ○○○処理
break;
case 4:
default:
loopCnt = 0;
break;
}
loopCnt++; // ループカウンタの更新
__delay_ms(10); // 10msウェイト
}
}
※__delay_ms(10); // 10msウェイトはエラーが出るので以下の記述をソースプログラムの先頭部に追加しておきます。
//【定義】を追加
#define FCY (_XTAL_FREQ*2)
//【インクルードファイルの指定】を追加
#include <libpic30.h> // __delay_ms()使用のため
続きは(3)へ http://fujiharagiken.hatenablog.com/entry/2017/10/21/124650