漢字表示グラフィック液晶表示ライブラリ


【漢字表示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ドット 半角英数字カナのフォントデータ