【液晶表示器】
ここで扱う液晶表示器はSEIKO製の SC1602BSLB か SC1602BS*B
です。良く使われるシリーズで、16文字×2行の英数字、カナ文字が
表示できます。
消費電流も非常に少ないので(ただしバックライト無し)PICの表示器と
しては持ってこいのものです。
詳細については、別ページ を参照して下さい。
【制御回路】
ここで紹介する液晶表示器とPICとの接続回路は下図とします。
これ以外の接続の場合には、プログラム中でピンの指定変更が必要
です。
【制御ライブラリ】
液晶表示器制御用ライブラリ(lcd_lib.c)には、下記の関数を含んで
います。
(1) 初期化関数 lcd_init()
PICの電源投入後に実行するべき初期化の関数です。パラメータ
はありません。
(2) コマンド出力関数 lcd_cmd(cmd)
液晶表示器の制御を行うための1バイトのコマンドを出力する関数
パラメータとして下記制御コマンドを使います。
【Control Commandの一覧表】
Commnad DB7 6 5 4 3 2 1 0 説 明
Clear Display 0 0 0 0 0 0 0 1 全消去、CursorはHomeへ
Cursor At Home 0 0 0 0 0 0 1 * 表示内容は変化なし。
Entry Mode Set 0 0 0 0 0 1 I/D S I/D=Increment/Decrement
S=With Display Shift
Display On/Off 0 0 0 0 1 D C B D=Display C=Cursor B=Blink
Cursor/Dislay Shift 0 0 0 1 S/C R/L * * S/C=Display/Cursor
R/L=Right/Left
Function Set 0 0 1 DL N F * * DL=8/4Bit N=2/1Line
F=Large/Small
CGRAM Address Set 0 1 CCRAM Address Character Generator RAM
DDRAM Address Set 1 L DDRAM Address Display RAM L=Line
Busy Flag/Adrs Read BF Address BF=Busy Flag
(3) 文字表示関数 lcd_data(string)
stringとして渡す文字列を表示します。表示位置は現在位置から
となりますので、位置を変更する場合には、上記コマンドで制御
します。
(4) 画面消去関数 lcd_clear()
単純に全画面を消去しカーソル位置を左上端とします。
★ 液晶表示制御用ライブラリ(ダウンロードしてお使い下さい)
《使い方》
使い方は、プログラムの最初で、液晶表示器の接続ピンの定義を
します。そのあとで#include関数でlcd_lib.cをインクルードしてリンク
します。
その後は最初にlcd_init()関数を使って初期化をすれば、あとは
自由に使えます。
《ピンの指定方法》
液晶表示器用として使う入出力ポートを定義します。
(a) データバス db
いずれかの入出力ポートの上位4ビットを使います。上位に
固定となっています。(標準はポートBです)
(b) 制御信号
3本の制御信号が必要ですが、それぞれを#define関数で
指定します。 必要な3つの信号は rs、rw、stb の3種です。
入出力ポートは特定されないので、どこでもOKです。
(c) 入出力ポートのモード設定初期値
液晶表示器用に使うポートの入出力モードの初期設定値を
Amode、Bmodeとして指定します。
特にBmodeは上位4ビットは出力とすることが必要です。
【プログラム例】
上記液晶表示制御関数を使ったプログラム例です。
機能としては、いくつかの表示メッセージを一定間隔で表示するという
極く単純なものです。
消去と2行目位置制御の2種類の制御コマンドも一緒に使っています。
《プログラム例》(このままでは漢字スペースを含むので使えません)
///////////////////////////////////////////
// LCD test program
// LCD is SC1602BSLB or SC1602BS*B
//////////////////////////////////////////
#include <16f84.h>
#use fast_io(a)
#use delay(CLOCK=10000000)
#define Bmode 0x0F //port B initial mode
#define Amode 0 //port A initial mode
#byte db = 6 //port B
//////// Port define and link LCD library
#define rs PIN_A2 //chip select
#define rw PIN_A1 //read/write
#define stb PIN_A0 //strobe
#include <lcd_lib.c>
///////////////////////////////////////////////
// LCD test program main routine
// Display several message on LCD
// with some interval.
// Constant Message is send by lcd_data()
///////////////////////////////////////////////
main(){
set_tris_a(Amode); //mode set of port
set_tris_b(Bmode); //lower is input
lcd_init(); //initialize LCD
while(1){ //endless loop
lcd_clear(); //clear display
lcd_data("message001");
delay_ms(1000); //wait 1sec
lcd_clear();
lcd_data("MESSAGE002");
delay_ms(1000);
lcd_clear();
lcd_data("1234567890");
delay_ms(1000);
lcd_clear();
lcd_data("abcdefghijklmnop");
lcd_cmd(0xC0); //second line
lcd_data("qrstuvwxyz!#$%&'");
delay_ms(3000);
}
}
《解説》
#use delay(CLOCK=10000000)
これは液晶表示制御のライブラリ内でディレイ関数を使って
いるので必ずこの関数でクロックを指定しておく必要があり
ます。
#define Bmode 0x0F
#define Amode 0
#byte db = 6
ここで液晶表示器に使うポートの指定と初期モードの設定値を
定義しています。例では、データバスがポートB、制御はポートA
となっており、ポートBの下位4ビットは入力モードを初期値と
しています。
#define rs PIN_A2
#define rw PIN_A1
#define stb PIN_A0
ここで制御ピンの指定をしています。例ではポートAの0,1,2ピン
としています。
#include <lcd_lib.c>
これで関数ライブラリをインクルードします。
lcd_init();
初期化の関数で、パラメータは必要ありません。メインの最初で
実行する必要があります。
lcd_clear();
液晶表示を消去する関数で、パラメータは必要無く、無条件で
クリアします。
lcd_data("message001");
文字列を表示する関数の使用例で、""で囲われた文字列を
そのまま液晶に表示します。
この関数ではCCSのコンパイラの特徴である、パラメータが
charまたはint属性の時に、文字列をパラメータとして使うと、その
文字列を1文字の繰り返しとして実行することを利用しています。
これは標準のC関数と異なっています。
lcd_cmd(0xC0);
液晶表示器の制御コマンドの使用例で、これで2行目の最初に
カーソル位置が移動します。