2010年10月12日

LCDディスプレイ DMC16117A

LCDキャラクタディスプレイモジュールDMC16117A

秋月電子より販売されている「LCDキャラクタディスプレイモジュール(16×1行バックライト無) DMC16117A」
http://akizukidenshi.com/catalog/g/gP-01704/

 ■オプトレックス日本製キャラクタLCDモジュール
 ■16文字x1行タイプ
 ■制御ICは日立44780互換ですのでSC1602などど同じように使える。
   (ピン配列は異なる)

2行表示するものに比べ、300円と割安なので、気軽に利用可能です。
SC1602と同様の処理でOKですが、8文字目と9文字目のアドレスが連続していないので注意です。

CQ出版社のインターフェース付録のNEC V850 uPD70F3716 で使った際の表示モジュールのソースです。
簡易的に表示させるため、ビジー確認等々は省略しています。
LCDとマイコンとの配線は、付属の配線図通りです。

ソースファイル
#pragma ioreg

//───────────────────────────────────
// Includeの定義
//───────────────────────────────────
#include "Lcd.h"

//───────────────────────────────────
// 定数定義
//───────────────────────────────────

#define P_LCD_RS_ON P9 |= 0x0200
#define P_LCD_RS_OFF P9 &= ~0x0200
#define P_LCD_E_ON P9 |= 0x0100
#define P_LCD_E_OFF P9 &= ~0x0100

#define P_LCD_DATA P9L // D7-D4 ==> P94-P97

//───────────────────────────────────
// ユーザメモリ定義
//───────────────────────────────────
volatile unsigned char LcdTimer;

//───────────────────────────────────
// 1ms管理
//───────────────────────────────────
void LcdTimer1ms( void )
{
  if (LcdTimer > 0) LcdTimer --;
}

//───────────────────────────────────
// 時間待ち
//───────────────────────────────────
static void LcdWait( unsigned char tmpTimer )
{
  LcdTimer = tmpTimer;

  for (;;)
  {
    if( LcdTimer == 0 ) break;
  }
}

//───────────────────────────────────
// データストローブ
//───────────────────────────────────
static void LcdDataStrb(void)
{
  P_LCD_RS_ON; // Data mode
  P_LCD_E_ON;

  LcdWait(0);

  P_LCD_E_OFF;
  P_LCD_RS_OFF;
}

//───────────────────────────────────
// コマンドストローブ
//───────────────────────────────────
static void LcdSetCmdStrb(void)
{
  P_LCD_RS_OFF; // Command mode
  P_LCD_E_ON;

  LcdWait(0);

  P_LCD_E_OFF;
}

//───────────────────────────────────
// コマンド初期化
//───────────────────────────────────
static void LcdInitCmd(char cmd)
{
  P_LCD_DATA |= cmd;
  LcdSetCmdStrb();
}

//───────────────────────────────────
// コマンド設定
//───────────────────────────────────
void LcdSetCmd(char cmd)
{
  P_LCD_DATA &= 0x0f;
  P_LCD_DATA |= (cmd & 0xf0);
  LcdSetCmdStrb();
  LcdWait(0);

  P_LCD_DATA &= 0x0f;
  P_LCD_DATA |= (cmd << 4);
  LcdSetCmdStrb();
  LcdWait(5);
}

//───────────────────────────────────
// 初期化関数
//───────────────────────────────────
void LcdInit(void)
{
  P_LCD_RS_OFF;
  P_LCD_E_OFF;
  LcdWait(15); // Wait 15ms

  LcdInitCmd(0x30);
  LcdWait(5);

  LcdInitCmd(0x30);
  LcdWait(2);

  LcdInitCmd(0x30);
  LcdWait(2);

  LcdInitCmd(0x20); // mode 4bit
  LcdWait(10);

  LcdSetCmd(0x28); // DL=0,N=1,F=0 4bit,2lines,5x7dot
  LcdSetCmd(0x08); // D=0,C=0,B=0 display off,cursor off,blink off
  LcdSetCmd(0x01); // Clear display
  LcdSetCmd(0x06); // I/D=1,S=0 DDRAM addr +1,Shift on
  LcdSetCmd(0x28);
  LcdSetCmd(0x0c); // D=1,C=1,B=1 display on,cursor off,blink off
}


//───────────────────────────────────
// 表示クリア
//───────────────────────────────────
void LcdDispClear(void)
{
  LcdSetCmd(0x01);
}


//───────────────────────────────────
// 文字列表示
//───────────────────────────────────
void LcdOutput(char *str)
{
  char unsigned chr;

  chr = *str ++;
  while( chr != '\0' )
  {
    P_LCD_DATA &= 0x0f;
    P_LCD_DATA |= (chr & 0xf0);
    LcdDataStrb();
    LcdWait(0);

    P_LCD_DATA &= 0x0f;
    P_LCD_DATA |= (chr << 4);
    LcdDataStrb();
    LcdWait(1);

    chr = *str ++;
  }
}

ヘッダ(Lcd.h)ファイル

void LcdInit(); // LCD初期化関数
void LcdDispClear(void); // 表示クリア
void LcdOutput(char *str); // 文字列表示
void LcdSetCmd(char cmd); // コマンド設定
void LcdTimer1ms(void); // 1m秒管理


利用方法

#include "Lcd.h"

1msecタイマ割込みで呼ぶ
 LcdTimer1ms();

メイン処理で実行
//タイマ割込み許可後に実行!
LcdInit(); // LCD初期化関数
LcdSetCmd(0x80); // 0~8文字まで
LcdOutput("Hamamats");
LcdSetCmd(0xC0); // 9文字目から
LcdOutput("u micom ");




同じカテゴリー(マイコン開発)の記事
Fusion PCBでエレキー
Fusion PCBでエレキー(2020-04-01 19:00)


上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

削除
LCDディスプレイ DMC16117A
    コメント(0)