EZ-LCDは、キャラクタLCD(HD44780または互換LCDC)を簡単に使うための汎用モジュールで、文字数により異なるパネル構成やバス幅による制御の違いを隠蔽し、全てのキャラクタLCDを共通のAPIで使用することができます。基本的にプラットフォーム非依存なので、ANSI Cの使えるマイコンであれば使用が可能です。移植作業はいくつかのハードウェア制御マクロを埋めるだけで、数分もあれば完了です。
EZ-LCDモジュールは、次に示すAPIを提供します。多くの用途では先頭の3つの関数だけで足りますが、それ以外にも少し手の込んだ機能を持っています。LCDに対してprintfを使いたい場合は、組み込み用printfモジュールを組み合わせると簡単です。
例として、右の回路図に示すようにLCDモジュールを接続した場合の移植手順を示します。
まず、EZ-LCDの機能を設定します。これらの設定項目は、hd44780.hで定義されているので、それを編集します。少なくとも使用するLCDモジュールの文字数は設定する必要があります。また、使用しない機能を外すことにより、モジュール・サイズを減らすことができます。
#define _LCD_ROWS 2 /* 行数 (1,2 or 4) */ #define _LCD_COLS 16 /* 桁数 (8..40) */
次に、EZ-LCD本体(hd44780.c)の中のプラットフォーム依存部分のマクロを埋め、必要なら関数を追加します。なお、EZ-LCDはR/W信号をサポートしませんので、もしもポートに接続されているときは、Lレベルに初期化してください。
#include <avr/io.h> /* デバイス固有定義ファイル */ #define IF_BUS 4 /* バス幅 */ #define IF_INIT() {PORTB &= 0x03; DDRB |= 0xFC;} /* 制御ポートの初期化 (初期化済みの時は省略可) */ #define E1_HIGH() PORTB |= 0x08 /* E(E1)をHにする */ #define E1_LOW() PORTB &= 0xF7 /* E(E1)をLにする */ #define RS_HIGH() PORTB |= 0x04 /* RSをHにする */ #define RS_LOW() PORTB &= 0xFB /* RSをLにする */ #define OUT_DATA(d) PORTB = (PORTB & 0x0F) | (d & 0xF0) /* データバスに d の値を出力 (4bitバスの時はdの上位4ビット) */ #define IF_DLY60() /* RS→Eで60ns確保するディレイ (多くのマイコンでは省略可) */ #define IF_DLY450() {PINB; PINB;} /* Eパルス幅を >=450ns@3V, >=250ns@5V 確保するディレイ*/ #define DELAY_US(n) lcd_delay_us(n) /* us単位のディレイ (↓で定義) */ static void lcd_delay_us (uint16_t n) { do { /* 8 clocks per loop for Atmel AVR/8MHz */ PINB; PINB; PINB; PINB; } while (--n); }
簡単なテスト・プログラムを書いて、正しく表示されるかどうか確認します。この例では、LCDの左上からコード順で全体に文字が表示されれば成功です。
#include "hd44780.h" /* EZ-LCD include file */ int main (void) { uint8_t c; lcd_init(); /* LCDモジュールの初期化 */ for (c = '0'; c != 128; c++) { /* LCDに文字を表示 */ lcd_putc(c); } return 0; }