秋月さんで買ったAQM1602(キャラクターLCD)をPICにつないでみました。
概要
簡単な仕様(秋月さんのHPより)
項目 | 詳細 |
---|---|
解像度 | 3モード ・5x8ドット文字 16桁 1行表示 ・5x8ドット文字 16桁 2行表示 ・5x16ドット文字 16桁 1行表示 |
インターフェイス | I2C |
キャラクター登録 | 8文字 |
動作電圧 | 3.1V~5.5V |
サイズ | 66mmX27.7mmX2.0mm |
表示文字は大きくかつ値段も安くてとても良い商品です。秋月さんのHPにサンプルプログラムが有るのですが、Arduino用でした。そこでPIC用にプログラムを書いてみました。
回路
今回使ったPICは、PIC24FJ64GA002 です。28ピンのPICですがDIPサイズで使い勝手が良いPICです。回路と実際の配線は下記の通り
ピンピッチ変換基板があるので、PICの17番ピンとLCDのSCL、PICの18番ピンとLCDのSDAをつなぐだけで配線終了です。
コントロール用のソフト
AQM1602をPICからコントロールするにあたりLCDに関し以下の設定を行っています。
- このLCDは3パターンの表示モードを持っています。
- Mode 1:5x8ドット文字 16桁表示 上の段のみの表示。下の段は表示されません。
- Mode 2:5x8ドット文字 16桁表示 上下2段表示。
- Mode 3:5x16ドット文字 16桁表示 上下合わせて1段表示。
- 表示部の位置を以下の様に設定しています。
- X座標:表示部の左端を”0”。右端を”0x0F(15)としています。
- Y座標:上段を、”0”。下段を、”1”としています。Mode1,3についてはy座標は無視されます。
- 連続表示について
- 一文字表示すると表示位置が右に1つ移動します。
- 表示した場所が右端に達した場合、次の表示位置はその段の左端に移動します。
これらの前提のもとに書きの関数を書きました。これらの関数は AQM1602.c と AQM1602.hに書いて有ります。
関数 | 説明 |
---|---|
void init_LCD() | 初期設定用の関数です。 AQM1602を使用する前に必ず実行して下さい。 これを行うと 画面はモードは2に設定されます。 画面のダータは消去されます。 カーソルは0,0に移動しますが表示されません。 |
void LCD_Cls() | 画面を消去してホームポジションにカーソルを移動。 |
void LCD_Home(void) | ホームポジションにカーソルを移動します。 |
void LCD_Mode(int no) | 表示モードの設定。引数が、 1: 5x8ドット文字 16桁 1行表示 2: 5x8ドット文字 16桁 2行表示 3: 5x16ドット文字 16桁 1行表示 引数が1(Mode1)と2,3では画面の輝度が変わります。 Mode1が他のモードより輝度が上がります。設定後輝度を 関数Contrast(uint8_t data)で調整して下さい。 |
void LCD_Move(uint8_t x, uint8_t y) | 指定したx(桁)y(行)にカーソルを移動。 モード1,3の時はyは無視されます。 |
void LCD_Put_C(char data) | カーソルの位置に1文字を表示。 引数は文字コード。 |
void LCD_Put_C_L(uint8_t x, uint8_t y, char data) | 指定したx(桁)y(行)に1文字表示。 引数は文字コード。 |
void LCD_Print(char * data); | 現在カーソルの有る位置から文字列を表示します。 文字列の最後は必ず0x00 とする。 引数は表示する文字列のポインター |
void LCD_Print_L(uint8_t x, uint8_t y, char * data) | 指定したx(桁)y(行)の位置に文字列を表示。 文字列の最後は必ず0x00 とする。 モード1,3の時はyは無視されます。 引数は表示する文字列のポインター |
void Display(uint8_t data) | ディスプレーのオンオフ。0:オフ 1:オン |
void Cursor(uint8_t data) | カーソルのオンオフ。 0:オフ 1:オン |
void Brink(uint8_t data) | カーソルブリングのオンオフ。 0:オフ 1:オン |
void Cursor_Shift(uint8_t data) | カーソルを左右に1つ移動。 0:左 1:右 |
void Contrast(uint8_t data) | 引数の値に対応して画面の明るさ調整。 引数は0から0x3F(MAX)まで |
void Set_Char(uint8_t no, uint8_t *data) | 変更可能は8文字のフォントを設定。 第一引数:文字の指定(0から7) 第二引数:フォントデータ |
初期設定用の関数 void init_LCD() にLCDに供給する電圧(Vcc)で値を変更する箇所が有ります。下記のその箇所です。電圧に合わせて値を変更して下さい。
Set_Char()について追加説明します。
- このLCDはユーザーが独自に設定できる文字が8個用意されています。
- この関数はそれら8文字に関し文字を設定するものです。
- 最初の引数は、編集する文字番号(0から7)。次は編集用データのポインターです。
- 編集用データですが、例えば下記の様な文字を設定したい場合
- 各行で5ビットのみ有効です。上位3ビットは無視されます。
- 各行(5ビット有効)のデータ x 8個で 1つの文字パタンを設定します。
- 編集用データは、0x1F, 0x04, 0x04, 0x1F, 0x15, 0x1B, 0x11, 0x1F の8個となります
- 画面への表示は、0に登録したフォントのみLCD_Put_C()またはLCD_Put_C_L()を使って下さい。
LDC_Print()LCD_Print_L()は使用出来ません。他の番号1から7はどちらも使えます。- LDC_Print()LCD_Print_L()は文字列の終わりを、0で判断しています。
- 登録番号0が文字列の終わりと判断されます。そこで表示を終了してしまいます。
検証用プログラム
- 53行:フォントデータ(8個)の定義
- 59行:LCDの初期設定
- 62行:モード3に設定
- 63行:カーソルを表示
- 65行:”AQM1602″を0,0から表示
- 67行:フォントを0に登録
- 68行:登録したフォントを9桁目に表示
最後に
今回使用したプロジェクトをここに保存しています。ー>ここ