|
グラフィック液晶の表示〜シリアル接続版〜 |
|
内容
前回、グラフィック液晶の表示方法を説明しました。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 |
|
H |
e |
l |
l |
o |
|
W |
o |
r |
l |
d |
! |
|
|
|
|
ア |
イ |
ウ |
エ |
オ |
カ |
キ |
ク |
ケ |
コ |
ワ |
ヲ |
ン |
|
|
|
あ |
い |
う |
え |
お |
か |
き |
く |
け |
こ |
わ |
を |
ん |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
0 |
0 |
0 |
1 |
2 |
3 |
4 |
|
|
|
|
|
|
|
|
0 |
0 |
0 |
0 |
0 |
4 |
d |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
※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つのファイルの関係を下図に示します。
@マイコンの電源が入ると「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ファイル単体では何もしません。
|
|