目次

ArduinoMega2560LCD処理

 手元には、4行x20桁のLCDがあります。



 ArduinoMega2560は、内蔵SRAMの容量が8kバイトと
 大きいので、何かに応用してみたいと考えてました。

 表示できる情報が多いので、バンドスコープを
 作成してみます。

 文字列を表示することから始めます。

 1行20桁なので、各行のフレームバッファとして、4つの配列を用意。

char lineUU[21] ;
char lineUL[21] ;
char lineLU[21] ;
char lineLL[21] ;

 フレームバッファと行の対応は、以下。



 ハードウエアのインタフェースは、次のように4ビット
 バスを使うと決めて、ケーブルで接続します。



 配列を初期化する関数を定義。

void clr_lcdUU()
{
  byte ii ;
  *(lineUU+20) = '\0';
  /* LCD string default */
  for ( ii = 0 ; ii < 20 ; ii++ ) {
    *(lineUU+ii) = ' ' ;
  }
  lcd.setCursor(0,0);
  lcd.print( lineUU );
}

void clr_lcdUL()
{
  byte ii ;
  *(lineUL+20) = '\0';
  /* LCD string default */
  for ( ii = 0 ; ii < 20 ; ii++ ) {
    *(lineUL+ii) = ' ' ;
  }
  lcd.setCursor(0,1);
  lcd.print( lineUL );
}

void clr_lcdLU()
{
  byte ii ;
  *(lineLU+20) = '\0';
  /* LCD string default */
  for ( ii = 0 ; ii < 20 ; ii++ ) {
    *(lineLU+ii) = ' ' ;
  }
  lcd.setCursor(0,2);
  lcd.print( lineLU );
}

void clr_lcdLL()
{
  byte ii ;
  *(lineLL+20) = '\0';
  /* LCD string default */
  for ( ii = 0 ; ii < 20 ; ii++ ) {
    *(lineLL+ii) = ' ' ;
  }
  lcd.setCursor(0,3);
  lcd.print( lineLL );
}

 画面をクリアするためのラッパー関数を定義しておきます。

void clr_lcd()
{
  clr_lcdUU();
  clr_lcdUL();
  clr_lcdLU();
  clr_lcdLL();
}

 4行の文字列を、一気にかえるには次のように
 ラッパー関数をまとめます。

void put_lcd()
{
  /* upper upper */
  lcd.setCursor(0,0);
  lcd.print( lineUU );
  /* upper lower */
  lcd.setCursor(0,1);
  lcd.print( lineUL );
  /* lower upper */
  lcd.setCursor(0,2);
  lcd.print( lineLU );
  /* lower lower */
  lcd.setCursor(0,3);
  lcd.print( lineLL );
}

 4行20桁のLCD初期化をsetupの中で
 するのではなく、専用関数を定義して
 対応します。

void init_lcd()
{
  byte ii ;
  /* pinMode */
  for ( ii = ENTRY_LCD ; ii < ENTRY_LCD_EXIT ; ii++ ) {
    pinMode(ii,OUTPUT);
  }
  /* 20 columns x 4 lines */
  lcd.begin( 20 , 4 );
  lcd.clear();
  lcd.setCursor(0, 0); lcd.print("I'm Main Controller");
  lcd.setCursor(0, 1); lcd.print("Hello , World !");
  lcd.setCursor(0, 2); lcd.print("Sapporo");
  lcd.setCursor(0, 3); lcd.print("Merry Christmas");
}

 この関数を実行すると、次のように表示されます。



 後から表示文字列を変えられるように、loopの中に
 コマンドインタプリタを用意しておきます。
 コマンドインタプリタの一部は、次のように定義。

  if ( cmd == 'U' || cmd == 'L' ) {
    /* clear buffer */
    if ( cmd == 'U' ) { clr_lcdUU(); }
    if ( cmd == 'L' ) { clr_lcdLU(); }
    /* transfer strings */
    for ( ii = 0 ; ii < 20 ; ii++ ) {
      /* get 1 byte */
      xx = *(sbuf+ii+1) ;
      /* judge */
      if ( xx == '\r' ) break ;
      /* copy */
      if ( cmd == 'U' ) { *(lineUU+ii) = xx ; }
      if ( cmd == 'L' ) { *(lineLU+ii) = xx ; }
    }
    /* impress */
    put_lcd();
  }
  if ( cmd == 'u' || cmd == 'l' ) {
    /* clear buffer */
    if ( cmd == 'u' ) { clr_lcdUL(); }
    if ( cmd == 'l' ) { clr_lcdLL(); }
    /* transfer strings */
    for ( ii = 0 ; ii < 20 ; ii++ ) {
      /* get 1 byte */
      xx = *(sbuf+ii+1) ;
      /* judge */
      if ( xx == '\r' ) break ;
      /* copy */
      if ( cmd == 'u' ) { *(lineUL+ii) = xx ; }
      if ( cmd == 'l' ) { *(lineLL+ii) = xx ; }
    }
    /* impress */
    put_lcd();
  }

 シリアル受信バッファから、1文字コマンドを
 取得して、対応する配列をスペースで埋めた後
 バッファから文字列を転送。
 文字列転送後に、一気に内容を更新します。

 1文字コマンドで、どの行の文字列を更新するかを
 指定します。1文字コマンドは、次のように決定。

 1文字コマンドに続けて、表示する文字列を入力。
 文字列を指定した後にEnterキーを叩きます。


目次

inserted by FC2 system