【グラフィック液晶表示器制御ユニット試作】
最新のグラフィックの液晶表示器が入手できましたので、早速使ってみました。
ついでにPICで汎用に使える制御ライブラリを作成してみました。
試作した制御ユニットは下記写真のような構成で、次のページにあるオシロスコープ
試作用として製作したものです。
使用したグラフィック液晶表示器は、SUNLIKE社製「SG12864A」という製品です。
基板上側にあるのが「SG12864A」液晶表示器
制御用PICはPIC24HJ12GP202という28ピンの
もので、40MIPSのフルスピードで動作させています。
基板左側はオシロスコープ入力用のアンプです。
中央にある青いロータリDIPスイッチにより
テスト内容を切替できるようにしています。
【ライブラリの概要】
最新のグラフィックの液晶表示器が入手できましたので、早速PICで汎用に
使える制御ライブラリを作成してみました。ライブラリの機能は下表のように
なっています。
MPLAB C30のCコンパイラベースで作成していますが、C言語のみで記述して
いますので、他のコンパイラへの移植も簡単だと思います。
関数名 機能と書式 実行時間
(40MIPS)lcd_Write() 1バイトの書き込み関数(データまたは命令)
《書式》
void lcd_Write(char cs, char code, char DIflag);
cs: 右側(1)/左側(2)の指定
code: 出力するデータまたは命令
DIflag: データ(0)/命令(1)の区別約10usec lcd_Read() 1バイト読み出し関数(データのみ)
《書式》
char lcd_Read(char cs);
cs: 右側(1)/左側(2)の指定約6usec lcd_Initi() 液晶表示器の初期化、全エリアを消去し、
スタートラインをリセットする
《書式》
void lcd_Init(void);約20msec lcd_Clear() 液晶表示器の全体を一定パターンで埋め、
スタートラインをリセット
《書式》
void lcd_Clear(char data);
data: 埋めるパターンデータ(縦方向8ドット分)
約10msec lcd_Pixel() 指定座標位置の1ドットを点灯/消灯する
《書式》
void lcd_Pixel(int Xpos, int Ypos, char On);
Xpos: X座標(0〜127)
Ypos: Y座標(0〜63)
On: 点灯(1)/消灯(0)約70usec lcd_Char() 1文字を指定位置に書く(16文字/行のピッチ)
《書式》
void lcd_Char(char line, char colum, int letter);
line: 行指定(0〜7)
colum: 桁指定(0〜15)
letter: 文字指定(0x20〜0xDF) ASCIIコード約95usec lcd_Char1() 1文字を指定位置に書く(18文字/行のピッチ)
《書式》
void lcd_Char1(char line, char colum, int letter);
line: 行指定(0〜7)
colum: 桁指定(0〜17)
letter: 文字指定(0x20〜0xDF) ASCIIコード約85usec lcd_Str() 指定文字列を指定位置から表示する(18文字/行のピッチ)
《書式》
void lcd_Str(char line, char colum, char *s);
line: 行指定(0〜7)
colum: 桁指定(0〜17)
*s : 文字列のポインタ、または"文字列"で指定5文字で
約430useclcd_Line() 直線描画 (x0, y0)から(x1, y1)を結ぶ直線
《書式》
void lcd_Line(int x0, int y0, int x1, int y1);
x0 x1 :X座標(0〜127)
y0 y1 :Y座標(0〜63)最長対角線で
約8.4mseclcd_Image() イメージ描画 1画面全体にイメージを表示させる
《書式》
void lcd_Image(char *ptr);
*ptr :イメージ配列(1024バイト)の先頭ポインタ約29msec lcd_Scroll() 画面全体のスクロール、スクロールの速さを設定できる
《書式》
void lcd_Scroll(int delay);
delay : スクロール間隔 msec単位delay設定に依存 Delay200n() 200nsec固定の遅延関数
《書式》
void Delay200n(void);40MIPS専用 Delay1u() 1usec単位の遅延関数
《書式》
void Delay1u(int time);
time : 遅延時間指定(1usec〜65535usec)Delay1m() 1msec単位の遅延時間関数
《書式》
void Delay1m(int time);
time : 遅延時間指定(1msec〜65535msec)
【グラフィック液晶表示器の機能仕様概要】
このグラフィックLCDは下図のように左右2つの64×64ドットの表示部として
構成されています。いずれも全く同じ機能を持っていて、CS1とCS2で選択する
ことで別々に制御する必要があります。
それぞれの座標は下図のようになっていて、左上が原点(0, 0)で、右下端が
(63, 63)と2つの表示部が独立した座標になっています。
上から8LineずつまとめてPageと呼び、Pageの内部は横方向に64本ので
構成されていて、この1本の縦方向の8Line分が1バイトのデータとして制御されます。
注意が必要なのは、1バイトの上側がデータビットの0ビット目となっていることです。
場所の指定方法はCS1かCS2で左右のどちらかを選択し、さらにPageと
Colum Addressで特定のバイトを指定します。
【試作例回路】
このSG12864Aのグラフィック液晶表示器とPICとの接続は下図のように
しています。データバスは入出力両方向にする必要がありますので、
Read/WriteでTRISレジスタの設定変更が必要になります。
回路の詳細については次の製作例のオシロスコープを参照して下さい。
【表示例】
テストプログラムで実際に表示させた例が下記となります。
文字の表示例
ASCII英数字、カナの表示ができます。
フォントもプログラム内に組み込んでいます。
フォントを追加すれば自由にできます。
直線描画例です。
X,Y指定で縦横斜め自由に直線が
描けます。
直線で補間して曲線を描いた例です。
結構きれいに曲線も描けます。
イメージを表示させた例です。
パソコンで128×64ドットのモノクロ画像を
作成しBMPファイルで保存してから
下記の変換ツールを使えば自由に
画像が表示できます。
画面のスクロール例です。
スクロール速さを自由に指定できますので
結構スムーズにスクロールできます。
【ライブラリ製作】
上記試作回路にてグラフィック液晶表示器の各種テストを行うための
テストプログラムを作成しました。ここにライブラリもい含めています。
下記からMPLAB IDEのプロジェクトとしてダウンロードできますので、
そのままMPLAB IDEでお使い下さい。
10進のロータリDIPスイッチによりテスト内容が切替できるようになっています。
★★★ グラフィック液晶表示器テストプログラムのダウンロード
(グラフィック液晶表示器用ライブラリも含む)
【グラフィック画面変換ツール】
パソコンのペイントなどのソフトで作成したモノクロ128×64ドットのBMPファイルから
上記ライブラリのイメージデータ配列へ変換するツールです。
Visual Basic 2005で作成しています。
起動すると下記アイコンが表示されます。
ここで、変換・保存のボタンをクリックすると、ファイル選択ダイアログになりますので、
変換したいBMPファイルを指定するだけです。変換が完了すると下図のように表示
されます。
生成されるファイル名は「Data.txt」という固定名称で、BMPファイルと同じフォルダ内
に生成されます。16データごとに改行コードが挿入されたCSV形式のファイルですので
Excelやテキストエディタで編集することも可能です。
生成されたファイルをテキストエディタで開き、全体をコピーしてから、MPLABの
エディタに貼り付け、配列としての体裁を整えれば完成です。
★★★ 実行ファイルのダウンロード(BMPtoHEX.exe)