第一章 簡単なプログラミングからスタート

C++言語でLEDを点滅させるプログラム

 ここでは、WRC003を用いてC言語でのプログラム開発をしたことがある人を対象にしています。
また、基本的なオブジェクト指向の概念を理解している人を対象にしています。
このZIPファイルを解凍して、中のSimpleH8ワークスペースのsimpleプロジェクトを実行させ、releaseでビルドし、release型のmotファイルをCPUにFDTを用いてプログラムを転送してから、CPUを実行させるとオレンジと緑のLEDが交互に点滅するプログラムです。
なお、この中にあるライブラリは最小限ですので、この後の章では使えません。
使えないと思うと機能が無いと思われますが、メモリが制限されている状況では逆に機能が最低の方がうれしい場合があります。最低限の資産で新しい自前のクラスを多数付け加えられる元であると思った方が良いかもしれません。第二章以降の項目を理解出来たら、それらを全て忘れて自前で新しいもっと高性能なクラスを作るようなガッツを期待しています。「こんなおバカなクラスを作るなよ」とかね。事実、おバカなクラスがあります。これを見つけて高性能化するゲームだと思うと楽しくなるかもしれません。挑戦してください。

次のプログラムが非常に重要な概念を含んでいます。
コードエリアをクリックするとコードがコピーしやすいように選択されます。それ以外をクリックすると解除されます。

LEDを点滅させるプログラム
#include "common.h"
#include "primary.h"

void wait(int n)
{
   for(long i=0; i<n; i++)
     for(long j=0; j<2000; j++);
}

void main(void)
{
  Port Green = Port(CPU.port6, 4);
  Port Orange = Port(CPU.port6, 5);
  Green.setOutput();
  Orange.setOutput();
  
  while(true)
  {
     Green.writePin(true);
     Orange.writePin(false);
     wait(100);
     Green.writePin(false);
     Orange.writePin(true);
     wait(100);
  }
}
 1 iodefine.hを読み込んだり、新しい型の設定をしている。
 2 基本的なクラスのヘッダファイルを読み込む。(ほとんどは、コメントになっている)
 3
 4 waitメソッド(関数)。初心者用時間稼ぎ。引数の数字によって周期が変えられる。
 5
 6
 7
 8
 9
10
11 以下の部分がオブジェクト指向の考え方を用いている。
12 CPUのポート6ビット4をコントロールするPortクラスのオブジェクトGreenを作る。
13 CPUのポート6ビット5をコントロールするPortクラスのオブジェクトOrangeを作る。
14 Greenオブジェクトに対して出力するように設定する。
15 Orangeオブジェクトに対して出力するように設定する。
16
17 永久ループ
18
19 Greenオブジェクトにtrueを出力させる。
20 Orangeオブジェクトにfalseを出力させる。
21 時間待ち
22 Greenオブジェクトにfalseを出力させる。
23 Orangeオブジェクトにtrueを出力させる。
24 時間待ち
25
26



CPU基板上のLEDの点滅に関しては、C言語のプログラムと同じようにできるように、LED関数をライブラリに登録してあります。
上記のプログラムは一般的なポートにある特定のビットをコントロールするためのプログラミング方法で、これがオブジェクト指向プログラミングの基本となります。

C言語で行ったようにLEDを点滅させるプログラム

 LEDについてはC言語で行ったのと同じように使えます。(使えるようにライブラリを作っています)

Cと同じようにLEDを点滅させるプログラム
#include "common.h"
#include "primary.h"

void wait(int n)
{
   for(long i=0; i<n; i++)
     for(long j=0; j<2000; j++);
}

void main()
{
  while(true)
  {
    LED(1);           // LEDをコントロールする関数はライブラリに登録してあります
    wait(100);
    LED(2);
    wait(100);
  }
}


 このように書くと「なんだ、C言語の方が楽じゃないか」という人がいても不思議はありません。このLEDチカチカ関数に関してはその通りです。
しかし、始めに示したC++のプログラムでは、不可能でない限りどのポートの、どのビットにLEDを付けても動作します。また、CのLED関数は2つのLEDのみですが、C++の場合のプログラムは汎用化していますので、可能な限りいくつでも付けることができます。つまり、拡張が簡単であるということです。これがオブジェクト指向の考え方の素晴らしいところで、これが正しく出来るようにプログラミングしましょう。

プログラムをスイッチでスタートさせ、「Hello World!」を表示させる


実行方法
 電源スイッチを入れ、パソコンが通信回線を認識して、「ポコン」と音をさせたら、Teratermで接続します。通信速度は115200bpsであるから、設定していない場合は速度を変更します。
その後、CPUボード上のスイッチを押してプログラムを開始させます。

Hello World!を表示させる
#include "common.h"
#include "primary.h"

void startInit(char* str);

void main()
{
  startInit("***** 表示テスト ********\n");
  printf("Hello World!\n");
  while(true);
}

void startInit(char* str)
{
  LED(1);  // 緑
  while(!getSW() );
  LED(0);
  printf(str);
}
 1
 2
 3
 4 プロトタイプ宣言
 5
 6
 7 緑のLEDを点灯させ、スイッチが押されるまで待ち、
 8 スイッチが押されると、引数の文字列を表示させ、LEDを消灯させる。
 9 機能限定のprintfが使える。
10 永久ループ
11
12
13 startInit関数の本体
14
15 緑のLEDを点灯させる
16 スイッチが押されるまで待つ
17 LED消灯
18 文字列の表示
19



重要なPortクラスのメンバー
フィールド変数
 unsigned int port;    データポートアドレスを保持する
  unsigned int bit;   アクセスするビット
コンストラクタ
 Port();
  Port(unsigned int port, unsigned int bit);
メソッド
  void setInput();       そのビットを入力に設定する
  void setOutput();      そのビットを出力に設定する
  void writePin(unsigned char value); valueを出力する
  unsigned char readPin();       そのbitを読む

第二章に行く    ホームに戻る