Micom Car Rally NET
MCR - Micom Car Rally
2015大会 マイコンカーラリーとは? 今から始めるマイコンカーラリー 技術情報 大会記録 MCRファン倶楽部 お問い合せ
マイコンカーラリートップへ マイコンカーラリートップへ
技術情報 >> R8C/M12A 技術情報
技術情報
アプリケーション
R8C/M12A 技術情報
上位入賞マイコンカー
参加者レポート
よくある質問(FAQ)
ダウンロード
R8C/M12A 技術情報
グラフィック液晶の表示〜シリアル接続版〜

内容
前回、グラフィック液晶の表示方法を説明しました。R8C/M12Aはリセット端子を除くと使えるI/O端子は16端子で、グラフィック液晶との接続に13端子使用します。残る端子は、3端子になります。今回は、74HC595というシリアル→パラレル変換ICを2個使って、R8C/M12Aの使用端子を3本にして制御する方法を紹介します。

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

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

回路図

※グラフィック液晶のピン配置は、グラフィック液晶によって違うことがあります。必ず付属の説明書を参照してください。


シリアル接続

直接接続とシリアル接続

前回は、R8C/M12Aとグラフィック液晶を直接接続しました(下図)。

液晶

今回は、R8C/M12Aとグラフィック液晶の間に74HC595というシリアル信号を8bit信号に変換するICを2個入れて、このICを介してグラフィック液晶を制御します(下図)。

液晶

直接接続と74HC595を使ったときの違いをまとめた表を下記に示します。

項目 グラフィック液晶直接 74HC595使用
付加部品 無し 74HC595 2個、
抵抗10kΩ 1個
マイコンの使用端子 13本 3本
制御スピード 高速 中速
R8C/M12Aで使用する
内蔵周辺機能
無し UART0

74HC595との接続には、R8C/M12AのUART0を使用します。「UART0による通信」で行った、パソコンとの通信はできなくなります。

74HC595の仕組み

74HC595の使い方は、「液晶の表示〜シリアル接続版〜」と同様です。
今回は、74HC595を2個使って16bit分のデータを出力しています。74HC595にはSQHという端子があり、この端子と2つ目の74HC595のSINに接続すると、1つ目の74HC595のQH〜QA端子→2つ目の74HC595のQH〜QA端子の順にデータが伝わっていきます。R8C/M12Aからは8bitデータを2回送信してから、LCK端子を"0"→"1"にすると16bitのデータを送信することができます。
下図は、"1010 0011"と"0110 1101"を送信、LCKを"0"→"1"にしたところです。2つ目の74HC595から上位8bitデータの"1010 0011"、1つ目から下位8bitデータの"0110 1101"が出力されます。

 仕組み

R8C/M12Aから74HC595のSIN信号、SCK信号への出力は、UART0のクロック同期式I/Oモードを使います。R8C/M12Aと74HC595を接続するとき、R8C/M12Aが接続することのできる端子を下表に示します。

74HC595の端子 R8C/M12Aと接続することのできる端子
SIN TXD0端子…P1_4,P4_2,P4_6のどれか
SCK CLK0端子…P1_6
LCK どの端子でも可能

R8C/M12Aのどの端子と74HC595を接続させるかは、「glcd_lib_sirial.h」で設定します。設定方法は後述します。
また、液晶の各信号を74HC595のどの信号に接続したかも、「glcd_lib_sirial.h」で設定します。

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

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

グラフィック液晶の初期化(シリアル版)

■関数
書式 void glcd_sirial_init( void );
内容 74HC595に接続されたグラフィック液晶を初期化します。
引数 無し
戻り値 無し
使用例
  glcd_sirial_init();  // グラフィック液晶を初期化

グラフィック液晶表示位置の設定

■関数
書式 void glcd_position( unsigned char x, unsigned char y );
内容 グラフィック液晶に表示する位置を設定します。
引数 x位置:0〜127 左からxドット目に表示します。一番左が0です。
y位置:0〜7 上から(y×8)ドット目に表示します。一番上が0です。
戻り値 無し
使用例
  // x=0, y=8に表示
  glcd_position( 0, 1 );

グラフィック液晶は横128ドット、縦64ドットです。横は1ドット単位で指定します。縦は8ドットが1単位のため、glcd_position関数で指定したy位置×8の部分が、実際のグラフィック液晶に表示される位置になります。例えば、、glcd_position(0, 1 )とすると、ドット数としてはx=0、y=8の位置から表示します。glcd_position関数のx位置、y位置と、実際に表示される位置の関係を下記に示します。
※(x, y)=glcd_position( x, y )です。



液晶に文字列表示

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

  init();           /* 初期化             */
  glcd_init();      /* グラフィック液晶初期化  */

  glcd_position( 0, 0 );
  glcd_put_str( "モジレツヒョウジ" );

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

グラフィック液晶に10進数を表示

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

グラフィック液晶に16進数を表示

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

グラフィック液晶にオリジナルデータを表示

■関数
書式 void glcd_put_data( unsigned char data );
内容 液晶にオリジナルデータを表示します。
引数 表示するデータ0x00〜0xff
戻り値 無し
使用例
  glcd_position( 0, 0 );
  glcd_put_data( 0xc8 );  // 下から上に1100 1000を表示

オリジナルデータの表示は、横1ドット×縦8ドットが1つの単位です。また縦は、yの値が大きいほうが上位ビット、小さいほうが下位ビットになります。(0,0)の位置に0xc8を表示させたときの状態を下記に示します。




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

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

ヘッダファイルの登録

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

#include "sfr_r8m12a.h"        /* R8C/M12A SFRの定義ファイル */
#include "glcd_lib_sirial.h"   /* グラフィック液晶シリアル制御ライブラリ  */


main関数

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

const unsigned char original_data[] = { /* オリジナルデータ */
    0xff, 0x81, 0xff, 0x85, 0x89, 0x89, 0x85, 0xff,
    0x81, 0xbd, 0xc3, 0xc3, 0xc3, 0xa5, 0x81, 0xff,
    0x8b, 0x8b, 0x9b, 0xab, 0xc5, 0x81, 0xff, 0x00 };

void main( void )
{
    int x;

    init();               /* 初期化                    */
    glcd_sirial_init();   /* グラフィック液晶初期化(シリアル版) */

    glcd_kana( 0 );     // カタカナ表示
    glcd_position( 0, 1 );
    glcd_put_str( "アイウエオカキクケコワヲン" );

    glcd_kana( 1 );     // ひらがな表示
    glcd_position( 0, 2 );
    glcd_put_str( "アイウエオカキクケコワヲン" );

    // オリジナルのデータを表示
    glcd_position( 0, 7 );
    for( x=0; x<sizeof(original_data); x++ ) {
        glcd_put_data( original_data[x] );
    }

    while( 1 ) {
        glcd_position( 0, 4 );
        glcd_put_num( cnt_rb,  8 );
        glcd_position( 0, 5 );
        glcd_put_hex( cnt_rb,  8 );
    }
}

今回のプログラムは、
・グラフィック液晶の横0文字目、縦0行目(以下、(0,0)と表記)に「Hello World!」と表示
・(0,1)に「アイウエオカキクケコワヲン」とカタカナを表示
・(0,2)に「あいうえおかきくけこわをん」とひらがなを表示
・(0,4)に10進数でcnt_rb変数の値を8桁で表示
・(0,5)に16進数でcnt_rb変数の値を8桁で表示
・(0,7)に、オリジナルデータを表示(original_data配列にMCRを四角で囲ったデータを登録しておき、このデータを表示)
します。
cnt_rb変数の値が1234のときの表示している状態を下記に示します。

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

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

「font_8x8.h」の説明

グラフィック液晶の表示」を参照してください。

液晶と接続するポートの変更
R8C/M12Aとグラフィック液晶を接続するポートは、変更することができます。「glcd_lib_sirial.h」を開きます。

R8C/M12Aと74HC595の接続

74HC595に接続するR8C/M12Aの端子を設定します。

/*======================================*/
/* シンボル定義                         */
/*======================================*/
/* 接続ポートに応じて、ポートを変更してください */
/* R8C/M12A <=> 74HC595間の設定 */
#define HC595_LCK  p1_1   /* 74HC595のLCK端子の接続端子      */
#define TXD0       1      /* TXD0端子 1=P1_4 2=P4_2 3=P4_6   */

74HC595のLCK端子に接続するR8C/M12Aの端子を「HC595_LCK」で設定します。
74HC595のSIN端子に接続するR8C/M12Aの端子を「TXD0」で設定します。設定値が1ならP1_4端子と、2ならP4_2端子と、3ならP4_6端子と接続します。UART0のTXD0端子を使うのでそれ以外の端子とは接続できません。
74HC595のSCK端子に接続するR8C/M12Aの端子は、UART0のCLK0端子を使うので、P1_6端子しか接続できません。
74HC595のLCK端子、SIN端子をR8C/M12Aのどの端子に接続するか、設定してください。

74HC595とグラフィック液晶の接続

グラフィック液晶に接続する74HC595の端子を設定します。

/* 74HC595(2個目) <<=>> グラフィック液晶間の設定 */
#define  GLCD_RST   (1<<5)  /* GLCDのPST端子の74HC595のQF(bit5)*/
#define  GLCD_CS2   (1<<3)  /* GLCDのCS2端子の74HC595のQD(bit3)*/
#define  GLCD_CS1   (1<<2)  /* GLCDのCS1端子の74HC595のQC(bit2)*/
#define  GLCD_E     (1<<1)  /* GLCDのE  端子の74HC595のQB(bit1)*/
#define  GLCD_RS    (1<<0)  /* GLCDのRS 端子の74HC595のQA(bit0)*/

グラフィック液晶の5端子を、74HC595(2個目)のQA〜QHのどの端子に接続するか設定します。
74HC595の接続端子とプログラムでの設定を、下表に示します。

74HC595(2個目)の端子 設定値
QH端子 (1<<7)、または、0x80
QG端子 (1<<6)、または、0x40
QF端子 (1<<5)、または、0x20
QE端子 (1<<4)、または、0x10
QD端子 (1<<3)、または、0x08
QC端子 (1<<2)、または、0x04
QB端子 (1<<1)、または、0x02
QA端子 (1<<0)、または、0x01
※(1<<x)のxは、QA=0,QB=1・・・QH=7となります。

例えば、グラフィック液晶のE端子を、74HC595のQH端子に接続するときは、表より「(1<<7)」なので、下記のように設定します。

#define GLCD_E  (1<<7)  /* GLCDのE端子の74HC595のQH(bit7) */

このように、グラフィック液晶の5端子を接続する74HC595の端子を設定してください。
※グラフィック液晶のDB7〜DB0は、74HC595(1個目)のQH〜QA端子に接続してください。この8端子は変更できません。

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

ルネサス統合開発環境

3つのファイルの関係を下図に示します。
3つのファイルの関係

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


BACK