それぞれ詳細に説明します。変数に値を代入します。ANSELは1バイト、8ビットの変数でそれぞれのビットは以下のような設定になっています。1行目、2行目は先程と同じです。3行目はANSELレジスタの各ビットの設定項目名、4行目はその意味です。第7ビットは先ほどと同様、使用しません。第6ビットから第4ビットは、AD変換を行う際のクロックの設定を行います。いってもよくわからないですよね。すみません、これはアナログ制御する時に設定が必要なのですが、入門の領域を超えてしまうのでここでは説明を省略いたします。設定しておけば問題ありません。第3ビットから第0ビットは、それぞれAN3ピンからAN0ピンまでのデジタル/アナログ制御の設定を行います。0を設定するとデジタル制御ピン、1を設定するとアナログ制御ピンとなります。最初に製作した回路は、発光ダイオード1つを制御する回路ですので、使わないピンがあります。使わないピンの設定は、特に意味はありませんが、すべてデジタルにしておくことにします。いうことで、各ビットの設定値は以下のようになります。0x00;ということになります。次に各ピンの入出力設定です。この変数も1バイト、8ビットでそれぞれのビットは以下のような設定になっています。表題の意味は今までと同様です。各ビット、0を設定すると出力、1を設定すると入力となります。第3ビット、つまりGP3の設定は入力のみとなり、このビットは読み出し専用となっています。今回はとりあえずGP3も含めて0、つまり全ピン出力設定とします。GP3は入力固定で読み出し専用のビットなので、0をいれておいても問題ありません。0x00;ということになります。これでクロック設定とピン機能設定が終わりました。ややこしかったと思います。最初の回路は発光ダイオードの点滅制御だけですので、出力ピンとしての扱いしかしませんが、その後、スイッチを付けますので、後でこの設定を変更することになります。そのときにまた確認してみてください。ピンの初期設定これまでのコードで一通りPICマイコンの動作設定が完了しましたので、いよいよピンを制御して発光ダイオードを点滅制御します。発光ダイオードはPICマイコンの2番ピン、GP5に接続しました。これからこのピンを0Vにしたり5Vにしたりして発光ダイオードを点滅制御するのですが、その方法は簡単です。”GP5′′という変数に0を代入すると、GP5ピンは0V、”GP5′′に1を代入するとGP5ピンは5V出力となります。0;と記述しておきます。これでGP5ピンは0Vとなり、発光ダイオードは消灯状態となります。動作処理さて、いよいよ1秒に1回、発光ダイオードをピカッ、ピカッと光らせる処理です。実は、事前に電源をONにしてからどのように発光ダイオードを光らせれば「ピカッ、ピカッ」と見えるか検討してみました。結果、950ms(ミリ秒)消灯状態にして、50ms点灯させると、ピカッ、という感じになりました。いうことで、以下のようにGP5を制御すればそのように光らせることができます。(a)に戻るということになります。永久に処理を繰り替える場合、手っ取り早いのがwhile文を使う方法です。while(1){処理}と書くと、while文の中の処理を永遠繰り返します。いうことで、あとは処理の部分に(a)〜(d)を書けばOKです。0;”と書けばいいのでこれで解決です。(a)と(c)はどのように書けばいいのでしょうか。時間待ちをすればいいので適当な命令を必要回数for文などで繰り返せばいいのですが、C言語の場合これが意外に難しいんです。ある一定の時間待ちをするには、まずC言語がどのPICマイコンの命令にコンパイルされて、その命令にどの程度時間がかかるか調べる必要があります。できないことではありませんが、ちょー面倒です。そんなこともあってか、時間待ちの関数が用意されています。__delay_ms()という関数です。”delay”の前にはアンダースコア2個、後には1個つきます。これは、ms(ミリ秒)指定でどのくらい時間待ちをするか、という関数です。950ms待つには、__delay_ms(950);とすれば、950ms時間待ちしてくれます。0;}ということになります。これでプログラムが完成、といきたいところですが、__delay_ms()を使用する場合、この関数はクロック周波数が何Hzに設定されているかの情報を必要とするため教えてあげる必要があります。教えるには、_XTAL_FREQにクロック周波数(単位はHz)を#defineします。1000000と定義してあげればOKです。この#defineはメイン関数の前に置きました。プログラム完成ですがようやく回路とプログラムが完成しました。完成したところで、何ですが、実はこの回路もプログラムも正確な時間は計測できていません。数十分程度のタイマーでしたら実用的に使えると思いますが、1日とか計測するタイマーとしては改良が必要です。具体的には以下の点で正確に時間が計測できていません。今回はPICマイコンの内部クロックを使用しましたが、内部クロックはある程度、誤差があります。正確に時間を計測する、つまり正確なクロック信号を得るには、時計用の32.768kHzの水晶発振子を使用したりする必要があります。タイマー程度でしたら内部クロックでも十分実用になると思います。プログラムの誤差これはほとんど誤差の要因にはなりませんが、上のプログラムは正確には1秒の処理を繰り返すようにはなっていません。GP5=0、という処理も時間がかかります。__delay_ms()でぴったり1秒時間待ちしていますので、それにプラスして、while()、GP5代入の処理分時間がかかっていることになります。これらの処理にかかる時間は非常に短いのでタイマー程度でしたらこのような実装で問題ありません。プログラムをコピペして一度動作させてみる」で書き込み、動作させる方法を説明していますので、まだ動作させていない方はこの記事を参考にして動作させてみてください。