microchip PIC18F452 を使ったキャラクタディスプレイ(LCD)の実験

PIC18F452 LCDの実験

PIC18F452でキャラクタLCDを使うのは初めてなので、基本的な動作確認をしました。
PORTBに秋月で購入した4行タイプのLCDを接続、PORTB部分は以下のような回路にて確認しました。

回路図は2行タイプのLCDのシンボルですが、実際には4行タイプを使っています。

PIC18F452 LCD部分の回路図

LCDは後にケースに収めることを考えて、90度タイプのピンヘッダを使っています。
こうすることによって、コネクタを接続してもコネクタの最も高い部分がLCD表示面より下になります。
LCD 90度ピンヘッダ加工


mikroCのサンプルプログラムをほぼそのまま使って確認しました。
メインルーチン部分は以下の通りです。



// main 関数
void main(void)
{
  InitDevice();
  //INTCON.GIE = 1; // 全割り込み有効
  Lcd_Out(1, 3, "Hello!");
  while(1){
    delay_ms(1000);
    Lcd_Out(1, 3, "Hello!");
    Lcd_Out(2,1,"(2,1)");
    PORTC.F1 = 1;
    delay_ms(1000);
    PORTC.F1 = 0;
  }

}


また、4行タイプのLCD(SC2004CSLB)は表示キャラクタを保持するDDRAMのアドレスの並びが1行目ー>3行目ー>2行目ー>4行目となっているため、Lcd_Out_Cp(char *text);やLcd_Chr_Cp(char character);で文字を表示していくと改行時に表示が飛んでしまいます。

Lcd_Out(1,1,"Line 1");
Lcd_Out(2,1,"Line 2");
Lcd_Out(3,1,"Line 3");
Lcd_Out(4,1,"Line 4");
は意図したとおりに表示されますが、引数を改行のない長さの文字列にする必要があります。

Lcd_Cmd(LCD_FIRST_ROW);
Lcd_Cmd(LCD_SECOND_ROW);
Lcd_Cmd(LCD_THIRD_ROW);
Lcd_Cmd(LCD_FOURTH_ROW);
は意図したとおりに表示されます。



LCDのコントラスト調整用の電圧は、表示可能なレンジが狭く、いつも「配線間違えたかな」と思わされます。
LCDと基板間のケーブルは秋月で完成品として販売していましたのでこれを利用しました。

秋月のケーブルを使って接続


mikroC LCD関連の関数
void Lcd_Init(unsigned short *port)  
初期化関数。ポートを指定して初期化。接続先を指定して初期化する場合はLcd_Configを使う。LCDを使う場合は
最初に初期化を行う。

void Lcd_Out(unsigned short row, unsigned short col, char *text);
開始座標を指定して文字列を出力。LCDの左上座標は(1,1)

void Lcd_Out_Cp(char *text);
現在のカーソル位置から文字列を出力。

void Lcd_Cmd(unsigned short command);
LCDにコマンドを送る。引数とその動作は以下の通り

LCD Command Purpose
LCD_FIRST_ROW Move cursor to 1st row
LCD_SECOND_ROW Move cursor to 2nd row
LCD_THIRD_ROW Move cursor to 3rd row
LCD_FOURTH_ROW Move cursor to 4th row
LCD_CLEAR Clear display
LCD_RETURN_HOME Return cursor to home position, returns a shifted display to original position. Display data RAM is unaffected.
LCD_CURSOR_OFF Turn off cursor
LCD_UNDERLINE_ON Underline cursor on
LCD_BLINK_CURSOR_ON Blink cursor on
LCD_MOVE_CURSOR_LEFT Move cursor left without changing display data RAM
LCD_MOVE_CURSOR_RIGHT Move cursor right without changing display data RAM
LCD_TURN_ON Turn LCD display on
LCD_TURN_OFF Turn LCD display off
LCD_SHIFT_LEFT Shift display left without changing display data RAM
LCD_SHIFT_RIGHT Shift display right without changing display data RAM

参考
//mikroCでLCDSC2004CSLBのカーソルを(x,y)に移動

void SetCurPos(unsigned short x,unsigned short y)
{
 int i;
 Lcd_Cmd(LCD_CURSOR_OFF); // 一端カーソルを消す
 Lcd_Cmd(LCD_RETURN_HOME); // 左上座標(1,1)に移動
 switch(y){ // y方向に移動
  case 1:Lcd_Cmd(LCD_FIRST_ROW); break;
  case 2:Lcd_Cmd(LCD_SECOND_ROW); break;
  case 3:Lcd_Cmd(LCD_THIRD_ROW); break;
  case 4:Lcd_Cmd(LCD_FOURTH_ROW); break;
 }

 for(i=1;i<x;i++){ // 右にカーソルをずらしていく
  Lcd_Cmd(LCD_MOVE_CURSOR_RIGHT);
 }

 Lcd_Cmd(LCD_UNDERLINE_ON); // カーソルを表示する
}

参考資料
SC2004C(20文字4行)LCDキャラクタディスプレイ仕様
SC2004C

メカニカルデータ
SC2004C

電気仕様
SC2004C

外形寸法
SC2004C


戻る

TOPへ