キャラクタLCD用コントローラーとしてデファクトスタンダードとなっているHD44780の初期設定を行う関数を作成しました.
HD44780は現在流通しているほぼすべてのCLCDのコントローラーに用いられているものです.
使用したのは40行×2のLU3172 LCDモジュールです.
マイコンにはH8/3664を用いました.
ピン配置は以下の通りです.
初期化手順は
1.電源投入
2.15ms以上待つ
3.ファンクションセット(8bit_mode設定)
4.4.1ms以上待つ
5.ファンクションセット(8bit_mode設定)
6.100us以上待つ
7. ファンクションセット(8bit_mode設定)
8. ファンクションセット(8bit_mode設定)
9. ファンクションセット(各種設定)
10. 表示コントロール
11.表示消去
12.エントリーモードセット
となっております.7~12の間も命令に応じたウェイトをおきます.
LCD_init()
初期化関数 LCD_init()です.
/* LCDのイニシャライズ */
void LCD_init(unsigned char bus, unsigned char line, unsigned char font, unsigned char cursor, unsigned char blink, unsigned char add, unsigned char shift)//LCD_init(1,1,0,1,1,1,0);
{
unsigned char data=0x00; // 変数宣言
_wait(1500); // ウェイト
data=0x30;
LCD_IR(data); // ファンクションセット1回目
_wait(410); //ウェイト
data=0x30;
LCD_IR(data); // ファンクションセット2回目
_wait(410);
data=0x30;
LCD_IR(data); // ファンクションセット3回目
_wait(410);
data=0x20; // ファンクションセット(インターフェースデータ長8ビット)
data |= (bus <<4); //バス幅 1:8bit 0:4bit
data |= (line << 3); //表示ライン 1:2行表示 0:1行表示
data |= (font << 2); //表示フォント 1:11ライン/行 0:8ライン/行 ※11ラインはg,yなどが切れずに表示されるが2行モードが使えなくなる.
LCD_IR(data);
_wait(40); // ウェイト
data=0x0c; //表示ON/OFF
data |= (cursor <<1); //下線カーソル 1:ON
data |= blink; //ブロックカーソル 1:ON
LCD_IR(data);
_wait(40); // ウェイト
LCD_IR(0x01); //表示クリア
_wait(40); // ウェイト
data = 0x04; // エントリモード
data |= (add << 1); //0:デクリメント 1:インクリメント
data |= shift; //1:表示シフトあり
LCD_IR(data);
_wait(400); // ウェイト
}
_wait()は割り算をするなどして時間を稼いでください.
ただし,コンパイラによって処理時間が異なるのでそれぞれの環境に合わせて数値を変化させる必要があります.
(規定時間以上待てばよいので全体に影響の出ない範囲で大きな値にしてもよい)
引数として各種パラメータを設定できるようにしてあります.
LCD_IR
LCD_IR()はインストラクションレジスターアクセス用関数です.
static void LCD_IR( unsigned char data )
{
PDR7 &= 0xef; //0 LCD_RS(0x10) レジスタをインストラクションレジスター(IR)にセット
PDR7 &= 0xdf; //0 LCD_RW(0x20) 0:書き込み 1:読み出し
PDR7 |= 0x40; //1 LCD_E(0x40) シグナル可能セット
PDR8 = data; //LCD_PORT(Port8) データの書き込み
_wait(410); // 20usのウェイト
PDR7 &= 0xbf; // シグナル可能リセット(Eの立下りでレジスタの読み書きを行う)
_wait(410); // 20usのウェイト
}
LCD_init()が実行し終わるとセットアップ完了となります.
LCD_DR
最後に表示用関数LCD_DR()です.
static void LCD_DR( unsigned char data )
{
PDR7 |= 0x10; //1 LCD_RS(0x10) レジスタをデータレジスター(DR)にセット
PDR7 &= 0xdf; //0 LCD_RW(0x20) 0:書き込み 1:読み出し
PDR7 |= 0x40; //1 LCD_E(0x40) シグナル可能セット
PDR8 = data; //LCD_PORT(Port8) データの書き込み
_wait(410); //ウェイト
PDR7 &= 0xbf; // シグナル可能リセット(Eの立下りでレジスタの読み書きを行う)
_wait(20);
}
dataにはASCIIコードが入ります.
表示例
char LCD_title[81]="Yellow_tracer kiki0817 Yellow_IDE,H8/3664f, from2019_01_19 ";
for(i=0;i<80;i++){
LCD_DR(LCD_title[i]);
}