PIC12F1822を使ったLED制御のプログラムを作成するには、まずハードウェアの設定と、適切なプログラムの流れを理解することが重要です。今回は、ボタンを押すごとにLEDが光るようにする方法を解説します。質問者のコードを参考にし、いくつかのポイントを押さえて修正しながら進めていきます。
PIC12F1822の基本的な設定
PIC12F1822は、8ビットのマイクロコントローラで、I/Oピンを使ってさまざまなデバイスを制御できます。プログラムを書く際には、まずはI/Oピンの設定が重要です。質問者のコードでは、TRISAでピンの入出力を設定しており、RA3ピンを入力、その他のピンを出力に設定しています。この設定を適切に行うことで、ボタン入力とLED制御が可能になります。
ボタンを押すごとにLEDを光らせる方法
質問者が目指しているのは、ボタンを押すごとにLEDの光り方を変えるという動作です。このため、ボタン入力を読み取った後、LEDの状態を変更するロジックを追加する必要があります。具体的には、ボタンを押した状態を読み取るために、RA3ピンの状態を確認し、それに基づいてRA0〜RA3ピンのLEDを制御します。
コードの修正例は以下の通りです。
#include
#define _XTAL_FREQ 4000000 // delay用に必要(クロック4MHzを指定)
void Wait(unsigned int num)
{
int i;
for (i = 0; i < num; i++) {
__delay_ms(10); // 10msの待機
}
}
void main() {
OSCCON = 0b01101010; // 内部クロックは4MHz
ANSELA = 0b00000000; // アナログ無効
TRISA = 0b00001000; // RA3を入力、RA0〜RA2を出力
PORTA = 0b00000000; // 初期化で全ピンをLOWに設定
int state = 0;
while(1) {
if (PORTAbits.RA3 == 1) { // ボタンが押された時
Wait(10); // デバウンス
if (PORTAbits.RA3 == 1) {
state++; // LEDの状態を切り替え
if (state > 3) state = 0; // 状態が4以上にならないように
switch (state) {
case 0:
PORTAbits.RA0 = 0;
PORTAbits.RA1 = 0;
PORTAbits.RA2 = 0;
break;
case 1:
PORTAbits.RA0 = 1;
PORTAbits.RA1 = 0;
PORTAbits.RA2 = 0;
break;
case 2:
PORTAbits.RA0 = 0;
PORTAbits.RA1 = 1;
PORTAbits.RA2 = 0;
break;
case 3:
PORTAbits.RA0 = 0;
PORTAbits.RA1 = 0;
PORTAbits.RA2 = 1;
break;
}
}
}
}
}
注意点とアドバイス
上記のコードでは、ボタンの状態をポーリングして確認していますが、ボタンを押した時のノイズを防ぐために、Wait関数を使ってデバウンス処理を行っています。また、LEDの状態は整数値で管理し、ボタンを押すたびに状態を変化させる仕組みになっています。
まとめ
今回は、PIC12F1822を使って、ボタンを押すごとにLEDの点灯を切り替える方法を解説しました。コードの流れとしては、まずボタンの入力を監視し、ボタンが押される度にLEDの状態を切り替えるというものです。この方法を応用すれば、さらに複雑な制御にも対応できるようになりますので、ぜひ挑戦してみてください。


コメント