CC78K0やCC78K0Sではデバイスのユーザーズ・マニュアルに記載されたレジスタの名称をC言語のプログラム中で使うことができます。そのためにはプログラムの頭の部分で、「
#pragma sfr」と宣言してください。そうすると、内蔵周辺レジスタを変数のように使用することができるようになり、以下の例のように記述することでポート等の制御を行うことができます。
| @ | port_data = P2; | | /* ポート2の状態を変数port_dataに読み込む */ |
| A | PM1 = 0b00000000; | | /* ポート1の8ビット全てを出力に設定 */ |
| B | P1 = 0x55; | | /* ポート1に0x55を出力する */ |
| C | P1.0 = 0; | | /* ポート1のビット0を"0"にする */ |
| D | P1.7 ^= 1; | | /* ポート1のビット7を反転する */ |
| E | while(P2.0 == 0); | | /* ポート2のビット0が"1"になるのを待つ */ |
| F | while(TMIFH1 == 0); | | /* タイマH1のインターバル割り込みを待つ */ |
| | TMIFH1 = 0; | | /* タイマH1の割り込み要求をクリア */ |
@の例ではポート2(の端子の状態)を読み込んで、その値を変数"port_data"に代入します。このような記述を行うことでポート(端子)の状態を取り込むことができます。
Aの例はポート1を出力ポートに設定するために、ポート・モード・レジスタ1の各ビットを0(=出力)に設定しています。
Bの例は全てのビットを出力に設定してあるポート1に対して16進数で55というデータを出力しています。これで、ビット0,2,4,6はハイ・レベルになり、ビット1,3,5,7はロウ・レベルになります。
Cの例はポート1のビット0の値だけを"0"にして出力をロウ・レベルにします。
Dの例はポート1のビット7の出力だけを反転させます。
Eの例はポート2のビット0がロウ・レベルの間はwhileでループするので、ポート2のビット0への入力がハイ・レベルになるのを待つことになります。
Fの例はタイマH1を用いたインターバル・タイマの時間経過を割り込みではなくポーリングにより待つ処理です。前もって指定されたインターバルが経過するとタイマH1は割り込み要求フラグをセットします。ここでは、割り込み要求フラグが"0"の間はwhileでループするので、インターバルの経過までを持つことになります。割り込み要求が発生してループを抜けると、割り込み要求をクリアします(この2つのステートメントをセットで使用します)。
この例のEとFのwhile文のループ条件を比べてください。
Eでは、
"P2.0"と
ポート番号 + "." +
ビット番号で特定のビットを指定しています。ところが
Fでは、
"TMIFH1"とビットの名称を直接記述しています。これがデバイスのユーザーズ・マニュアルでレジスタの説明中のビット番号が□で囲まれたものと、そうでないものの使い方の違いです。
"TMIFH1"は
IF0Hレジスタのビット3なので、
"IF0H.3"と記述してもいいのですが、
"TMIFH1"と書いた方が何を示しているかがはるかに分かりやすいはずです。ところが、
"P2.0"のようにビットそのものには殆んど意味がないので、□はついていません。例えば、
"P2.0"がモータの電源オン/オフの確認に使っているような場合には以下のように目的に応じて名前を定義して使ったほうが
"P2.0"を
"P20"とするよりははるかに分かりやすいはずです。
#define MOTORONOFF P2.0 /* モータ電源確認ポート */
while(!MOTORONOFF);
(2007/12)