• 車種別
  • パーツ
  • 整備手帳
  • ブログ
  • みんカラ+

satto.v11のブログ一覧

2012年08月21日 イイね!

LCDモニターについて

LCDモニターについて今回「LCDモニターを使ってみた」で二種類のキャラクターLCDモニターを使ってみました。巷にはいろいろなLCDが存在し、まだまだ奥の深い電子部品です。今回使ったLCDのご紹介と自分への備忘録w

これらのLCDは使い方が比較的簡単でプログラムのデバッグ等に気軽に使えて重宝しています。マイコンへの接続は後述しますが、マイコンへのI/O本数を節約するために「4bitモード」を使用しています。以下の説明(備忘録)は、4bitで動かす時の設定です。

写真上は「ACM0802C-NLW-BBH」(500円)です。8文字X2行で表示状態は「ここ」を参照ください。バックライト青色で白色抜きの文字。

LCDの下準備として…


①基盤裏の「R7」に100Ω程度の抵抗をつける(多分バックライト)。
②「R8」には何も付けない。
③「R9」には0Ω。即ち短絡させる。
④【Vo】は10kΩ程度の半固定抵抗を【Vss】と【Vdd】と接続する(コントラストの調整)
⑤LCDからの読込みを行わないのであれば【R/W】は0V(GND)へ。
⑥「4bitモード」を使用するので、【DB0】〜【DB3】は0V(GND)へ。
⑦【Vss】を+5V、【Vdd】をGNDへ・・・。
⑧マイコンへの接続は【RS】・【E】と【DB4】〜【DB7】の合計6本。


※【 】内の記号はそれぞれのピンに対応したシンボルです。データシート等を参照してください。

写真下は「SD1602VBWB-XA」(800円)です。16文字X2行で表示状態は「ここ」と「ここ」を参照ください。このタイプもバックライト青色で白色抜きの文字。

これもLCDの下準備として…


①バックライトは3.2Vで20mAなので【A】に+5Vを100Ω程度の抵抗を介して接続する。
②【K】は0V(GND)へ。
③【Vo】は10kΩ程度の半固定抵抗を【Vss】と【Vdd】と接続する(コントラストの調整)
④LCDからの読込みを行わないのであれば【R/W】は0V(GND)へ。
⑤「4bitモード」を使用するので、【DB0】〜【DB3】は0V(GND)へ。
⑥【Vss】を+5V、【Vdd】をGNDへ・・・。
⑦マイコンへの接続は【RS】・【E】と【DB4】〜【DB7】の合計6本。


2タイプとも似たような配線です。ここまでくれば、あとはマイコンで操作してやれば表示することができます。表示できる文字は、8bitなんで最大256種類ですね。だから漢字の表示は当然できません。基本的な文字はASCII文字コードと互換性があるのでコード調べなくてもプログラムC言語の標準ライブラリで文字を打てば普通に表示できます。

両者のLCDはあまりにも表示形態が似ていたので、C言語でのプログラムでは表示用のライブラリをつくって、プログラムにインクルードしてやってます。こうすれば、プログラム毎に同じプログラムを書く必要もなく様々な場面で気軽にLCDが使えてます。下手なプログラムですが、表示用ライブラリの内容はこんなの…




/******************************************************
LCD表示用ライブラリ(4bitモード)
対応LCD:ACM0802C、SD1602
******************************************************/


//接続ポートの定義
#define LCD_PORT    PORTB     //DBピンの接続ポート
#define LCD_RS        RB5        //RSピンの接続ポート
#define LCD_E        RB6        //Eピンの接続ポート

void init_LCD(void);
void char_LCD(char *str);
void data_LCD(short data,short cmd);
void send_Signal(short code,short flag);

//**************************************************
//LCDの初期化 (モニタ種類により場合分け)
//**************************************************

void init_LCD(void) {
//ACM0802Cの選択
#ifdef ACM0802C
    //Function設定
    __delay_ms(30);        //30ms待ち
    send_Signal(0x02,0);    //4bit
    send_Signal(0x02,0);    //4bit
    send_Signal(0x0C,0);    //2Lines 5X10dots
    //Display On/Off設定
    __delay_us(40);        //40us待ち
    send_Signal(0x00,0);    //
    send_Signal(0x0C,0);    //Brink-Off Cursor-Off Display-On
    //Display Clear設定
    __delay_us(40);        //40us待ち
    send_Signal(0x00,0);    //
    send_Signal(0x01,0);    //
    //Entry Mode Set設定
    __delay_ms(2);        //2ms待ち
    send_Signal(0x00,0);    //
    send_Signal(0x06,0);    //
    
    __delay_ms(10);
#endif
    
//SD1602の選択
#ifdef SD1602
    __delay_ms(15);        //15ms待ち
    send_Signal(0x03,0);    //8bit
    __delay_ms(5);        //5ms待ち
    send_Signal(0x03,0);    //8bit
    __delay_us(100);    //100us待ち
    send_Signal(0x03,0);    //8bit
    __delay_ms(5);        //100us待ち
    
    send_Signal(0x02,0);    //4bitモード
    __delay_us(100);    //40us待ち
    
    //Function設定
    send_Signal(0x02,0);    //
    send_Signal(0x08,0);    //2Lines 5X8dots
    __delay_us(40);        //40us待ち
    
    //Display On/Off設定
    send_Signal(0x00,0);    //
    send_Signal(0x0C,0);    //Brink-Off Cursor-Off Display-Off
    __delay_us(40);        //40us待ち
    
    
    //Display Clear設定
    send_Signal(0x00,0);    //
    send_Signal(0x01,0);    //Clear Display
    __delay_ms(2);        //2ms待ち
    
    //Entry Mode Set設定
    send_Signal(0x00,0);    //
    send_Signal(0x06,0);    //I/D Increment
    __delay_us(40);        //40us待ち
#endif
}

//**************************************************
//LCDにデータを送信
// cmd=0 : データ送信 cmd=1 : 文字表示
//**************************************************

void data_LCD(short data,short cmd) {
    send_Signal(data>>4,cmd);    //上位4bit送信
    send_Signal(data,cmd);        //下位4bit送信
    
    __delay_us(40);            //40usec待ち
}

//**************************************************
//LCDに文字列を表示
//**************************************************

void char_LCD(char *str) {
    for(;*str != 0x00;) {
        data_LCD(*str,1);
        str++;
    }
}

//**************************************************
//ポートに信号を送る
//**************************************************

void send_Signal(short code,short flag) {
    //ポートの使用状況により以下内容変更要
    LCD_PORT = (LCD_PORT & 0xE1) | ((code & 0x0F)<<1);
    LCD_RS = flag;
    __delay_us(40);
    LCD_E = 1;
    __delay_us(1);
    LCD_E = 0;
}



突っ込みどころ満載なプログラムかもしれませんが、こんなプログラムでうまく表示できています。
このライブラリをインクルードしてやってプログラムの冒頭で、「#define モニタ名」みたいにマクロ定義してやって、ライブラリ上のポートの定義をちょいちょいと変えてやれば動きます。都度プログラムを書かなくてもいいので便利です。
ポート定義のところはもうちょっとライブラリらしく弄る予定ですw

文字の送り方や、コマンドの送り方は両モニタ共に同じ。違うのは初期化処理です。
プログラム上のinit_LCD( )の部分で、LCD表示させる前にオプション設定の為に、おまじないみたいなデータをいっぱい送らなければならない。「データ送って、ちょっと待って、またデータ送って、また待って…。」見たいな美しくないルーチン。これを実装させるのに試行錯誤の連続…。マニュアル通りにやってもうまく行かない…。苦労しました。

クルマでの様々なデータ表示に使うにはキャラクターLCDではちょっと味気ないので、時間があれば、いろんなモニターに手を出してみようと思ってますw
Posted at 2012/08/21 07:17:34 | コメント(1) | トラックバック(0) | 電子回路 | 趣味

プロフィール

「[整備] #N-ONE メッシュグリルにしてみる https://minkara.carview.co.jp/userid/1540421/car/3584390/8101874/note.aspx
何シテル?   02/01 13:30
satto.v11です。 機械を弄るのが大好きですw クルマ・バイク・パソコン多趣味な人間です。
みんカラ新規会員登録

ユーザー内検索

<< 2012/8 >>

   1234
5678 91011
1213 1415161718
1920 2122232425
2627282930 31 

リンク・クリップ

バンパー、グリル、ネット取り付け 
カテゴリ:その他(カテゴリ未設定)
2025/02/06 06:05:02

愛車一覧

ホンダ N-ONE ホンダ N-ONE
N-ONE RSに乗り換えました。 通勤用として久しぶりの新車購入。 "通勤中も楽しく" ...
アウディ TT クーペ TT (アウディ TT クーペ)
メイン車です。 これは自分では弄りません。 全てディーラーにお任せw
ホンダ ゴールドウイング (GL1800) GL1800 (ホンダ ゴールドウイング (GL1800))
ホンダGold Wind Tour DCTに乗っています。 水平対向6気筒1800ccを ...
ホンダ モンキー ホンダ モンキー
モンキーを作りました。 10年前に所有していたモンキーフレームの残骸からナンバーを取得 ...

過去のブログ

2024年
01月02月03月04月05月06月
07月08月09月10月11月12月
2020年
01月02月03月04月05月06月
07月08月09月10月11月12月
2018年
01月02月03月04月05月06月
07月08月09月10月11月12月
2017年
01月02月03月04月05月06月
07月08月09月10月11月12月
2016年
01月02月03月04月05月06月
07月08月09月10月11月12月
2015年
01月02月03月04月05月06月
07月08月09月10月11月12月
2014年
01月02月03月04月05月06月
07月08月09月10月11月12月
2013年
01月02月03月04月05月06月
07月08月09月10月11月12月
2012年
01月02月03月04月05月06月
07月08月09月10月11月12月
ヘルプ利用規約サイトマップ
© LY Corporation