目次
前
次
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文字コマンドは、次のように決定。
- U => update first line
- u => update second line
- L => update third line
- l => update fourth line
1文字コマンドに続けて、表示する文字列を入力。
文字列を指定した後にEnterキーを叩きます。
目次
前
次