AQM1602 Character LCD (for PIC)

秋月さんで買った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桁目に表示

最後に

今回使用したプロジェクトをここに保存しています。ー>ここ