自作電子小物/TIPS/グラフィックLCD M014C9163SPI/AVR
自作電子小物/TIPS/グラフィックLCD M014C9163SPI/AVR
小型グラフィックLCDモジュールの「M014C9163SPI」を、ATMEL ATmega328Pで制御するためのソフトウエアサブルーチンライブラリです。画像表示目的ではなく、キャラクタLCDモジュールの代わりに使うためのソフトウエア部品で、printf()関数で簡単に文字表示を行う事が出来ます。簡単な図形は表示出来ます。
Graphic LCD M014C9163SPI Library for AVR
2013年1月14日
M014C9163SPI は、aitendoで販売されている 1.44インチ128×128ドットTFTの LCDモジュール と SDカードソケットが付いた基板です。画面は小さいですが大変見やすい表示で、電源が単一3V・インタフェースがシリアルなのでピン数が少なく、2.54mmピッチの接続端子でハンダ付けが容易なのでとても使い易い部品です。
これは、その制御ソフトウエアの部分を克服するためのサブルーチンです。インターネット上を探せば、同様なサブルーチンを見つける事が出来ますが、ライセンス上面倒になるので自分で作りました。
主な仕様
対応LCDモジュール: 不明(aitendoのM014C9163SPI、LCDコントローラが「ILI9163B」の物に対応)
I/Oポート: 4〜5本、D/C=PC0, SDA=PB3, SCK=PB5, CS=PC3, RESET=PC4(変更可能、RESETは省略可能)
座標: X方向左=0、X方向右=127、Y方向上=0、 Y方向下=127
表示図形: 塗りつぶし矩形、任意角度・任意幅の直線、固定サイズの文字
文字種: ASCII 7bitコード0x20-0x7f
文字フォント: 6x8ドット
文字数: 21桁×16行
カーソル機能: なし
スクロール機能: なし(ラップアラウンド表示されます)
バックライト制御: なし
API(アプリケーションプログラムインタフェース)
初期化/終了
グラフィック表示
キャラクタ表示
lcd_prStringのstrには、\n,\f等の制御コードを指定する事が出来ます。
lcd_positionで表示する桁column、行row位置を指定します。
lcd_controlは特殊機能を使う場合に使用します。
lcd_draw_strは任意ピクセル位置に文字を表示出来ます。
lcd_setViewPortは画面の一部のみをキャラクタディスプレイ領域として使いたい時のみ使用します。
ダウンロード
関連ソース全てとサンプルプログラムが入ったIDE(AVRstudio)用のプロジェクトファイルと、サンプル回路図のEAGLE用のプロジェクトファイル
「GraphicLCD_M014C9163SPI_Sample.zip」(140kB)
サンプルの動かし方
・適当なディレクトリにダウンロードしたファイルを展開し、IDEでプロジェクトとして開く。
・回路をブレッドボード等を利用して結線し、AVRISP等のプログラマを接続。
・電源3.3Vを与え、IDEからHEXファイルを書込み。
・書込み完了と同時に、画面に順次3種類の表示が出るはずです。
・バックライトの電源に関係なく、表示は行われます。
ユーザアプリケーションプログラムでの使い方
ソースコードで提供されるライブラリですので、ユーザプロジェクトでコンパイル対象に入れれば、本ライブラリを呼び出せる様になります。具体的には、ユーザのプロジェクトのディレクトリ内に本ライブラリソースファイル2個をコピーし、プロジェクトにもソースファイルを追加登録させるだけです。
サブルーチン内で、WinAVRの<util/delay.h>を使用していますので、IDEのプロジェクト設定のCPUのクロック数の指定を行って下さい。具体的には内容はサンプルプロジェクトをご参照願います。指定しない場合、コンパイルエラーとなります。
使用するI/Oポートは変更可能です。ヘッダファイル”m014c9163spi.h”内で#define定義している、ポートピンの設定箇所を変更するだけです。RESETピンを使わない様にする事も可能です。この場合、定義自体をコメントアウトして下さい。
設計情報
・開発環境
IDE: AVR Studio 4.18.700
Compiler: WinAVR 20100110(GCC 4.3.3)
・ソースファイル
GraphicLCD_M014C9163SPI_Sample.c サンプルプログラム
m014c9163spi.c ヘッダファイル
m014c9163spi.h サブルーチン本体
・printf()連携
文字表示は、printf()関数等のstdioが使えるととても楽です。WINAVRライブラリは、このカスタマイズに対応出来ます。
まず、1文字出力ルーチンを任意の名前で作ります。
つぎに、stdioの制御テーブルの領域を用意されているマクロを使ってグローバル域に確保します。
メインプログラムの最初に1回だけ、制御テーブルとstdoutを関係づける処理を行えばOK。printf(),puts()等のファイルポインタを指定しない関数群の出力先(stdout)がLCDに変わります。
・接続インタフェース
マイコンとの接続は同期シリアル通信で、データ転送方向が片方だけのSPIです。LCDモジュール内のフレームバッファメモリをコマンド指示で変更する形態です。
このサブルーチンでは、ソフトウエアでピンをオン/オフしてデータ転送させる方法となっています。この方が確実に動きを制御出来、データシート通りに、特に問題もなく表示させる事が出来ました。ただし、ソフトウエア制御なので、ATmega328Pの1MHzクロックでは、表示更新はとて遅く実用にはなりません。8MHzに変更しても快適な表示という感じにはなりませんので足からず。
ATmega328PのSPIを使ってハードウエアでのデータ転送を行えば表示更新速度を改善出来るのですが、うまく動作させる事が出来ませんでした。ソースコード上には、その痕跡があります。
・文字フォント
LCDコントローラ内に文字フォントを持っていないので、マイコン上に持たなければなりません。このクラスのマイコンのROMメモリ量では、英数字位しか用意出来ません。フォントを作るのは大変な作業なので、何処かから持ってくる事も考えましたが、著作の扱いが面倒になるので、手作りしております。5x7ドットで英数記号96文字を作りましたが、このサイズではあまり特徴が出し様がなく、だいたい決まってしまいます。なお、AVRはconst宣言した位ではROM上に定数を配置してくれません。この辺は、マイコンの種類によって実装の仕方が違うので、いつも困ってしまいます。
権利関係
GPLに準じます。他から流用したソース部分はありません。参照した情報源は以下の通り。
(1)aitendo@shopping(株式会社 秋葉原)の「1.44インチ液晶モジュール(SPI)[M014C9163SPI]」の販売ページの接続ピン情報とLCDコントローラILI9163のデータシート http://www.aitendo.com/product/3857