前回は、 HC08スタータ・ボード上のプッシュ・スイッチと LED を使った実験を行いました。 そのため、使用するポートはポートAだけに限られていました。 今回はポートB を積極的に使ってみることにします。 HC08スタータ・ボード(Ver.2) には拡張用のコネクタを実装するための空きランドが用意されていますので、それを使って実験を進めます。
TC1602E-13T (SUNLIKE社 SC1602BSLB互換) は青色バックライトに白文字
◆ ポートB を使って基礎的な入出力実験をしてみる
いきなり液晶表示器(LCD) でもよいのですが、その前にポートBの使い方としてちょっと基礎的なことをやっておきます。 ポートA と異なり、せっかく 8本ありますから 4本を入力、4本を出力にして動かしてみましょう。まず回路図を示します。
ブレッド・ボードを利用するために、HC08スタータ・ボードに下の写真のような加工を施しました。見ておわかりのとおり、ポートB の信号と GND が接続されている CN3 の空きランドに、9ピンL字型のピン・ヘッダ を取り付けました。 CN2 の空きランドにはポートA の信号と VDD, GND が接続されているので今回は使わないのですが、せっかくですから、ついでに 8ピンL字型のピン・ヘッダを取り付けておきました。 L字型 のことを アングル ともいいますので覚えておきましょう。 筆者は千石電商で 40ピンのL字型ピン・ヘッダを購入し、必要なピン数にカットして使用しました(10本入りの商品 を購入した。バラ売りの商品は形状が異なり使いにくい)。
先ほどの回路図のとおりにブレッド・ボードを使って組み上げると、このようになります。
HC08スタータ・ボードを立てた状態でブレッド・ボードに突き刺す
電池ホルダのリード線が切れないようにホット・ボンドで固定した
基板の裏と表を間違えないようにしてください。写真のとおりに回路を組み立てると右端の青い線が GND となり、右から順番に PTB0, PTB1, ・・・ , PTB7 となります。 ブレッド・ボードは エレキジャックNo.8 に付録で付いていたものを利用しました。 ブレッド・ボードの仕組みや使い方に関しては、エレキジャック No.8 を参考にしてください。ジャンパ線は秋月電子で EIC-J-L を購入しました。
今回使用した DIP-SW(ディップ・スイッチ)は、マルツパーツ館で購入した A6T4104 で、4個のスイッチが入った部品になっています。「ON」 と書かれたほうが上の写真で見て奥側になるように配置してください。
LED は足の長いほうが アノード(A) 、短いほうが カソード(K) です。写真で見て奥側がアノードになります。 ブレッド・ボードに並べて配置すると少し狭いので、直径5mmではなく 3mmのタイプを使いました。
◆ ポートB を使った基礎実験のプログラム
準備ができたら、さっそくプログラムを作って動かしてみましょう。四つのスイッチで四つの LED を個別に点灯・消灯させるプログラムを作ります。 PTB0 と PTB4、PTB1 と PTB5、PTB2 と PTB6、PTB3 と PTB7 が対応するものとして、それぞれのスイッチをオンしたときに LED が点灯するように作ってみてください。
実際に考えて作ってみていただきたいのですが、ヒントを書いておきましょう。
・ 4個のスイッチ入力ポートには、内部プルアップ抵抗を有効に設定すること。
・ 回路図から判断できますが、スイッチ・オフで入力ポートが H、スイッチ・オンで
入力ポートがL になります。
・ LED は出力ポートが L のとき消灯、H のとき点灯です。
これだけのヒントで、プログラムを作ってみてください。プロジェクト名は qy4a_portb00 などでよいでしょう。
ところでHC08スターター・ボードを立てているので、ジャンパの設定を変更するのが大変そうだ、と思った方もおられるでしょう。 その心配は無用です。 今回はポートA を使っていないので、CodeWarrior でフラッシュ書き換えが済んだらそのままデバッガを動かしてステップ実行やブレークポイントを設定しての実行が可能です。何回フラッシュ書き換え~デバッグ実行をしても、ジャンパの設定はデフォルトのままで OK です。 意外に便利ですよ! ぜひ試してみてください。
DIP スイッチを切り替えるときは、ちょっと押さえながら精密ドライバなどを使う
さてそれでは解答です。 例として、こんなふうに書けます。
main関数の中身だけ示します。
PTBPUE = 0x0F;
DDRB = 0xF0;for( ; ; ){
PTB_PTB4 = ~PTB_PTB0;
PTB_PTB5 = ~PTB_PTB1;
PTB_PTB6 = ~PTB_PTB2;
PTB_PTB7 = ~PTB_PTB3;
}
それぞれスイッチ入力を反転して LED に出力しています。 ~ の記号はビットの反転 を意味する演算子です(フォントの関係で見づらいがハイフン・マイナスではなくチルダを使っている)。 ! の記号は真・偽を反対 にする演算子でした。ここでは対象としている情報が 1ビットなので、どちらを使っても同じです。 前回までの説明を読んでいれば、何も難しいことはないですね。
ここまでは各ポートの入力・出力をすべてビット単位で行ってきました。 同一のレジスタに配置されているもの同士なら、まとめて読み書きすることもできますから、それをやってみましょう。
PTBPUE = 0x0F;
DDRB = 0xF0;for( ; ; ){
PTB = ~PTB << 4;
}
これで OK です。 ずいぶんスッキリしましたね! このままではわかりにくいかもしれないので、丁寧に解説しておきます。
・ 代入文の右辺にレジスタを書くと、そのレジスタが読み出されます。
・ 右辺に PTB と書くと PTB レジスタが読み出され、仮の情報として得ることが
できます。以降、この情報に対して操作のようすを見ていきます。
・ 読み出された情報の上位 4ビットは LED への出力の情報になっていて、
下位 4ビットは読み出されたスイッチのポートのレベルが入っています。
・ ~ の演算子を付けると、全ビットを反転します。これで各スイッチを ON にしたとき
に各ビットが 1 になります(上位 4ビットも反転するが使わないので気にしない)。
・ C言語で << 4 と書くと 4ビットぶん左にシフト します。これにより、8ビットの情報
の下位4ビットが上位4ビットに移動され、下位4ビットはすべて 0 になります。元々
あった上位 4ビットは、消えてなくなります。
・ 代入文の左辺にレジスタを書くと、そのレジスタへの書き込みが行われます。
・ 左辺に PTB と書くと、右辺で用意した情報が PTB に書き込まれます。上位の
4ビットは LED への出力データになっていて、実際に LED を点灯・消灯させます。
下位の 4ビットは入力ポートですからレジスタに書き込まれるだけで、動作には
影響がありません。
どうもいまいちスッキリしないという方は、もう一度 第16回 第17回 のレジスタ解説を読み直してみてください。
◆ ポートB を使って液晶表示器(LCD) を動かしてみる
必要な知識がそろったところで、ポートB に LCDモジュールを接続して何かメッセージを表示してみましょう。 下の回路図を見てください(クリックで拡大)。 10μF の電解コンデンサはなくても大丈夫です。表示文字のコントラスト調整用の半固定抵抗は 10kΩ~30kΩ程度のものを使ってください。 また、バックライトに関しては、この回路図には記載していません。
(*1) バックライトの消費電流と HC08スタータ・ボードの Q1 について
SC1602SB*B という製品の場合はバックライトがないため、消費電流の心配がないのでそのまま使うことができます。 SC1602SBLB の場合はバックライトを点けなければ SC1602BS*B と同じであり問題ありません。しかしバックライトを点ける場合はちょっと問題で 、170mAほど流したときに明るく点灯しました。 そのままでは消費電流が多すぎて、HC08スタータ・ボードには接続できません。 対策として HC08スタータ・ボードの Q1 を 2SA1015 から 2SA1020 に交換すると、Q1 に流せる電流を増やすことができます。SUNLIKE 製 SC1602BSLB や Linkman 製 TC1602E-06T(黄緑色) のバックライトを点灯させて使うときは必ず Q1 を 2SA1020 に交換してください。
これらの LCDモジュールは 14ピン・コネクタが 7ピン×2列配列のため、ブレッド・ボードでは使いにくいのでユニバーサル基板を使いました(1列配列の製品もある)。
今回はバックライトの評価も兼ねて実験を行ったので、電源電圧は 5V にしています。スタータ・ボードの電源は電池駆動ではなく、5V の ACアダプタ を使う必要があります。
◆ LCDモジュールのために用意したプログラム
ポートB を使って LCDモジュールにアクセスし、メッセージを表示するだけの簡単なプログラムですが、今までの知識だけでは完全に理解するのは困難だと思います。でも、難しすぎる・・・と諦めないでください。とりあえず動かすことができるプログラムを用意しています。それに、独自のプログラムへの応用がラクにできるようにプログラム・ソース中に親切なコメントを入れておきました。圧縮ファイルを C:\HC08 に展開したら、 C:\HC08\qy4a_lcd00\Sources\main.c を開いて読んでみてください。
プログラムはこちらです。 qy4a_lcd00.zip
プロジェクトごと圧縮してあります(圧縮ファイルの中に main.c が入っています)。
CodeWarrior Development Studio for MCUs V6.x で 【qy4a_lcd00.mcp】 を開いてください。
HC08スタータ・ボードをデフォルトの設定にして、プログラムを MC908QY4A に書き込んでみてください。この応用例も先ほどの基礎実験と同じで、ポートB だけを使っています。ポートAを使っていないので、書き込んだあと CodeWarrior を終了させず、そのまま実行させて動かすことができます。ジャンパの設定も変更する必要はありません。LCDモジュールにメッセージが表示されましたか? ちなみに、このときマイコンはスタータ・ボード上の 9.8304MHz ÷ 4 で動いています。
◆ デバッガを終了させ単独で LCDモジュール用プログラムを動かす
CodeWarrior を終了させて、いったん HC08スタータ・ボードの電源をオフにしてください。ジャンパの設定を変更します。(JP1 のジャンパ・リンクはショート。JP2 はジャンパ・リンクはなし。JP3 は 1-2間をショート。JP4 は 1-2間をショート。VR1 は自由) 変更したら HC08スターター・ボードの電源をオンにしてください。LCDモジュールにメッセージが表示されましたか? このときマイコンは内蔵クロックの 12.8MHz ÷ 4 で動いています。
ところで JP1 をショートさせたときとさせないときで液晶表示のコントラストが少し変わったことに気付かれたでしょうか。 VDD 電圧が 0.3V ほど変わりますから、最適なポイントも変わってきます。好みに応じてコントラスト調整用の半固定抵抗を調整してください。
LCDモジュール用プログラムの補足説明
char LcdDataLine1[ LCD_1LINE_LEN + 1 ] = "TC1602E-13T "; として用意しておいた RAM 上の配列(変数)を LCDの1行目に表示したいときにはLcd_putLine( 1, LcdDataLine1 ); とすればよい、ということは勘の良い方ならソース中のコメントを見て理解できると思います。もちろん RAM 上の配列ですから好きなように中身を書き換えることも可能です。
ところでこの関数、こんな書き方で使うこともできますので覚えておいてください。
Lcd_putLine( 1, "TC1602E-13T " ); 文字列を直接書いています。ただし文字列の長さを変えることはできませんので注意してください。書きたい文字数が少ない場合は文字列を短くするのではなく、半角スペースで埋めてください。なお、プログラム中では U1 を char と同じ型名として記述しています。
次回は、 【書籍サポート】 HC08ミニマイコン扇風機のR-2Rラダー型D-A変換器 の予定です。
『参考文献』
「試しながら学ぶHC08マイコン入門」 (CQ出版)
第1章 マイコン電子工作を始めよう
第10章 統合開発環境CodeWarriorを使ってみる
Appendix F KMC908QY4Aユーザ・モード・モニタ入りマイコンの知識
筆者のホームページ 『マイコン工作の実験室』
組み込みエンジニア 川野亮輔
