【漢字表示GLCDの概要】
入手容易な128×64ドットのグラフィック液晶表示器に漢字を表示させる
ためのライブラリを作成しました。
液晶表示器ライブラリとして下記の機能を用意しました。
・初期化
・半角英文字の表示 16文字8行 または 18文字8行が可能
・文字列表示 半角文字配列を直接表示
・全角英数漢字表示 10文字×4行が可能 12×12ドットの漢字
・イメージ表示 128×64ドットのモノクロイメージの表示
・ピクセル表示 128×64座標でのピクセル単位表示
・直線描画 128×64座標でのグラフィック直線表示
漢字を表示したときの画面は下記のようになります。大きな文字なので
視認性は良いでしょう。12×12ドットの漢字も結構判読できます。
【漢字表示方法】
12×12ドットの漢字データの作成は下記手順で行いました。
まずオリジナルのフリーの漢字フォントデータを下記より入手しました。
第1水準、第2水準を合わせて約8,000文字分のデータが含まれています。
「CJKOS Japanese Fonts」
このフォントデータは、もともとは「M+ BITMAP Font」という完全フリーのフォントですが、
オリジナルは、Linuxなどに使用するフォントファイルとして提供されているので、
PICなどではそのままでは使えません
これをPalm Topで使えるバイナリデータに変換したファイルを上記サイトで提供して
いますのでこれを素にします。
このページでは変換後のバイナリデータのフォーマットも説明されていますので
内容を直ぐ理解することができます。
この説明を元にして、PIC+GLCDで使いやすくなるように下記のようなフォーマットに
変換しました。変換はVisual Basicでちょっとしたプログラムを作成して行いました。
このビットマップの構成は、グラフィックLCDの表示方法が下図のようになっているので
これをうまく使えるようにあわせました。
つまり、Pageが8ラインで構成されていますので、これを行のイメージで考えると、全体が
8行の表示器となります。さらに縦の方向に8ビットのデータを送ることで縦の1ライン分が
表示されますから、上図の文字の1バイトをそのまま送れば縦1ライン分の表示となります。
こうして作成したビットマップは、1文字のドットデータを24バイトで構成し、まず上位側の
ドットを12バイト連続で配置します。
これでグラフィックLCDの若いPageに連続してデータを送れば1文字分の上側が表示
されます。
続いて下側のドットの4ビット分と、0の4ビットを合成して1バイトとし、これを12バイト連続
したデータとして並べます。
これで、グラフィックLCDの次のPageに連続して送れば1文字の下半分が表示されます。
この下側には4ドット分の非表示の部分ができますから、これを行間の空きスペースとします。
したがって、グラフィックLCDの2Page分で1行の漢字文字が表示されることになりますから、
漢字表示は4行となります。
文字の間隔は128ドットでちょうど良い間隔が13ドットピッチとなります。しかし5文字で
65ドット必要となりますから、中央と右端で1ドット不足することになりますが、見た感じは
違和感をほとんど感じません。
これで、1行10文字の漢字表示ができることになります。
以上で全ファイルを変換した結果のオブジェクトは、約190kバイトの大きさとなります。
このサイズでしたら、PIC32MXの256kバイトのプログラムメモリに楽に納まります。
また512kバイトのデバイスを使えば楽勝です。
【ライブラリの製作】
このグラフィック液晶表示器を制御するプログラムは、共通で使えるライブラリとして
構成することにしました。
PICとの接続は汎用I/Oポートとして接続して使いますが、ピンの指定は変更することが
できるようにしました。
ライブラリとして用意した関数は下記となっています。
関数名 機能と書式 実行時間他 lcd_Write() 1バイトの書き込み関数(データまたは命令)
《書式》
void lcd_Write(char cs, char code, char DIflag);
cs: 右側(1)/左側(2)の指定
code: 出力するデータまたは命令
DIflag: データ(0)/命令(1)の区別lcd_Read() 1バイト読み出し関数(データのみ)
《書式》
char lcd_Read(char cs);
cs: 右側(1)/左側(2)の指定lcd_Initi() 液晶表示器の初期化、全エリアを消去し、
スタートラインをリセットする
《書式》
void lcd_Init(void);lcd_Clear() 液晶表示器の全体を一定パターンで埋め、
スタートラインをリセット
《書式》
void lcd_Clear(char data);
data: 埋めるパターンデータ(縦方向8ドット分)
lcd_Pixel() 指定座標位置の1ドットを点灯/消灯する
《書式》
void lcd_Pixel(short Xpos, short Ypos, char On);
Xpos: X座標(0〜127)
Ypos: Y座標(0〜63)
On: 点灯(1)/消灯(0)lcd_Char() 1文字を指定位置に書く(16文字/行のピッチ)
《書式》
void lcd_Char(char line, char colum, short letter);
line: 行指定(0〜7)
colum: 桁指定(0〜15)
letter: 文字指定(0x20〜0xDF) ASCIIコードlcd_Char1() 1文字を指定位置に書く(18文字/行のピッチ)
《書式》
void lcd_Char1(char line, char colum, int letter);
line: 行指定(0〜7)
colum: 桁指定(0〜17)
letter: 文字指定(0x20〜0xDF) ASCIIコードlcd_Str() 指定文字列を指定位置から表示する(18文字/行のピッチ)
《書式》
void lcd_Str(char line, char colum, char *s);
line: 行指定(0〜7)
colum: 桁指定(0〜17)
*s : 文字列のポインタ、または"文字列"で指定lcd_Line() 直線描画 (x0, y0)から(x1, y1)を結ぶ直線
《書式》
void lcd_Line(short x0, short y0, short x1, short y1);
x0 x1 :X座標(0〜127)
y0 y1 :Y座標(0〜63)lcd_Image() イメージ描画 1画面全体にイメージを表示させる
《書式》
void lcd_Image(char *ptr);
*ptr :イメージ配列(1024バイト)の先頭ポインタlcd_Scroll() 画面全体のスクロール、スクロールの速さを設定できる
《書式》
void lcd_Scroll(short delay);
delay : スクロール間隔 msec単位lcd_Kanji() 漢字1文字の表示
《書式》
short lcd_Kanji(char line, char colum, char *letter)l
line: 行指定(0〜7)
colum: 桁指定(0〜9)
戻り値: -1 :非漢字データの場合
0 :漢字データの場合KanjiCode() 漢字コードによる1文字表示
《書式》
void KanjiCode(char line, char colum, unsigned char upcode, unsigned char lowcode);
line: 行指定(0〜7)
colum: 桁指定(0〜9)
upcode,lowcode: 1バイトの漢字コード上位バイト、下位バイトdelay_us() 1usec単位の遅延関数
《書式》
void delay_us(short time);
time : 遅延時間指定(1usec〜65535usec)クロック周波数設定
で合わせるdelay_ms() 1msec単位の遅延時間関数
《書式》
void delay_ms(short time);
time : 遅延時間指定(1msec〜65535msec)
【ライブラリダウンロード】
PIC32MX用の漢字グラフィック液晶表示器ライブラリは下記からダウンロードできます。
ライブラリ本体(glcd_lib32k.c)とヘッダファイル(glcd_lib32k.h)で構成されています。
ヘッダファイルでハードウェアのピンの設定を行います。
データバス(DB7-0)の8ビットはPIC32MXの1つの8ビットポートを占有して使うように設定
する必要があります。他の制御用ピンは自由に設定できます。
★★★ 漢字表示グラフィックライブラリ ダウンロード
次に上記で使用した漢字フォント(KanjiFont12.h)と半角英数字カナ(font.h)のデータファイルです。
MPLAB C32のCコンパイラ用のヘッダファイル形式となっていて、フラッシュ領域の
固定データとして確保されるようになっています。
★★★ 12×12ドット 漢字フォントデータ
★★★ 5×7ドット 半角英数字カナのフォントデータ