LCD液晶表示をつける

aki-LCD

液晶ディスプレイ:LCD の接続と表示の方法の説明。

 

マイコンでディスプレイの役割をするLCD:液晶表示器はマイコンの入門と学習に必要なもの。
液晶表示器を接続する回路の説明と、その関数やプログラムの処理方法についてわかりやすく解説


LCD液晶表示

LCD液晶表に関しては熊谷研さんを参考にさせてもらいました。

 

 熊谷研究所 ◆H8/3048F  LCD液晶表示をつける

 

これまで3664が何をしているか、中身を見るときはLEDが手段でした。
それ以外ではなかなかマイコンがプログラム通り動いているのか、確認の方法がなく、PCのように表示が無いのはきついですね。(大昔のマイコンのよう)

 

そこで、テストボードを作成したので、LCD液晶表示をつけました。
今回のLCDについては、熊谷研HP でH8-3664が扱われているので、それを使用させてもらいました。

 

LCD

秋月通商で買っておいた SC1602BS*B(バックライト無し) を使用。使いやすいので、よく使われれ扱っているところも多いので、ネットでも参考例も多いです。( 2006/5/1ごろ)

aki-LCD

 

 バックライトは暗いところで見る場合に見やすいというもの。明るい部屋で使用するならなくても不便はないでしょう
LCDは裏面から見て、右側のピンだけを使用します

 

回路図

まずはH8とLCDを接続する回路からです。

*注意*

これまでのDIP版と違い、3664QFP版を使用していますので、ピン番号が違うはずです
(ピン名称は同じ)
付属の説明書とよくピン番号を確認してください。

LCD接続回路図

マイコンとの接続については、熊谷研HPと同じでなくてもちゃんと信号が伝わるように接続されていれば大丈夫です。

つなげるピンの違いは、ソフトの関数側で吸収するものなので。
ピンとソフトの設定は下記 ■プログラム の項目を参照してください。

 

●配線

簡単に接続の方針を説明

 

<データ信号>

本来はデータの信号は8ビットで 信号ラインだけで8本必要ですが、4ビットでも可能なので

データ信号ラインは4本

<制御信号>

制御用信号は、LCDが忙しいときにデータを送っても受けれないので、本来、ヒマになったよ と受け入れ可能信号をもらいますが、十分ヒマになるまで時間をおいて待ってから送る
という方法で ビジー信号ラインを省いています。

制御信号ラインは2本

LCD液晶表示させるには、最大に削ってこの6本のピンが必要です。(あらためて気づきましたが、ポートが少ないので、3664tinyでは6本でも取られるとキツですね、でも6本以下には削れません)

IOポートは、熊谷研HPと全く同じポートでなくても、ちゃんと信号が伝わるように接続されていれば大丈夫です。

 

注意  6本のIOポートは、必ず0ビット目から割り振る必要があります。

 

例えば、
ポート5の 2ビット-7ビット まで6本 というのはこのプログラムではダメです。
ポート5の 0-5ビット まで の6本 のようにします。

 

ここでは ポート5の 0-5ビット まで の6本 をLCDに割り振り、接続しました。

 

●可変抵抗

液晶の明るさ調節用です(10KΩ)。これを回して照度の調節をします。
なければ、50kΩでも可です。 

 

以下設定方法です。

 

プログラム

熊谷研HP公開のプログラムそのままを使用させていただきます。

 >LCD液晶表示をつける
(このプログラムは上記リンク 熊谷研HP で公開されているものです)

接続にあわせ、一部変更します。最後に追加の関数を加えました。

 

熊谷研HPには3664用LCDの関数を公開されているので、そのまま使用可能なので使わせてもらいました。 それをここで説明する....というのもなんなんですが・・・

やはり、初めてだと、ヘッダファイルにしたりと、関数だけ使うのは難しそうなので、初心者向けに使い方などの説明をくわえました。(最終的には 下記のように ヘッダファイル にします)

 

一部、追加もしましたので、設定方法、使用方法などその説明をしたいと思います。

このLCD表示関数は3048用と3664用 兼用なので
プリプロセッサの部分で、条件分けして、切り替えるようになっています。3664での使用の場合は 下記のように

#define H8_3664
とします。

 

IOポートの設定

 

3664用IOポートは
  IO.PCR8 →IO.PCR5

  ・

  ・
の部分を変更します

 

#include <3664.h>

#define H8_3664

/* i/o */
#ifdef H8_3664
#define LCD_DDR  IO.PCR8     →IO.PCR5
#define LCD_port  IO.PDR8.BYTE  →IO.PDR5.BYTE  
#define LCD_RS   IO.PDR8.BIT.B4 →IO.PDR5.BIT.B4
#define LCD_E    IO.PDR8.BIT.B5 →IO.PDR5.BIT.B5
#else
#define LCD_DDR P3.DDR
#define LCD_port P3.DR.BYTE
#define LCD_RS P3.DR.BIT.B4
#define LCD_E P3.DR.BIT.B5
#endif

 

熊谷研HPと違うIOポートにしてある場合は、ここで自分で割り振り、LCDと接続したポートを設定してください。

 

ここでは、谷研HP公開のものと違い、回路図の通りポート5をLCDとつなげたので、
赤色のポートレジスタ名を →IO.PCR5のように変更します。

 

LCD表示器のための関数の説明

 

○実際にユーザ使用の関数

(1)LCD_init( (unsigned int)clock freq. );
(2)LCD_disp( string pointer, (int)line );
(3)LCD_locate( (int)row, (int)column );
(4)LCD_char( (unsigned char)ascii data );
(5)LCD_hex( (unsigned char)data );

 

○関数追加

修正) 2008/9/24  LCD自己追加関数 を新しく変更しました。±8桁数値まで表示可能(エラーチェックあり)

文字列と16進数の数字の表示だけでは、デバッグ表示に不便なので、数値表示の関数をトラ技の記事を参考に作成して追加しました。

 

(6)LCD_dtoutLsgn( signed long )   //左詰め±8桁数値表示関数
(7)LCD_dtoutRsgn( unsigned char signed long )  //右詰め、固定桁数、±8桁数値表示関数

 

熊谷研さんのLCD関数はとても使いやすく、利用させてもらっています
特にデバッグでの10進数表示は多用するので、10進数表示用の関数を作りました。

前回作っていたLCD_dataout() は左詰めの可変桁表示だったので、数値の一回表示ならいいのですが、
固定位置に可変数値を表示すると桁落ちで残数字がでるのでそれに対応、エラーチェックも付け、マイナスも可能な表示関数も付け加えました。

 

●変数の10進数表示関数

 

① LCD_dtoutLsgn( (signed long) data )

左詰め表示で、数字と同じ桁数で表示する関数

 

数値範囲±8桁までの数値(data) をLCDに表示(負の場合マイナス記号 - 表示)
表示は自動的に数値桁数のマスぶんで表示
数値範囲±8桁を超えると E 表示

(使用方法)  unsigned short a=9999;
LCD_dtoutLsgn( a ); など
または即値  LCD_dtoutLsgn( -12345678 ); など

 

② LCD_dtoutRsgn( (unsigned char)figure , (signed long) data )

 

LCD_locate()で表示位置を固定し連続可変数字の表示をしても残数字が出ないよう、常に右詰め表示で、指定した固定桁幅で数値を表示するようにした関数

固定桁数(figure)、数値範囲±8桁までの数値(data)をLCDに表示(負の場合 マイナス記号 - 表示)

・ figure(桁数):1~8 を表示範囲として渡す

表示数値幅は、常に figure(桁数) で、右詰め表示される、桁数があまる場合は自動的にスペース表示
実際の表示マスは  figure桁数+(±記号1マス) となる
( 表示数値が数値範囲figure(桁数)を超えると E 表示 )
( 表示桁数は8桁なので、引数 figure(桁数) に 9以上 を渡すと何も表示せず 関数返値-1)

 

(使用方法)  a=99;
LCD_dtoutRsgn( 5 , a );
LCD表示  □□□□99     (□はスペース)
a=-12;
LCD_dtoutRsgn( 5 , a ); 
LCD表示  □□□-12     (□はスペース)

または即値
LCD_dtoutRsgn( 8 , -12345678 ); など
LCD表示  -12345678

 

ヘッダファイルにする

このLCD関数をヘッダファイルにしておきます。

 

ヘッダファイルにする手法の説明は下記 Tekrobo工作室 の一部にありますので、参考にさせてもらいましょう
 自分の関数をヘッダファイルにする

 

myfunc.h という名前のヘッダファイルにしています。

そのmyfunc.hを GDLのある BestTech フォルダの 
 C:\Program Files\BestTech\GCC Developer Lite\TARGET\3664F
\3664F フォルダ に入れておきます。


こうすれば、
#include "myfunc.h" を最初につけ  ( または #include <myfunc.h>  )
下記のようにするだけでサンプルがビルド出来ます。

 

#include <3664.h>
#include "myfunc.h"

void main( void )
{
サンプルプログラム
}

 

実行例 サンプル プログラム

サンプル1

#include <3664.h>
#include "myfunc.h"

void main( void )
{
サンプルプログラム
}

 

void main() 以下を
熊谷研HPのサンプルプログラム に変えて 実行すると

LCDに 
Welcome to
KUMAGAI Lab.
と表示されれば成功です。

 

その他の関数も試す。

サンプル2


 #include <3664.h>
#include "myfunc.h"

void main( void )
{

   char b;

   LCD_init( 16 ); // LCD初期化
   LCD_disp( "thanks Kuma Lab" , 1 ); //文字列表示       LCD_locate(2,1);    LCD_char('a'); //1文字表示    b=15;    LCD_locate(2,6);    LCD_hex(b); // 変数a の16進数表示 }

 

   LCD1行目に 直接文字列を入力して表示
   LCD2行目に LCD_char を使っての一文字表示と、16進数表示

 

サンプル3


 #include <3664.h>
#include "myfunc.h"

void main( void )
{

   signed long a;

   LCD_init( 16 ); // LCD初期化               

   //右詰め 5桁マス
   a = 99;
   LCD_locate(1,0);
   LCD_dtoutRsgn( 5,a );

   //左 詰め マイナス
   a = -99;
   LCD_locate(1,10);
   LCD_dtoutLsgn( a );

   //右詰め 8桁マス マイナス
   a = -12345678;
   LCD_locate(2,0);
   LCD_dtoutRsgn( 8,a );

   //右詰め 8桁マス エラー
   a = 123456; //6桁
   LCD_locate(2,11);
   LCD_dtoutRsgn( 5,a ); // 5桁マスに6桁を渡す 
       


まとめ

 

熊谷研HP公開 LCD用関数の使用方法

●LCDの初期化
LCD_init( (unsigned int)clock freq. );

(説明)  LCDの初期化--使用する前に一度だけ
(使用方法)   LCD_init( 16 );として使用

●文字列表示
LCD_disp( string pointer, (int)line );

(説明)    LCD_disp( 表示する文字列のアドレス, 表示する行(1or2)  ); 2行LCDの場合(1or2)
(使用方法)  LCD_disp( "thanks Kuma Lab" , 1 );  など

●表示位置
LCD_locate( (int)row, (int)column );

(説明)    LCD_locate( 行 , 横マス目);
(使用方法)  LCD_locate(2,1); など

●一文字表示
LCD_char( (unsigned char)ascii data );

(説明)    LCD_char( 文字 );
(使用方法)  LCD_char( 'a' ); など

●変数の16進数表示
LCD_hex( (unsigned char)data );

(使用方法)   unsigned char a=10;
LCD_hex(a); など

(自己追加関数)
●変数の10進数表示
①左詰め表示
LCD_dtoutLsgn( (signed long) data )

(使用方法)   signed char a=10;
LCD_dtoutLsgn( a ); 
または即値
LCD_dtoutLsgn( -12345678 ); など

[ 旧関数 ]
LCD_dataout((unsigned char)data)

(使用方法)   unsigned char a=10;
LCD_dataout(a); など

②右詰め表示
LCD_dtoutRsgn( (unsigned char)figure , (signed long) data )

(使用方法)   signed char a = -12345678;
LCD_dtoutRsgn( 8 , a ) など    ( 8 (figure) は表示マス目数)
または即値
LCD_dtoutRsgn( 8 , -12345678 ); など

 

 

 

スポンサーリンク
  • facebook
  • twtter
  • google+
  • hatena