LCDについて
LCDの概要
現在はLCDが普及して入手しやすい状況になってきました。入手しやすくなったのはいいことですが、グラフィックLCDに関してはコントローラが多種多様なので、コントローラごとに制御ソフトウェアを開発する必要があります。
Android端末並みに豪華な表示インターフェースが必要な場合はグラフィックLCDを使いますが、単純に制御用コントローラで文字情報を表示するだけならばキャラクタLCDでじゅうぶんです。キャラクタLCDのコントローラとしては日立製HD44780がデファクトスタンダードとなりました。
現在、普及しているキャラクタLCDもHD44780互換コントローラを搭載しており、HD44780用の制御ソフトウェアさえ開発しておけば、LCDのメーカーに関係なく同じソフトウェアで表示制御ができます。
LCDのスペック
今回、対象とするLCDは図1に挙げる16文字が2行(計32文字)の表示能力をもったもので、以下のサイトから単価500円で購入できます。
- LCDキャラクタディスプレイモジュール(16×2行バックライト無)
- URL:http://akizukidenshi.com/catalog/g/gP-00040
上記サイトでは、スペックの概要が記載されており、購入をすると詳細なデータシートが添付されています。
対象とするLCDのデータバス本数は8本ですが、その半分の4本でも制御することは可能なので、通常は配線コストを下げることができる4本でのデータバスで制御されることが多いです。HD44780はかなり昔のコントローラなので電源電圧が5Vとなっており、現在に普及している互換コントローラも多くは5V電源となっています。今回、対象とするLCDも5V電源となっています。
SH7706LSRとの接続
電源電圧の整合
一昔前まではデジタル回路の電源電圧は5V系統で統一されていましたが、現在では3.3V系統にシフトしてきました。SH7706LSRは3.3V系統にシフトした時期にリリースされたマイクロコンピュータなので内部電源1.8V、外部インターフェース電源は3.3Vです。
3.3V系統にシフトした時期以降のコントローラは3.3V電源なのでSH7706LSRとの接続に問題はないですが、今回対象となるLCDのような3.3V系統にシフトした時期以前のコントローラは5V電源なのでなので、そのままでは接続ができません。
SH7706LSRのような3,3V系統のマイコンボードに5V電源系統のような異なる電源系統どうしを接続する場合、一番標準的な方法としては、図2のような電圧変換回路を間にはさむ必要があります。
後継互換コントローラの実際
オリジナルのHD44780は完全に5V電源になっています。今は現物のHD44780が使われることはなく、後継の互換コントローラとなっています。それらの電源スペックの主流は5V電源となっていますが、実はコントローラ内部は3.3V系統インターフェースに対応している場合が多く、今回対象とするLCDも3.3V系統インターフェース対応の5V電源コントローラです。なので、LCDの電源を3.3VにしてSH7706LSRとLCDを直接に接続して制御を行うことができます。
コントローラ自体が3.3V系統インターフェースに対応しているにもかかわらず、なぜ5V電源を要求しているかというと理由があります。LCDモジュールの中で5Vの電圧の要求している部分は、コントローラではなく物理的な液晶そのものを駆動させている部分なので5V電圧でないといけないわけです。
SH7706LSRとの接続方法について
SH7706LSRとの接続は、図3のようにSH7706LSRとLCDの電源を両方に3.3V電源に統一します。
液晶駆動用に別途、負電源発生回路を追加して約-2Vの電圧を液晶駆動用端子追加します。そのことにより、液晶そのものを駆動させている部分にのみ最大5.3Vの電圧がかかるようになります。もっとも、別途5V電源が供給できる場合は、図4のようにSH7706LSRは3.3V電源系統でLCDは5V電源系統でも直結は可能です。
ただし、注意しなければいけない点は、SH7706LSRからLCDへのアクセスは問題ないですが、LCDからSH7706LSRへのアクセスするとLCD系統からの5V電圧が3.3V定格であるSH7706LSRにかかりマイコンボードが破壊する可能性があります。そのため、制御ソフトウェアではLCDへの書き込みのみでLCDからの読み込みをしないようにコーディングして、LCDのアクセス方向を決めるR/W端子をWrite専用に固定する必要があります。
負電源(マイナス電源)発生回路
負電源発生回路は本格的なものとなると複雑になってしまいますが、今回は簡易なものでじゅうぶんなので、図5のような非常に簡素な回路でもLCDで対応可能となっています。
原理としては単純であり、パルス出力側のコンデンサ(C1)に正電圧により一旦、正電荷をチャージします。C1にチャージされた電荷はショットキーダイオードを通して負電圧出力側のコンデンサ(C2)にも転送されます。
両方のコンデンサ間の経路はD1経由とD2経由がありますが、C1からC2の経路ではD2のダイオードのみ電流を通します。そのため、C2ではGND経由からのみ正電荷をチャージされるので、C2では相対的にGND側がプラスで反対側(負電圧出力端子)はマイナスになるので、負電源が供給されるわけです。
SH7706LSRではリアルタイムクロック出力端子があるので、それをパルス出力端子とすれば、図6のようにさらに回路を簡素化することができます。
SH7706LSRとの接続例
SH7706LSRとLCDの接続は汎用I/Oポートで行うので、任意のI/Oポート端子でかまいません。ここでは図7のように接続します。
基本的に端子は任意でいいですが、負電源回路へのパルス出力端子は TCLK端子固定でなければなりません。
LCDデバイスドライバ
ソフトウェアとハードウェアの分担
マイクロコンピュータと周辺コントローラの間でのバスインターフェース接続では、図8のように負論理であるチップセレクト端子がロー(有効)のときのみデータが有効になり、データのアクセスが行われます。
図8のような標準インターフェースでは、そのようなアクセス処理はマイクロコンピュータのハードウェアが自動的に行うので、特にデバイスドライバのほうで処理を行う必要はありません。
しかし、HD44780は非常に古風なインターフェースであり、図9のようにE端子(チップセレクト)がハイからローに変化するときにデータが有効になるような独特なバスインターフェースのため、SH7706プロセッサのバスコントローラでHD44780を扱うことができません。そのため、通常はハードウェアが行うようなバスインターフェースの処理もデバイスドライバで面倒を見なければいけません。
LCDに文字を出力する概要
HD44780の詳細な使い方については液晶購入時に同時に添付されるデータシートを参照してください。図7の接続回路に対応したLCDデバイスドライバのソースコードはリスト1の通りとなります。
LCD制御で行う処理の概要は、LCD初期化時にデータシート記載のとおりに初期化のおまじないを行います(リスト1の114~128行目)。初期化が済めばあとはデータバスにデータをLCDに対して送るだけとなります。RS端子がローの場合はLCD表示制御となり、RS端子がハイの場合は文字出力となります。
LCDに対して文字を出力するには、RS端子をハイにしておいて、データバスにASCIIコードを出力するだけで、図9のようにE端子をハイからローにすると実際にLCDに文字が表示されます。今回の回路がデータバスが4本のため、1回目に8ビットデータの下位4ビットを送付し、2回目に8ビットデータの上位を送付します(リスト1の68~84行目)。
デバイスドライバインターフェース
今回はデータ出力処理のみなので、デバイスドライバインターフェースはlcd_write関数を書き込み関数として登録するだけです(リスト1の103~106行目)。
OSからデータ書き込みリクエストがあるとlcd_write関数が呼び出されます。リスト1の90行目で表示位置を先頭にし、データ数だけcopy_from_user関数でユーザー領域から特権領域へデータをコピーしてASCIIコードをLCDに送信します。表示能力は32文字なのでリスト1の96行目では32バイト分以下のASCIIコードをLCDに送信しています。
LCDの1行あたりの文字数は16文字なので16文字目でリスト1の95行目ではLCDでの改行処理をしています。ASCIIコードでスペースより小さいコードは制御コードなので、リスト1の94行目で制御コードを出力しないようにしています。
その他補足事項
最下位層であるLCD端子の個別制御はそれぞれ次の3つの関数で行っています。
CDのE端子の制御はリスト1の18~24行目で行なっています。
LCDのRS端子の制御はリスト1の27~33行目で行なっています。
4本のデータ端子の制御はリスト1の36~57行目で行なっています。
LCDの制御は汎用I/Oポートで行うので、初期化処理にはSH7706プロセッサで対象となる端子を汎用I/Oポートに設定する処理を、リスト1の111~112行目で行っています。また、今回は負電源回路へのパルス出力が必要なので、パルス出力処理が有効になるようにリスト1の113行目で処理を行なっています。
LCDデバイスドライバのコンパイルと実行
LCDデバイスドライバのコンパイルには、すでにコンパイル済みのカーネルソースコードが必要となります。コンパイル済みのカーネルソースコードは任意の場所でいいですが、コンパイルをするMakefile(リスト2)で -C オプションの後にコンパイル済のカーネルソースコードの場所を記述しなければなりません。
コンパイルは以下のように行います。
SH7706LSRボードでLCDデバイスドライバを組み込む場合は insmodコマンドで引数にLCDデバイスドライバを指定します。
比較的新しいLinuxカーネルの場合は自動でデバイスファイルを生成してくれますが、古いカーネルの場合はリスト3のようなスクリプトをデバイスドライバ組み込み後に実行をします。
次回は
次回はSH7706LSRボードでセルフコンパイル可能なSH3用のgccの移植について解説をします。