前回に引き続き、今回は PIC 業界の "Hello, world" 的な存在、LED フラッシャーを作ってみます。多分、順番としてはこちらが先だと思うんですが。回路は前回のものをそのまま流用します。LED の数が少ないので、綺麗に流れて見えませんが、原理を理解するには十分と思うので。
#include <htc.h> __CONFIG (FOSC_INTRCIO // 内蔵オシレータ & WDTE_OFF // WDT 無効 & PWRTE_OFF // PWRT 無効 & MCLRE_OFF // MCLR 使用しない & BOREN_OFF // BOD 無効 & CP_OFF // Program Memory code protection 無効 & CPD_OFF // Data memory code protection 無効 ); void main () { // ポートの入出力方向を設定 @see Section 3.0 GPIO PORT // GP0 OUT // GP1 OUT // GP4 OUT // GP5 OUT TRISIO = 0b00001100; // LED の点灯パターンを定義 unsigned int pattern [] = { 0b00000001, 0b00000010, 0b00010000, 0b00100000, 0b00010000, 0b00000010 }; unsigned int counter = 0; while (1) { // カウンタを進める counter++; // カウンタをパターン定義数でクリップ/ループ counter %= (sizeof(pattern) / sizeof(pattern[0])); // パターンを出力 GPIO = pattern[counter]; // ウェイト #define _XTAL_FREQ 4000000/*Hz*/ __delay_ms (200/*mSec*/); } }
前回作った回路を流用するので、LED の数は 4 つですが、PIC12F675 を用いる場合、最大で 5 つまでの LED を駆動することができます*1。また、PIC16F84 などを用いれば、さらに多数の LED を駆動することができますが、考え方は全く同じです。
上記のソース中で、pattern
変数に点灯する LED のパターンが登録されているので、これを変更することで様々な点灯パターンを実現できます。また、__delay_ms
関数は、指定された時間、処理を中断するマクロ*2で、PIC の動作周波数(_XTAL_FREQ
)を元にウェイトを実現しています。
回路は前回使ったものをそのまま流用し、スイッチ部分は利用せずに、LED の部分だけを使います。ハードウェアの実装はそのままで、機能を変更できるというのも PIC の便利なところですね。