超ミニBASIC キャラクタ液晶モジュールサポート

Copyright (C)2003 A.Hiramatsu (03/01/13)

 この文章は超ミニBASIC for H8/3048 の、キャラクタ液晶モジュールサポートのために拡張された部分についての説明です。

・概要

 超ミニBASIC for H8/3048 はキャラクタ液晶モジュールをサポートしています。液晶モジュールはH8/3048の内蔵I/Oポートのほとんどどこにでも接続できます。また、現在出まわっているいろいろな桁数、行数の液晶モジュールに対応しています。接続したポートと液晶モジュールのタイプを指定すると、以後はハードウエアの細かい違いを意識することなく、LPRINT文などで簡単に文字や数値を表示することが可能です。

・対応する液晶モジュール

 対応するキャラクタ液晶モジュールは日立のHD44780相当のLCDコントローラを搭載しているキャラクタ液晶モジュール(秋葉原などで普通に出まわっているものは大抵これに該当します。LM0××相当、と書いてあったらまず間違いありません。が、中には違うもののあるかもしれないので注意してください)で、以下の桁数、行数のタイプに対応しています。

2行タイプ

16桁、20桁、24桁、32桁、40桁

4行タイプ

16桁、20桁


 世の中には1行タイプの液晶モジュールもあるらしいのですが、ほとんど見かけたことがないので正式には対応していません。ただし、全く使えないということではなく、同じ桁数の2行タイプを指定すれば1行目だけは表示されるはずですので、1行目だけ使うようなプログラムを組めば十分使い物になると思います。

・指定可能なポート

 以下の、CPU内蔵ポートを液晶モジュール接続用として指定可能です。コントロールポートは液晶モジュールの制御線(E、RS、R/W)を接続するポート、データポートはデータ線(DB0〜DB7)を接続するポートです。

CPU動作モード

コントロールポート

データポート

モード7

&P1DR
&P2DR
&P3DR
&P4DR
&P5DR
&P6DR
&P8DR
&P9DR
&PADR
&PBDR

&P1DR
&P2DR
&P3DR
&P4DR
&PADR
&PBDR

モード7以外

&P4DR
&P6DR
&P8DR
&P9DR
&PADR
&PBDR

&P4DR
&PADR
&PBDR


 ユーザーが自分で外付けしたポート(たとえば8255など)には対応していません(制御方法がわからないので) 。

 上記の表に載っているポートでも、他のH8内蔵周辺モジュールを使用する場合、そのモジュール用に端子が割り当てられてしまうI/Oポートのビットは液晶モジュール用としては使用できなくなります。他のH8内蔵周辺モジュールと競合するI/Oポートのビットは使用しないようにしてください。

 ポート4(&P4DR)は、CPUモード7以外でも指定は可能ですが、CPUが16ビットバスを使用する設定になっている場合(具体的にはバスコントローラのABWCRに$FF以外の値が設定されている場合)、実際には使用できません。

 ポートAは、CPUモードが3、4、6の場合はビット7がアドレスバスになってしまうので、これらのCPUモードでは実際には4ビット接続のみ可能です。

※指定可能と使用可能の違い

 INITLCD文は、ポートやビットの指定があきらかにおかしいときはエラーを出しますが、他のH8内蔵周辺モジュールとの競合などは検出しません。したがってINITLCD文がエラーを出さない(指定可能)にもかかわらず実際には使用できないケースもありえます。ユーザーのほうで自分が使用したい内蔵周辺モジュールと競合していないかどうかを確認してください。

INITLCD文が検出する「あきらかにおかしい」指定

・8ビット接続なのにコントロールポートとデータポートが同じ
・8ビット接続でデータディレクションマスクに$FF以外の値を設定している
・4ビット接続でデータディレクションマスクの下位4ビットが$Fでない
・4ビット接続で、コントロールポートとデータポートが同じで、コントロールディレクションマスクとデータディレクションマスクが違う
・E、RS、R/Wが接続されているビットの、コントロールディレクションマスクが0になっている



・液晶モジュールとH8CPUの接続

一般的な液晶モジュールのピン配置

ピン番号

略称

区分

説明


Vss(Vdd)

電源

電源−側。GND(0V)に接続する。※こちらが+側の製品もあるので注意!


Vdd(Vss)

電源+側。5Vに接続する。※こちらが−側の製品もあるので注意!


Vo

コントラスト調整電圧。0〜5Vの電圧を与える。


RS

制御線

レジスタセレクト、0でコマンド、1でデータ


R/W

リード/ライト、0で書きこみ(CPU→液晶)、1で読み出し(CPU←液晶)



イネーブル、1で有効


DB0

データ線

データ線下位4ビット
8ビット接続のときのみ使用
4ビット接続のときにはGND(0V)に接続すること


DB1


DB2

10

DB3

11

DB4

データ線上位4ビット
8ビット接続のとき使用
4ビット接続のときにはこちらだけ使用

12

DB5

13

DB6

14

DB7


制御線の接続

・E、RS、R/Wを使う場合

・E、RSのみ使う場合

データ線の接続

・8ビット接続 の場合

・4ビット接続 の場合

電源等の接続

 使用する液晶モジュールの、1番ピン、2番ピンのどちらが+なのかよく確認してから接続してください。3番ピンには片方を+5V、片方をGND(0V)に接続した10KΩ〜20KΩの半固定抵抗の中点を接続します。

液晶モジュール関連の文・関数

《 INITLCD文 》

書式:


 上の書式は見づらいですが、コントロールポートディレクションマスクとデータポートディレクションマスクは省略可能であり、省略しない場合は[](角カッコ)でくくって書く、ということを意味しています。

 液晶モジュールを接続するポートを指定し、液晶モジュールを初期化します。この文を実行しないと液晶モジュール関連の文、関数は一切使用できません。パラメータは以下のような意味を持っています。

<コントロールポートアドレス>

[<コントロールポートデータディレクションマスク>]

<データポートアドレス>

[<データポートデータディレクションマスク>]

<データバス幅>

<Eビット>

<RSビット>

<R/Wビット>

設定例:

 秋月H8マザーボードの場合、ハードウエアは

    P3-7 (未使用)
    P3-6 (未使用)
    P3-5 E
    P3-4 RS
    P3-3 DB7
    P3-2 DB6
    P3-1 DB5
    P3-0 DB4

となっているので(4ビット接続、R/Wは使用しない)、

    INITLCD &P3DR,&P3DR,1,5,4

と設定する。ビット7、6をなんらかの入力として使用したい場合は

    INITLCD &P3DR[$3F],&P3DR[$3F],1,5,4

と、コントロールポートデータディレクションマスクおよびデータポートデータディレクションマスクを指定する。



《 LCLEAR文 》

書式:

 画面をクリヤします。また、画面のサイズ、自動スクロールの有無を設定します。<画面のサイズ>、<自動スクロールの有無>を省略すると画面クリヤのみ行います。

 <画面のサイズ>には、使用する液晶モジュールの桁数、行数に合わせて以下の値を指定します。

桁数×行数

<画面のサイズ>の値

16桁×2行(デフォルト)


20桁×2行


24桁×2行


32桁×2行


40桁×2行


16桁×4行


20桁×4行




 <自動スクロールの有無>には、「画面右下隅に文字を表示したあと、さらに文字を表示しようとしたときの挙動」を指定します。1が指定されていると、そのような状況では画面全体が1行上にスクロールし、カーソルは画面左下隅に移動します。0が指定されているとスクロールせず、カーソルはラップアラウンド(画面左上隅に移動)します。デフォルトは0の、自動スクロールしない動作に設定されています。

例:

16桁×2行の液晶で、

100 LPRINT "0123456789ABCDEF",
110 LPRINT "GHIJKLMNOPQRSTUV",

を実行した後、さらに

120 LPRINT "####",

を実行しようとした場合、<自動スクロールの有無>が0なら
####456789ABCDEF
GHIJKLMNOPQRSTUV

となり、<自動スクロールの有無>が1なら
GHIJKLMNOPQRSTUV
####

となります。



《 LCURSOR文 》

書式:

 カーソルを指定の位置に移動します。また、カーソル形状の変更も行います。

 <パラメータ並び>には<形状指定>、または<位置指定>を ,(コンマ)で区切って書きます。

 <形状指定>には数式を1つ書きます。数式の値によりカーソルの形状は以下のように変化します。

カーソル形状

<形状指定>の値

カーソルを表示しない(デフォルト)


四角形点滅


下線


下線+四角形点滅



 <位置指定>は、@(アットマーク)に続けてX位置、Y位置を表す数式を , (コンマ)で区切って書きます。設定可能な値は、X位置は0〜画面の幅−1、Y位置は0〜画面の高さ−1です。

例:

カーソル形状を下線+四角形点滅に変更

    LCURSOR 3

カーソルを8,1の位置に移動

    LCURSOR @8,1

カーソルを8,1の位置に移動し、カーソル形状を下線に変更(どちらも同じ効果)

    LCURSOR @8,1,2
    LCURSOR 2,@8,1

※注意 カーソル位置指定の場合は@(アットマーク)を忘れないでください。たとえばカーソルを0,0に移動するつもりで@を忘れて LCURSOR 0,0 なんてやると、カーソル形状を二度0に指定したことになり、カーソルは移動しません。

《 LPRINT文 》

書式1:

書式2:

 液晶画面に数値、文字列などを表示します。使い方はシリアルターミナルに表示を行なうPRINT文とほぼ同じです。PRINT文キャストなどもPRINT文と同じものが使えます。

《 PUTLCD文 》

書式:

 液晶モジュールに直接コマンドまたはデータを送ります。<RS>が0なら<式>の値はコマンドとして、1なら<式>の値はデータとして送られます。

 この文は、普通にプログラムを組むぶんにはまず使うことはないと思います。この文で不適切なコマンドを送ると、以後LPRINT文などによる表示が正しく行なわれなくなることがありますので注意して使用してください。

《 LCHR関数 》

書式:

液晶ディスプレイ上の、<X位置>、<Y位置>で指定される位置に現在表示されている文字コードを返します。

《 LCPOS関数 》

書式:

現在のカーソル位置を返します。式の値が0ならX位置、1ならY位置を返します。返ってくる値は、X位置は0〜画面の幅−1、Y位置は0〜画面の高さです。

普通はY位置として0〜画面の高さ−1が返ってくるのですが、画面の高さと等しい値が返ってきた場合は、「次になにか文字が表示されるとスクロールまたはカーソルのラップアラウンドが行なわれる」という状態を表しています。

液晶モジュール関連のエラーメッセージ

LCD BAD CONFIG

INITLCD文のパラメータが不適切

LCD NOT INITIALIZED

INITLCD文による液晶モジュールの初期化が成功していないのにLCD関連の文・関数を使おうとした


その他、式の値の範囲が正しくない場合(たとえばビット番号に0〜7以外の値を指定した場合など)には ILLEGAL FUNCTION CALL がでます。