I2C 接続の LCD AQM1602XA-RN-GBW 用のライブラリ. Library for LCD 1602XA-RN-GBW connected using I2C interface.

Dependents:   UIT2_MovingAv_Intr UIT2_VariableFIR UIT2_VowelSynthesizer UIT2_ALE_LeakyLMS ... more

Committer:
MikamiUitOpen
Date:
Thu Apr 16 04:22:48 2020 +0000
Revision:
15:64250b58f933
Parent:
14:5e1b1de66a7f
16

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 10:6e6c0f24e81f 1 //---------------------------------------------------------------
MikamiUitOpen 15:64250b58f933 2 // 液晶表示器 AQM1602XA-RN-GBW 用クラス,メンバ関数の定義
MikamiUitOpen 0:f177013dc4fc 3 //
MikamiUitOpen 13:4975e1c1d743 4 // Nucleo の場合のデフォルトのピン
MikamiUitOpen 13:4975e1c1d743 5 // D14 ---- 液晶モジュールの SDA ピン
MikamiUitOpen 13:4975e1c1d743 6 // D15 ---- 液晶モジュールの SCL ピン
MikamiUitOpen 12:21830002e12d 7 //
MikamiUitOpen 15:64250b58f933 8 // 2020/04/16, Copyright (c) 2020 MIKAMI, Naoki
MikamiUitOpen 10:6e6c0f24e81f 9 //---------------------------------------------------------------
MikamiUitOpen 0:f177013dc4fc 10
MikamiUitOpen 0:f177013dc4fc 11 #include "AQM1602.hpp"
MikamiUitOpen 0:f177013dc4fc 12
MikamiUitOpen 0:f177013dc4fc 13 namespace Mikami
MikamiUitOpen 0:f177013dc4fc 14 {
MikamiUitOpen 13:4975e1c1d743 15 // コンストラクタ
MikamiUitOpen 0:f177013dc4fc 16 Aqm1602::Aqm1602(PinName sda, PinName scl, uint32_t clock,
MikamiUitOpen 0:f177013dc4fc 17 bool cursor, bool blink)
MikamiUitOpen 8:854c244a7863 18 : i2cPtr_(new I2C(sda, scl)), i2c_(*i2cPtr_)
MikamiUitOpen 8:854c244a7863 19 { Init(clock, cursor, blink); }
MikamiUitOpen 0:f177013dc4fc 20
MikamiUitOpen 8:854c244a7863 21 Aqm1602::Aqm1602(I2C &i2c, uint32_t clock,
MikamiUitOpen 8:854c244a7863 22 bool cursor, bool blink)
MikamiUitOpen 15:64250b58f933 23 : i2cPtr_(NULL), i2c_(i2c)
MikamiUitOpen 8:854c244a7863 24 { Init(clock, cursor, blink); }
MikamiUitOpen 0:f177013dc4fc 25
MikamiUitOpen 13:4975e1c1d743 26 // 表示のクリア
MikamiUitOpen 15:64250b58f933 27 void Aqm1602::Clear() const
MikamiUitOpen 0:f177013dc4fc 28 {
MikamiUitOpen 12:21830002e12d 29 WriteCmd(0x01);
MikamiUitOpen 8:854c244a7863 30 wait_ms(50);
MikamiUitOpen 0:f177013dc4fc 31 }
MikamiUitOpen 0:f177013dc4fc 32
MikamiUitOpen 13:4975e1c1d743 33 // 文字列の書込み
MikamiUitOpen 15:64250b58f933 34 void Aqm1602::WriteString(const string str) const
MikamiUitOpen 0:f177013dc4fc 35 {
MikamiUitOpen 12:21830002e12d 36 int length = min(str.length(), (size_t)N_CHR);
MikamiUitOpen 12:21830002e12d 37 for (int n=0; n<length; n++) WriteChar(str[n]);
MikamiUitOpen 0:f177013dc4fc 38 }
MikamiUitOpen 0:f177013dc4fc 39
MikamiUitOpen 13:4975e1c1d743 40 // 指定した位置から文字列の書込み
MikamiUitOpen 15:64250b58f933 41 void Aqm1602::WriteStringXY(const string str,
MikamiUitOpen 15:64250b58f933 42 uint8_t x, uint8_t y) const
MikamiUitOpen 0:f177013dc4fc 43 {
MikamiUitOpen 0:f177013dc4fc 44 SetXY(x, y);
MikamiUitOpen 0:f177013dc4fc 45 WriteString(str);
MikamiUitOpen 0:f177013dc4fc 46 }
MikamiUitOpen 9:74a845df6e7a 47
MikamiUitOpen 13:4975e1c1d743 48 // 指定した行のクリア
MikamiUitOpen 15:64250b58f933 49 void Aqm1602::ClearLine(uint8_t line) const
MikamiUitOpen 0:f177013dc4fc 50 {
MikamiUitOpen 0:f177013dc4fc 51 SetXY(0, line);
MikamiUitOpen 15:64250b58f933 52 for (int n=0; n<N_CHR; n++) WriteString(" ");
MikamiUitOpen 0:f177013dc4fc 53 }
MikamiUitOpen 0:f177013dc4fc 54
MikamiUitOpen 13:4975e1c1d743 55 // コントラストの設定
MikamiUitOpen 15:64250b58f933 56 void Aqm1602::SetContrast(uint8_t c) const
MikamiUitOpen 0:f177013dc4fc 57 {
MikamiUitOpen 15:64250b58f933 58 WriteCmd(0x39); // 拡張コマンドへ
MikamiUitOpen 15:64250b58f933 59 WriteCmd(0x70 | (c & 0x0f)); // 下位 4 ビット
MikamiUitOpen 15:64250b58f933 60 WriteCmd(0x5C | ((c >> 4) & 0x03)); // 上位 2 ビット
MikamiUitOpen 15:64250b58f933 61 WriteCmd(0x38); // ノーマル・コマンドへ
MikamiUitOpen 0:f177013dc4fc 62 }
MikamiUitOpen 0:f177013dc4fc 63
MikamiUitOpen 13:4975e1c1d743 64 // 初期化
MikamiUitOpen 8:854c244a7863 65 void Aqm1602::Init(uint32_t clock, bool cursor, bool blink)
MikamiUitOpen 8:854c244a7863 66 {
MikamiUitOpen 8:854c244a7863 67 if (clock != 100000) i2c_.frequency(clock);
MikamiUitOpen 8:854c244a7863 68
MikamiUitOpen 12:21830002e12d 69 wait_ms(100);
MikamiUitOpen 12:21830002e12d 70
MikamiUitOpen 12:21830002e12d 71 // 初期化のためのコマンド送信手順は,秋月電子の AE-AQM1602A(KIT) の
MikamiUitOpen 12:21830002e12d 72 // データシートの記載に従った
MikamiUitOpen 13:4975e1c1d743 73 connected_ = WriteCmd(0x38); // データ長 8-bit, 2-line, 5×8 dots
MikamiUitOpen 8:854c244a7863 74 if (!connected_)
MikamiUitOpen 8:854c244a7863 75 {
MikamiUitOpen 8:854c244a7863 76 fprintf(stderr, "\r\nLCD AQM1602 not connected\r\n");
MikamiUitOpen 8:854c244a7863 77 return;
MikamiUitOpen 8:854c244a7863 78 }
MikamiUitOpen 8:854c244a7863 79
MikamiUitOpen 13:4975e1c1d743 80 WriteCmd(0x39); // 拡張命令モードへ
MikamiUitOpen 13:4975e1c1d743 81 WriteCmd(0x14); // 内部発信周波数
MikamiUitOpen 13:4975e1c1d743 82 WriteCmd(0x70 | 0x00); // コントラスト設定
MikamiUitOpen 8:854c244a7863 83 WriteCmd(0x54 | 0x02); // Power/ICON/Contrast control
MikamiUitOpen 8:854c244a7863 84 WriteCmd(0x6C); // Follower control
MikamiUitOpen 8:854c244a7863 85 wait_ms(200);
MikamiUitOpen 8:854c244a7863 86
MikamiUitOpen 13:4975e1c1d743 87 WriteCmd(0x38); // 通常の命令モードへ復帰,
MikamiUitOpen 13:4975e1c1d743 88 // データ長:8-bit, 2-line, 5×8 dots
MikamiUitOpen 15:64250b58f933 89 // WriteCmd(0x01); // クリア,これを入れると正常に動作しない
MikamiUitOpen 8:854c244a7863 90 WriteCmd(0x0C | (cursor << 1) | blink);
MikamiUitOpen 12:21830002e12d 91
MikamiUitOpen 12:21830002e12d 92 Clear();
MikamiUitOpen 8:854c244a7863 93 }
MikamiUitOpen 8:854c244a7863 94
MikamiUitOpen 13:4975e1c1d743 95 // コマンドとデータの送信
MikamiUitOpen 15:64250b58f933 96 bool Aqm1602::LcdTx(uint8_t cmdData, uint8_t data) const
MikamiUitOpen 0:f177013dc4fc 97 {
MikamiUitOpen 13:4975e1c1d743 98 // このメンバ関数を割込み処理で使う場合,以下の処理ではうまく動作しない
MikamiUitOpen 11:f650f1e809a9 99 /*
MikamiUitOpen 13:4975e1c1d743 100 int rt = i2c_.write(LCD_ADDRESS_, (char []){cmdData, data}, 2);
MikamiUitOpen 7:5375acc9a74a 101 wait_us(30);
MikamiUitOpen 3:414f98234c94 102 return (rt == 0) ? true : false;
MikamiUitOpen 11:f650f1e809a9 103 */
MikamiUitOpen 15:64250b58f933 104 // 以下の処理の場合は,このメンバ関数を割込み処理で使っても大丈夫
MikamiUitOpen 11:f650f1e809a9 105 i2c_.start();
MikamiUitOpen 12:21830002e12d 106 if (1 != i2c_.write(LCD_ADDRESS_)) return false;
MikamiUitOpen 12:21830002e12d 107 if (1 != i2c_.write(cmdData)) return false;
MikamiUitOpen 12:21830002e12d 108 if (1 != i2c_.write(data)) return false;
MikamiUitOpen 11:f650f1e809a9 109 i2c_.stop();
MikamiUitOpen 11:f650f1e809a9 110 wait_us(30);
MikamiUitOpen 12:21830002e12d 111 return true;
MikamiUitOpen 0:f177013dc4fc 112 }
MikamiUitOpen 13:4975e1c1d743 113 }