LCD制御でもうひとつひっかったのはイニシャル設定です。これは説明書通り、あるいはサンプルコード通り(電源立ち上げ後数十mS待って、0x03を2回出力、その後4ビットモードに設定、次々と設定パラメータを入れていく、画面クリアすると時間かかるのでタイミング取る)に処理を次のように進めればよいのですが・・・。
void lcd_init() { char init_value; init_value = 0x3; // LCDコントローラの初期化コマンド LCD_RS = 0; // RS信号(PB0)はコマンドモード:0 __delay_us(200); LCD_EN = 0; // エネーブルビットを0 __delay_ms(100); // 電源投入後最低でも15mS待ってから lcd_data = init_value; // 0x03を設定 LCD_STROBE(); __delay_ms(10); LCD_STROBE(); __delay_us(400); LCD_STROBE(); __delay_us(400); lcd_data = 2; // 4ビットモード指定:0x02を設定 LCD_STROBE(); lcd_write(0x28); // インターフェイス長さコマンド lcd_write(0xF); // 表示オン、カーソル表示オンでブリンクする lcd_clear(); // 画面の消去 __delay_us(200); // 画面の消去 最大1.64mSかかるとある lcd_write(0x6); // 入力 モードに設定 }
そうは問屋が許しません。
http://chitose6thplant.web.fc2.com/n_4digit/1823_i2c_slave/lcd_c.pdf
というのは初めてインターフェイス作って、配線して、と色々な間違い要因を抱えて始まるのですが、このイニシャル設定はそういうハードルとしては手ごわいものかと思います。なぜかというと、この処理がうまくないとうんともすんとも言わない、どうしたらよいか次の手が皆目わからんという入り口なのです。ですから、うまくここを通過したら、何てことありません。それでワタシの場合は手元にSC2002というLCDモジュールがあり、それがSC1602モジュールとコネクタ信号線がVddとGNDが逆だったということで、トラブルありました。確かに調べてみるとSC0802とかSC2002とか表示数が異なるLCDモジュールになると電源とグラウンドが入れ替わります。キャラクタ液晶シリーズなら文字数にかかわらず同じであろうと予断したために液晶モジュールが熱くなってました。壊れたかと思ったが意外と壊れなかったです。
ところで、このブログにググッたり、リンクをたどったりして、始めていらした方で、過去書き込みの内容を参照になりたい場合、次のホームページ中にまとめ情報も一部掲載してありますので、覗いてみてください。