組み込み機器向けの、単純なサブルーチンライブラリです。対応するLCDモジュールとのインタフェースは、利用者で用意する形です。
目次
共通API
ライブラリは階層構造になっています。アプリケーションプログラムは、全てのAPIを使っても構いませんが、層の混在使用は避けて下さい。
ドライバ層
一番、基礎となる機能群です。アプリケーションからは、以下のAPIを使って下さい。表示/タッチデバイスの実装者は、このAPIの実体を作成して下さい。
図形描画
#include “lcd_draw.h” void lcd_drawOpen(void); void lcd_drawRect(short x, short y, short width, short height, unsigned short color); void lcd_drawLine(short x1, short y1, short x2, short y2, short line_size, unsigned short color); void lcd_drawImage(short x, short y, short width, short height, unsigned short *image); void lcd_drawChar(short x, short y, unsigned short face_color, unsigned short back_color, char c); void lcd_drawStr(short x, short y, unsigned short face_color, unsigned short back_color, char *str); void lcd_drawInit(void); void lcd_drawChar2(short x, short y, unsigned short face_color, unsigned short back_color, char c, const struct lcd_font *font); void lcd_drawStr2(short x, short y, unsigned short face_color, unsigned short back_color, char *str, const struct lcd_font *font); void lcd_drawArc(short x, short y, short r, float startRad, float endRad, short line_size, unsigned short color);
一番初めにlcd_drawOpenを呼び出してください。
そのほかはコールされた時点で上書き表示されるだけです。
各APIの機能は名前と引数から類推して下さい。
x,yはピクセル単位で絶対座標値で実デバイスのサイズを超えない値を指定します。
値を超過した場合の動作は保証されません。
タッチ検出
void lcd_touchOpen(void); short lcd_touchPoint(short *x, short *y); // 帰る値は押した強さ[%] void lcd_touchCalibrate(void);
各APIの機能は名前と引数から類推して使って下さい。
物理的にタッチ機能がない場合は、空関数を作って下さい。実際のデバイスは、マウスやジョイスティックでも良いでしょう。
文字フォント
#include “lcd_font.h” LCD_FONT_6x8 LCD_FONT_8x12 LCD_FONT_12x16 LCD_FONT_16x24 LCD_FONT_18x24 LCD_FONT_24x36 LCD_FONT_24x32 LCD_FONT_32x48 unsigned int *lcd_fontGetPattern(const struct lcd_font *font, char c); int lcd_fontGetWidth(font) int lcd_fontGetHeight(font)
現時点では大きさのみの規定で、書体の区別はありません。
lcd_fontGetPatternは、文字cのビットイメージアドレスを返します。
lcd_fontGetWidth/Heightは、文字の縦/横ピクセル数を返します。
デバイス依存しないので、提供するソースコードをそのまま利用できます。
色
#include “lcd_color.h” LCD_COLOR_BLACK LCD_COLOR_RED LCD_COLOR_GREEN LCD_COLOR_BLUE : 他、多数定義されていますが、任意の色をRGB成分で指定可能です。 unsigned short LCD_COLOR_CODE(float red, float green, float blue); /* ユーティリティマクロ */ float LCD_COLOR_R_VALUE(unsigned short colorCode); float LCD_COLOR_G_VALUE(unsigned short colorCode); float LCD_COLOR_B_VALUE(unsigned short colorCode); unsigned short LCD_COLOR_TO_DARK(unsigned short colorCode); unsigned short LCD_COLOR_TO_LIGHT(unsigned short colorCode);
colorCodeは16ビットでrrrrrggggggbbbbbのビットフィールドとなります。r=赤、g=緑、b=青、の色表現です。
LCD_COLOR_TRANSPARENT(透明)に関しては、全ての場所で有効な訳でなく、透明にならない場合があります。
デバイス依存しないので、提供するソースコードをそのまま利用して下さい。
ミドル層
キャラクタディスプレイエミュレーション
#include “lcd_vcd.h” void lcd_setViewPort(unsigned char x, unsigned char y, unsigned char width, unsigned char height); void lcd_prString(char *str); void lcd_prCString(char *str); void lcd_position(unsigned char column, unsigned char row); void lcd_control(unsigned char command);
printfが有効となります。
lcd_prStringのstrには、\n,\f等の制御コードを指定する事が出来ます。
lcd_positionで表示する桁column、行row位置を指定します。
lcd_controlは特殊機能を使う場合に使用します。
lcd_draw_strは任意ピクセル位置に文字を表示出来ます。
lcd_setViewPortは画面の一部のみをキャラクタディスプレイ領域として使いたい時のみ使用します。
使用される文字フォントは6×8です。
簡易GUI
#include “lcd_gui.h” void lcd_guiOpen(); void lcd_guiHandler(struct lcd_guiRoot *root); /* 図形登録(静的にデータ定義出来る#defineマクロもあります) */ struct lcd_guiRect * lcd_guiNewRect(struct lcd_guiGroup *group, short x, short y, short width, short height, unsigned short color); struct lcd_guiLine * lcd_guiNewLine(struct lcd_guiGroup *group, short sx, short sy, short ex, short ey, short lineWidth, unsigned short color); struct lcd_guiPoly * lcd_guiNewPoly(struct lcd_guiGroup *group, struct lcd_guiCoordinate *point, int n, int m, short lineWidth, unsigned short color); struct lcd_guiArc * lcd_guiNewArc(struct lcd_guiGroup *group, short x, short y, short r, float srad, float erad, short lineWidth, unsigned short color); struct lcd_guiStr * lcd_guiNewStr(struct lcd_guiGroup *group, short x, short y, unsigned short faceColor, unsigned short backColor, char *str); struct lcd_guiText * lcd_guiNewText(struct lcd_guiGroup *group, short x, short y, short width, short height, unsigned short faceColor, unsigned short backColor, int hAlign, int vAlign, char *str, const struct lcd_font *font); struct lcd_guiImage * lcd_guiNewImage(struct lcd_guiGroup *group, short x, short y, short width, short height, unsigned short *image); struct lcd_gui7seg * lcd_guiNew7seg(struct lcd_guiGroup *group, short x, short y, short width, short height, unsigned short faceColor, unsigned short backColor, short lineWidth, int column, unsigned char *pattern); struct lcd_guiGage * lcd_guiNewGage(struct lcd_guiGroup *group, short x, short y, short width, short height, unsigned short faceColor, unsigned short backColor, int vartical, float value); struct lcd_guiBarChart * lcd_guiNewBarChart(struct lcd_guiGroup *group, short x, short y, short width, short height, unsigned short backColor, int vartical, int n, float *value, unsigned short *color); struct lcd_guiGroup * lcd_guiNewGroup(struct lcd_guiGroup *group, short x, short y, short width, short height, unsigned short backColor, struct lcd_gui * figures, void (*eventProg)(enum lcd_guiEvent event, struct lcd_guiCoordinate *touch, struct lcd_guiGroup *seg)); struct lcd_guiRoot * lcd_guiNewRoot(unsigned short backColor, struct lcd_gui *figures, void (*eventProg)(enum lcd_guiEvent event, struct lcd_guiCoordinate *touch, struct lcd_guiGroup *seg)); struct lcd_guiButton * lcd_guiNewButton(struct lcd_guiGroup *parent, short x, short y, short width, short height, char *caption, const struct lcd_font *font, unsigned short faceColor, unsigned short backColor, unsigned short touchColor, enum lcd_guiButtonMode mode, int state, void (*actionProg)(struct lcd_guiButton *seg)); struct lcd_guiFloatField * lcd_guiNewFloatField(struct lcd_guiGroup *parent, short x, short y, short width, short height, unsigned short faceColor, unsigned short backColor, char *format, const struct lcd_font *font, float min, float max, float value, void (*actionProg)(struct lcd_guiFloatField *seg)); struct lcd_guiIntegerField * lcd_guiNewIntegerField(struct lcd_guiGroup *parent, short x, short y, short width, short height, unsigned short faceColor, unsigned short backColor, char *format, const struct lcd_font *font, int min, int max, int value, void (*actionProg)(struct lcd_guiIntegerField *seg)); struct lcd_guiPullDown * lcd_guiNewPullDown(struct lcd_guiGroup *parent, short x, short y, short width, short height, unsigned short faceColor, unsigned short backColor, char **label, const struct lcd_font *font, int number, int select, void (*actionProg)(struct lcd_guiPullDown *seg)); struct lcd_guiTextField * lcd_guiNewTextField(struct lcd_guiGroup *parent, short x, short y, short width, short height, unsigned short faceColor, unsigned short backColor, int hAlign, int vAlign, char *str, size_t len, const struct lcd_font *font, void (*actionProg)(struct lcd_guiTextField *seg)); /* 図形データ操作 */ void lcd_guiSetDirtys(struct lcd_gui *seg); void lcd_guiSetHiddens(struct lcd_gui *seg, int f); struct lcd_guiGroup *lcd_guiGetParent(struct lcd_gui *seg); void lcd_guiSet7segFixedPoint(struct lcd_gui7seg *seg, int value, int dotPoint); void lcd_guiSetRelink(struct lcd_gui *seg);
図形を登録していく事で、画面の表示だけでなく、再描画が自動的に行われる仕組みです。ポップアップ表示などを行いたい時に有用ですし、タッチアクションとも連携します。単純な、固定画面の表示では不要でしょう。
各APIの機能は名前と引数から類推して下さい。
基本的に、まず図形グループを lcd_guiNewGroup() で生成し、それに図形を追加登録していくというスタイルをとります。図形グループとは、小さな矩形画面領域を設定し、その中に図形を描画するという考えです。これにより、グループ全体を移動したり、一括して非表示にしたりといった、図形部品としての操作を行いやすくします。また、グループの配下にグループを作る事も出来ますので、一つの図形として扱う事が出来ます。一番の大元のグループは「ルート」と呼び、 lcd_guiNewRoot() で生成します。
入力系は、基本的にコールバック形式になります。タッチされた場合、事前に設定した関数がコールされると言う仕組みです。この、機能を実装する為と、画面更新の為に「ハンドラ」という形で、定期的に lcd_guiHandler() をコールしてもらう必要があります。
具体的な使い方は、サンプルプログラムのソースコードを参照下さい。
各図形は、APIを介せず直接参照しても、更新しても構いませんが、思ったような結果にならない場合もあります。少なくとも、図形に変化があった場合は、lcd_guiDirtys()で変化があった事を通知して下さい。
C言語のイニシャライザで静的に図形データを定義する#define定義も用意しています。詳細なドキュメントはありません。ヘッダファイルをご参照下さい。
内部情報
ライブラリ内依存関係
中段がドライバ層で、単に画面へ一発表示するだけ、入力状態をセンスするだけの、基本的な機能です。自由度は高いですが、アプリケーションプログラムの負荷は高くなります。
下半分がミドル層で、単にキャラクタディスプレイのようにテキスト表示だけを行うのがVCD、画面とタッチ動作を有機的に結びつけるのがGUI機能です。アプリケーションプログラムの負荷は軽くなります。なぜ、負荷が低いのかと言うと、一度描画した図形は「図形データ」と呼ぶメモリに保存され、自動的に再表示されるからです。アプリケーションによっては再表示なんて大した事はない場合もありますが、これによって再表示に関しては何も考える必要が無くなり、ソフトウエア設計が楽になります。また、ポップアップメニューや、オーバラップウインドウを実現するには、どうしても避けて通れない機能なのです。
図形データを用意する方法は二つあり、APIを通して動的に図形を登録するのと、予め画面レイアウトを決めて静的な図形データを用意するものです。
前者の、動的に図形を登録するのは、単に画面表示するイメージです。直線なら始点と終点の座標、色、線の太さ等の情報を与えれば、図形データとして登録され、画面にも即時表示されます。
後者の場合、C言語の初期値設定機能(イニシャライザ)で、図形データ構造体にデータを与えるものです。図形データは座標等の数値として表現するので、ちょっと面倒な面はありますが、図形データを生成する外部の画面設計ツールを用意できれば、より簡単に開発を行えるという拡張性を持っています。
設計メモ
LCDコントローラ
一言で言えばLCDのガラス板に定期的に電気信号を加え表示させるICです。内部に書き換え可能なメモリを全ピクセル分持ち、そのデータが画面に投射される方式です。メモリの書き換えは、CPUから直接行うことはできず、コマンドという形で間接的にデータ転送します。大抵のコントローラは、直線とか円弧、塗りつぶし、領域移動/コピーといったレベルのコマンドはなく、矩形もしくはラスタ指定でデータを流し込むという単純な機能しかありません。とは言え、任意ピクセルを任意の色に表示できるのですから、スピードを要求しなければ何でも表示できます。
開発するために、LCDコントローラの仕様書をたくさん読み込みましたが、なぜかどれも似たような仕様です。製造者が違っても、ほぼ同じという例もあります。大きく2つの系統があるようです。
- 16ビットレジスタ書き込み型
- 8ビットコマンドストリーム型
前者は、数十個の16ビットレジスタを操作する事で機能を制御するものです。例外は、表示メモリへの読み書きがレジスタ経由で行われる動作です。ILI9325, SSD1289, SSD1283Aがこれに該当します。
後者は、コマンド1バイト+パラメタnバイトで機能を制御するものです。ILI9163(ST7735S), S1D15G10, ILI9341, ST7789V2がこれにあたります。コマンドコマンド値が同じだったり、パラメタのビット並びが同じだったりしますが、微妙に違ったり用語が違うので、別物として設計しないとトラブルの元です。
4線式タッチパネルの直接検出
単純な仕組みだけれども、簡単にXYZ軸が検出できる、面白いデバイスです。
動的に回路を切り替える所がミソで、マイクロコントローラを使うと楽に実装可能です。
文字フォントのサイズ
当初、5×7ピクセルの最小フォントだけでしたが、やはり大きい文字が必要になり、何種類かの大きな文字フォントを作る事にしました。とは言え、ベクトルフォントの様な、任意サイズの文字表示を行う仕組みでは、ターゲットにしている規模には負荷が大き過ぎます。
そこで、最小限の種類のフォントを拡大縮小する事で、多くの文字フォントを表示出来るようにしたいと考えました。見栄えはぱっとしませんが、仕方ないと思っています。
具体的には1.5倍ベースでの拡大として
1.0 → 1.5 → 2.0 → 3.0 → 3.0 → 4.5
これだと、2種類の原始文字フォントを用意するだけで、6サイズの文字を表示出来ます。拡大の仕方も、スムージングすれば、より見やすくなるでしょう。
1.0倍は5×7
1.5倍は7×11
のフォントを、英数字分、我慢して手作りレイアウトしC言語の初期値データで実装しています。倍率は4種類までとし、合計8種類のサイズの文字フォントを扱えるようになっています。
権利関係
本ライブラリの利用について
GPLに準じます。他から流用したソース部分もありませんので、利用には特に制限はありません。
参照情報
LCDモジュール仕様書
開発には、LCDモジュールの技術的な情報が不可欠ですが、基本的には販売元が提供する情報、文書ファイルのみとなっています。
ATM0130B3
- 秋月電子の商品説明ページ K-15560、P-15695
- 秋月電子の取扱説明書 AE-ATM0130B3.pdf
- 秋月電子でダウンロードできるモジュールのデータシート ATM0130B3 (ZETTLER DISPLAYS) TFT MODULE V1.0
- ST7789V2のデータシート:入手先不明:Sitronix Technology Corp.ST7789V2 – single-chip controller/driver for 262K-color, graphic type TFT-LCD 240RGB x 320 V1.0 2016/11
M014C9163SPI
- aitendoの「1.44インチ液晶モジュール(SPI) [M014C9163SPI]」の販売ページの接続ピン情報 http://www.aitendo.com/product/3857
- 同サイトからダウンロードできるILI9163B のデータシート: ILI TECHNOLOGY CORP. ILI9163 a-Si TFT LCD Single Chip Driver 132RGBx162 Resolution and 262K color Datasheet Version: V0.13 Document No.: ILI9163DS_V0.13.pdf
Z144SN005
- aitendoの「TFT液晶モジュール(1.44/SPI) [Z144SN005]」の販売ページの接続ピン情報 http://www.aitendo.com/product/11546
- 同サイトからダウンロードできるモジュールのデータシート: SPEC-Z144SN005_aitendo.pdf: APPROVAL SHEET Z144SN005 Mode: Transmissive type .Normally white. TFT LCD Module LCD Module: Graphic 128RGB*128Dot-matrix Rev.A00 Oct 2010
- 同サイトからダウンロードできるST7735S のデータシート: Sitronix ST7735S 132RGB x 162dot 262K Color with Frame Memory Single-Chip TFT Controller/Driver Datasheet Version 1.1 2011/11
ZY-FGD1442701V 1
- aitendoの「TFT液晶モジュール(1.44/128×128)[ZY-FGD1442701V 1]」の販売ページの接続ピン情報 http://www.aitendo.com/product/1621
- 同サイトからダウンロードできるモジュールのデータシート: W-FGD144270111111.pdf: SPECIFICATIONS ZY-FGD1442701V1.(Rev.A) 2008/10/12
- 同サイトからダウンロードできるST7735 のデータシート: Sitronix ST7735 262K Color Single-Chip TFT Controller/Driver Version 1.2 2009/03/09
H161T01
- モジュールのデータシート:入手先不明:AUO Product Specification 1.6〞COLOR TFT-LCD 2007
- Solomon SSD1283のデータシート:入手先不明:SOLOMON SYSTECH SSD1283A 132 RGB x 132 TFT Driver Integrated Power, Gate, Source Driver with built-in RAM Data sheet Rev 0.12 Jul 2005
L1F10085
- aitendoの「LCDモジュール(128×128)[NOKIA3300-LCD]」の販売ページの接続ピン情報 http://www.aitendo.co.jp/product/1239
- 同サイトからダウンロードできるS1D15G10 のデータシート: S1D15G10.pdf: Seiko Epson Corporation MF1493-03 S1D15G10D08B000 Rev. 1.0 2002
Z180SN009, Z180SN1720
- aitendoの「TFT液晶モジュール(1.8/SPI) [Z180SN009]」の販売ページの情報 https://www.aitendo.com/product/11455
- 同サイトからダウンロードできるモジュールのデータシート: LCM-Z180SN009V00.pdf
- 同サイトからダウンロードできるST7735Sのデータシート: Sitronix ST7735S 132RGB x 162dot 262K Color with Frame Memory Single-Chip TFT Controller/Driver Datasheet Version 1.1 2011/11
ATM0177B3A
- 秋月電子の商品説明ページ:P-13618, K-14032
- 秋月電子でダウンロードできるモジュールのデータシート:atm0177b3a.pdf: ZETTLER DISPLAYS SPECIFICATIONS FOR LIQUID CRYSTAL DISPLAY ATM0177B3A (ZETTLER DISPLAYS) VER2.3 2018-06-05
- 秋月電子でダウンロードできるILI9163Vのデータシート:LTTD128160018-L3-V1.3-driver-IC_ILI9163V.pdf: ILITEK ILI9163V a-Si TFT LCD Single Chip Driver 132RGBx162 Resolution and 262K color Specification Version: V100 Document No.: ILI9163V_DTS_V100_20130416
QJ240083S0
- aitendoの「TFT液晶モジュール(2.4/240×320/TP) [QJ240083S0]」の販売ページの情報 http://www.aitendo.com/product/7212
- 同サイトからダウンロードできるモジュールのデータシート: 2.4_9325.pdf: SPECIFICATION OF TFT MODULE T24-ILI9325-V12 REV:V12 2012-04-24
- 同サイトからダウンロードできるILI9325のデータシート: ILI9325DS_V0.35.pdf: ILITEK ILI9325 a-Si TFT LCD Single Chip Driver 240RGBx320 Resolution and 262K color Datasheet Version: V0.35 Document No.: ILI9325DS_V0.35.pdf
- 同サイトからダウンロードできるILI9325のアプリケーションノート: ILI9325AN_V0.22.pdf: ILITEK ILI9325 a-Si TFT LCD Single Chip Driver 240RGBx320 Resolution and 262K color Application Notes Version Preliminary V0.22 Mar.4.2008
S95417-AAA
- aitendoの「2.4インチTFT液晶モジュール [S95417AAA]」の販売ページの情報 http://www.aitendo.com/product/13411
- 同サイトからダウンロードできるモジュールのデータシート: SPC-S95417-AAA_V01.pdf:
- その他はQJ240083S0と同じ
MSP2807
- 秋月電子の商品説明ページ:M-16265
- 秋月電子でダウンロードできるモジュールのデータシート:msp2807.pdf
- メーカーの商品情報:http://www.lcdwiki.com/2.8inch_SPI_Module_ILI9341_SKU:MSP2807
- メーカーからダウンロードできるユーザマニュアル:2.8inch_SPI_Module_MSP2807_User_Manual_EN.pdf
- メーカーからダウンロードできる液晶パネル仕様書:QD-TFT2803 specification_v1.1.pdf: QDTECH SPECIFICATION Revion:1.1 QD-TFT2803 Mar.21.2018
- メーカーからダウンロードできるILI9341データシート:ILI9341 Datasheet.pdf: ILITEK ILI9341 a-Si TFT LCD Single Chip Driver 240RGBx320 Resolution and 262K color Specification Version: V1.09 Document No.: ILI9341_DS_V1.09.pdf
- タッチスクリーンコントローラXPT2046のデータシート:入手先不明:xpt2046-datasheet.pdf: XPTEK TECHNOLOGY XPT2046 Data Sheet 2007.5
S95160-32
- aitendoの「TFT液晶モジュール(3.2/240×320)[S95160-32]」の販売ページの接続ピン情報 http://www.aitendo.com/product/3140
- 同サイトからダウンロードできるSSD1289Z のデータシート: Solomon Systech Limited.SEMICONDUCTOR TECHNICAL DATA SSD1289 240 RGB x 320 TFT LCD Controller Driver Rev1.3 Apr 2007
Copyright©2013-2022 Toyohiko TOGASHI
コメントを残す