Micom Car Rally NET
MCR - Micom Car Rally
大会情報 マイコンカーラリーとは? 今から始めるマイコンカーラリー 技術情報 大会記録 MCRファン倶楽部 お問い合せ
マイコンカーラリートップへ マイコンカーラリートップへ
技術情報 >> R8C/M12A 技術情報
技術情報
各種資料
YouTube情報
R8C/M12A 技術情報
上位入賞マイコンカー
よくある質問(FAQ)
ダウンロード
R8C/M12A 技術情報
液晶の表示

内容
R8C/M12Aを使って液晶を表示します。液晶は、(株)秋月電子通商などで売っている「LCDキャラクタディスプレイモジュール(16×2行)」を使用します。R8C/M12Aと液晶を接続するポートは、プログラムで変更することができます。

ワークスペース
r8cm12a_lcd_101.zip
ファイルを解凍し、フォルダを「c:\worksapce」に入れてください。

回路
回路を下図に示します。

回路図
※液晶の1ピンと2ピンのVcc、GNDは、液晶によって違うことがあります。必ず付属の説明書を参照してください。

ブレッドボード実装図
ブレッドボードの実装を下図に示します。
ブレッドボード実装図

※液晶の1ピンと2ピンのVcc、GNDは、液晶によって違うことがあります。必ず付属の説明書を参照してください。
※液晶の14ピンコネクタ部分は半田づけが必要です。また単線も足りませんので各自でご用意ください。

液晶

今回使用する液晶

今回は、(株)秋月電子通商などで販売されている「LCDキャラクタディスプレイモジュール(16×2行)」を使用して、文字を表示してみます。1行16文字×2行=32文字も表示できるので、LEDや7セグメントLEDより多くの情報を表示することができます。この液晶には、文字データが内蔵されており、マイコンからはキャラクタコードを送るだけで文字を表示してくれます。メモリの少ないR8C/M12Aにはもってこいです。

液晶

この液晶には、下記の端子があります。

ピン 端子名 詳細
1 Vcc +5Vを供給します。種類によっては、3.3Vで動作する液晶もあります。
2 GND GND(0V)を接続します。
3 Vo コントラストです。ボリュームで0〜5Vを供給できるようにしてます。液晶表示の濃さを調節します。
4 RS "1"にするとDB7〜DB0の信号は液晶を制御する信号、"0"にするととDB7〜DB0は液晶に表示するデータという意味になります。
5 RW "1"にすると液晶→マイコンへの信号、"0"にするとマイコン→液晶への信号になります。今回は液晶からのデータは読み込みません。よってマイコンには接続せずにGND(0V)に接続します。
6 E "1"にするとRS端子、RW端子、DB7〜DB0端子の情報を液晶で読み込み、液晶を動作させます。この端子を"1"にするまではとRS端子、RW端子、DB7〜DB0端子を変更しても何も起きません。
7 DB0 データバスbit0です。
8 DB1 データバスbit1です。
9 DB2 データバスbit2です。
10 DB3 データバスbit3です。
11 DB4 データバスbit4です。
12 DB5 データバスbit5です。
13 DB6 データバスbit6です。
14 DB7 データバスbit7です。
※液晶の1ピンと2ピンのVcc、GNDは、液晶によって違うことがあります。必ず付属の説明書を参照してください。

液晶の制御方法

液晶は、RS端子、RW端子、E端子、DB7〜DB0端子の合計11端子をマイコンと接続する必要があります。R8C/M12Aは16端子(PA_0を入れると17端子)しかI/Oがないため、できるだけ接続数を減らしたいです。
液晶には、8bitモードと4bitモードがあります。8bitモードは、マイコンから8bitのデータを送り、液晶はDB7〜DB0の8端子で受けるモードです。4bitモードは、8bitのデータを上位4bit、下位4bitに分けてマイコンから4bitのデータを2回送り、液晶はDB7〜DB4の4端子で2回に分けて受けるモードです。4bitモードにすると、R8C/M12Aと液晶のDB端子につなぐ端子は4本で済むので、今回は4bitモードを使います。
RW端子は、マイコンから液晶にコマンドや表示データを書き込むときは"0"に、液晶から送られてくるデータをマイコンが読み込むときは"1"にします。液晶から送られてくるデータとは、液晶に表示データを送った後、実際に表示されたかどうかの信号を液晶からマイコンに出力します。マイコンは表示されたことを確認して、次の表示データを送ります。液晶のデータシートには表示されるまでの時間は最大で10msと書いてあります。今回は、実際に表示されたか確認せずに10ms待つことにしてRW端子は使わないことにします。そのため、マイコン→液晶への信号のみなのでRW端子はGND(0V)に接続します。
よって、今回のR8C/M12Aと液晶の接続は、RS端子、E端子、DB7端子、DB6端子、DB5端子、DB4端子の6本となります。

回路

プログラム「lcd_lib.c」の説明

「lcd_lib.c」は、液晶を制御するための関数をまとめたファイルです。このCファイルをルネサス統合開発環境に組み込んで使用します。このファイルを組み込むと使うことのできる関数を説明します。

液晶の初期化

■関数
書式 void lcd_init( void );
内容 液晶を4bitモードで初期化します。
引数 無し
戻り値 無し
使用例
  lcd_init();   // 液晶を初期化

液晶表示位置の設定

■関数
書式 void lcd_position( char x ,char y );
内容 液晶に表示する位置を設定します。
引数 x位置:0〜15 左から何文字目に表示するか設定します。一番左が0です。
y位置:0〜1 上から何行目に表示するか設定します。一番上が0です。
戻り値 無し
使用例
  // x=0, y=1に表示
  lcd_position( 0, 1 );

液晶のコマンド設定

■関数
書式 void lcd_control( unsigned char data );
内容 液晶にコマンドを設定します。
引数 LCD_CLEAR :表示クリア+カーソルをホームへ移動
LCD_CURSOR_DEC :カーソルオートデクリメント
LCD_CURSOR_INC :カーソルオートインクリメント
LCD_DISPLAY_OFF :表示OFF
LCD_DISPLAY_ON :表示ON
LCD_CURSOR_ON :表示ON+カーソルON +ブリンクOFF
LCD_CURSOR_OFF :表示ON+カーソルOFF+ブリンクOFF
LCD_CURSOR_BLINK:表示ON+カーソルOFF+ブリンクON
LCD_CURSOR_LEFT :カーソル左シフト
LCD_CURSOR_RIGHT:カーソル右シフト
戻り値 無し
使用例
  lcd_control( LCD_CLEAR );

液晶に文字列表示

■関数
書式 void lcd_put_str( char *str );
内容 液晶に文字を表示します。
引数 表示する文字列の先頭ポインタ
文字列の終わりは0x00(\0)にします。0x00になると表示を終わります。
C言語の仕様で、文字列をダブルクォーテーション(”)でくくると、自動的に'\0'が付加されます。
例)"abcdefg"→"abcdefg"+'\0'
戻り値 無し
使用例
void main( void ) {
  int i;
  char s[2];

  init();           /* 初期化       */
  lcd_init();       /* 液晶初期化   */

  lcd_position( 0, 0 );
  lcd_put_str( "モジレツヒョウジ" );

  lcd_position( 0, 1 );
  for( i=0; i<16; i++ ) {
    s[0] = i + 'a';
    s[1] = '\0';  // 終了コード
    lcd_put_str( s );
  }
}

液晶に10進数を表示

■関数
書式 void lcd_put_num( long value, int keta );
内容 液晶に10進数を表示します。
引数 表示する値:0〜99999999
表示する桁:1〜8
戻り値 無し
使用例
  lcd_position( 0, 1 );
  lcd_put_num( 12345, 6 ); // '012345'と表示

液晶に16進数を表示

■関数
書式 void lcd_put_hex( long value, int keta );
内容 液晶に16進数を表示します。
引数 表示する値:0〜0xffffffff
表示する桁:1〜8
戻り値 無し
使用例
  lcd_position( 0, 1 );
  lcd_put_hex( 0x1a2b3c4d, 8 );  // "1a2b3c4d"と表示

プログラム「lcd.c」の説明

「lcd.c」は、main関数があるCファイルです。このファイルから、「lcd_lib.c」に登録している関数を呼び出して液晶を制御しています。呼び出し方を説明します。

ヘッダファイルの登録

拡張子が「h」のファイルをヘッダファイルといい、Cファイルに登録している関数を宣言しているファイルです(今回の説明の場合)。「lcd_lib.c」と「lcd_lib.h」はペアで作られていて、「lcd_lib.c」の中にどのような関数があるかを「lcd_lib.h」で宣言しています。要は、hファイルはCファイルの目次のようなものです。
今回、main関数がある「lcd.c」から「lcd_lib.c」の関数を呼び出すために、目次である「lcd_lib.h」を登録します。

#include "sfr_r8m12a.h" /* R8C/M12A SFRの定義ファイル*/
#include "lcd_lib.h"    /* 液晶制御ライブラリ        */


main関数

init関数の次に、液晶の初期化をする「lcd_init」関数を実行します。その後は液晶を制御する関数を使って、液晶に文字を表示します。

void main( void )
{
    init();       /* 初期化      */
    lcd_init();   /* 液晶初期化  */ ←ポートの入出力設定後に行う

    // 文字列の表示
    lcd_put_str( "モジレツヒョウジ" );

    while( 1 ) {
        // 10進数の表示
        lcd_position( 0, 1 );
        lcd_put_num( cnt_rb, 6 );

        // 16進数の表示
        lcd_position( 8, 1 );
        lcd_put_hex( cnt_rb, 6 );
    }
}

今回のプログラムは、液晶の横0文字目、縦0行目(以下、(0,0)と表記)に「モジレツヒョウジ」と表示します。
(0,1)に10進数でcnt_rb変数の値を6桁で表示します。(8,1)に16進数でcnt_rb変数の値を6桁で表示します。
cnt_rb変数の値が1234のときの表示している状態を下記に示します。

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
           
0 0 1 2 3 4 0 0 0 4 d 2

※lcd_put_num関数を実行するときのcnt_rb変数の値と、lcd_put_hex関数を実行するときのcnt_rb変数の値は違うので、実際は上画面のように10進数の値=16進数の値にはなりません。

液晶と接続するポートの変更
R8C/M12Aと液晶を接続するポートは、変更することができます。「lcd_lib.h」を開きます。

/*======================================*/
/* シンボル定義                         */
/*======================================*/
/* 接続ポートに応じて、ポートを変更してください */
#define LCD_E     p1_6      /* 制御ビット E端子     */
#define LCD_RS    p1_4      /* 制御ビット RS端子    */
#define LCD_DB7   p1_3      /* 制御ビット DB7端子   */
#define LCD_DB6   p1_2      /* 制御ビット DB6端子   */
#define LCD_DB5   p1_1      /* 制御ビット DB5端子   */
#define LCD_DB4   p1_0      /* 制御ビット DB4端子   */

例えば5行目は、『液晶のE端子(LCD_E)は、マイコンのp1_6とつなぐ』という意味です。この「p1_6」部分を実際につなぐポートに変更してください。
「lcd.c」のinit関数で行う入出力設定について、液晶につなぐ6端子は出力に設定してください。

Cファイルの関係
今回のプロジェクトのC source fileには、「startup_r8cm12a.c」、「lcd_lib.c」、「lcd.c」の3つのCファイルが登録されています。

ルネサス統合開発環境

3つのファイルの関係を下図に示します。
ルネサス統合開発環境

@マイコンの電源が入ると「startup_r8cm12a.c」内のstart関数が実行されます(#pragma entry命令で設定した関数が最初に実行されます)。この関数の中で、マイコン固有の初期化を行います。次にmain関数に移ります。
A「lcd.c」の最初に「lcd_lib.h」を読み込んで、「lcd_lib.c」に登録されている関数名を確認します。main関数を実行、この中で液晶を制御します。
B「lcd_lib.c」は液晶を制御するための関数をまとめたファイルで、main関数などから呼び出されて使います。このCファイル単体では何もしません。


BACK