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
AQM1602.cpp@15:64250b58f933, 2020-04-16 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Thu Apr 16 04:22:48 2020 +0000
- Revision:
- 15:64250b58f933
- Parent:
- 14:5e1b1de66a7f
16
Who changed what in which revision?
User | Revision | Line number | New 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 | } |