LoginSignup
2
2

More than 5 years have passed since last update.

[HD44780] LCD初期設定から表示まで

Last updated at Posted at 2019-03-30

キャラクタLCD用コントローラーとしてデファクトスタンダードとなっているHD44780の初期設定を行う関数を作成しました.

HD44780は現在流通しているほぼすべてのCLCDのコントローラーに用いられているものです.

105652.jpg

使用したのは40行×2のLU3172 LCDモジュールです.

マイコンにはH8/3664を用いました.
ピン配置は以下の通りです.

pin_assign.PNG

初期化手順は

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_init().c
/* 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()はインストラクションレジスターアクセス用関数です.

LCD_IR.c
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()です.

LCD_DR.c
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]);
    }

105651.jpg

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2