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:
Sat Oct 28 12:57:52 2017 +0000
Revision:
12:21830002e12d
Parent:
11:f650f1e809a9
Child:
13:4975e1c1d743
13

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 10:6e6c0f24e81f 1 //---------------------------------------------------------------
MikamiUitOpen 0:f177013dc4fc 2 // Class for LCD, AQM1602XA-RN-GBW
MikamiUitOpen 12:21830002e12d 3 //
MikamiUitOpen 12:21830002e12d 4 // Default pin assignments for Nucleo
MikamiUitOpen 12:21830002e12d 5 // D14 SDA ---- to pin4 of LCD module
MikamiUitOpen 12:21830002e12d 6 // D15 SCL ---- to pin3 of LCD module
MikamiUitOpen 0:f177013dc4fc 7 //
MikamiUitOpen 12:21830002e12d 8 // 動作を確認したボード: Nucleo-F401RE, Nucleo-F411RE, Nucleo-F446RE,
MikamiUitOpen 12:21830002e12d 9 // LPC1768
MikamiUitOpen 12:21830002e12d 10 // 動作が不良なボード: Nucleo-F302R8, Nucle0-F746ZG, Disco-f746NG
MikamiUitOpen 12:21830002e12d 11 //
MikamiUitOpen 12:21830002e12d 12 // このプログラムを作った際の mbed のリビジョン:Rev.154
MikamiUitOpen 12:21830002e12d 13 //
MikamiUitOpen 12:21830002e12d 14 // 2017/10/28, Copyright (c) 2017 MIKAMI, Naoki
MikamiUitOpen 10:6e6c0f24e81f 15 //---------------------------------------------------------------
MikamiUitOpen 0:f177013dc4fc 16
MikamiUitOpen 0:f177013dc4fc 17 #include "AQM1602.hpp"
MikamiUitOpen 0:f177013dc4fc 18
MikamiUitOpen 0:f177013dc4fc 19 namespace Mikami
MikamiUitOpen 0:f177013dc4fc 20 {
MikamiUitOpen 0:f177013dc4fc 21 // Constructor
MikamiUitOpen 0:f177013dc4fc 22 Aqm1602::Aqm1602(PinName sda, PinName scl, uint32_t clock,
MikamiUitOpen 0:f177013dc4fc 23 bool cursor, bool blink)
MikamiUitOpen 8:854c244a7863 24 : i2cPtr_(new I2C(sda, scl)), i2c_(*i2cPtr_)
MikamiUitOpen 8:854c244a7863 25 { Init(clock, cursor, blink); }
MikamiUitOpen 0:f177013dc4fc 26
MikamiUitOpen 8:854c244a7863 27 Aqm1602::Aqm1602(I2C &i2c, uint32_t clock,
MikamiUitOpen 8:854c244a7863 28 bool cursor, bool blink)
MikamiUitOpen 8:854c244a7863 29 : i2cPtr_(NULL), i2c_(i2c)
MikamiUitOpen 8:854c244a7863 30 { Init(clock, cursor, blink); }
MikamiUitOpen 0:f177013dc4fc 31
MikamiUitOpen 0:f177013dc4fc 32 // All clear
MikamiUitOpen 12:21830002e12d 33 void Aqm1602::Clear()
MikamiUitOpen 0:f177013dc4fc 34 {
MikamiUitOpen 12:21830002e12d 35 WriteCmd(0x01);
MikamiUitOpen 8:854c244a7863 36 wait_ms(50);
MikamiUitOpen 0:f177013dc4fc 37 }
MikamiUitOpen 0:f177013dc4fc 38
MikamiUitOpen 0:f177013dc4fc 39 // Write string
MikamiUitOpen 12:21830002e12d 40 void Aqm1602::WriteString(const string str)
MikamiUitOpen 0:f177013dc4fc 41 {
MikamiUitOpen 12:21830002e12d 42 int length = min(str.length(), (size_t)N_CHR);
MikamiUitOpen 12:21830002e12d 43 for (int n=0; n<length; n++) WriteChar(str[n]);
MikamiUitOpen 0:f177013dc4fc 44 }
MikamiUitOpen 0:f177013dc4fc 45
MikamiUitOpen 0:f177013dc4fc 46 // Write string from specified position
MikamiUitOpen 12:21830002e12d 47 void Aqm1602::WriteStringXY(const string str,
MikamiUitOpen 9:74a845df6e7a 48 uint8_t x, uint8_t y)
MikamiUitOpen 0:f177013dc4fc 49 {
MikamiUitOpen 0:f177013dc4fc 50 SetXY(x, y);
MikamiUitOpen 0:f177013dc4fc 51 WriteString(str);
MikamiUitOpen 0:f177013dc4fc 52 }
MikamiUitOpen 9:74a845df6e7a 53
MikamiUitOpen 0:f177013dc4fc 54 // Clear of specified line
MikamiUitOpen 0:f177013dc4fc 55 void Aqm1602::ClearLine(uint8_t line)
MikamiUitOpen 0:f177013dc4fc 56 {
MikamiUitOpen 0:f177013dc4fc 57 SetXY(0, line);
MikamiUitOpen 0:f177013dc4fc 58 for (int n=0; n<N_CHR; n++)
MikamiUitOpen 0:f177013dc4fc 59 WriteString(" ");
MikamiUitOpen 0:f177013dc4fc 60 }
MikamiUitOpen 0:f177013dc4fc 61
MikamiUitOpen 0:f177013dc4fc 62 // Set contrast
MikamiUitOpen 0:f177013dc4fc 63 void Aqm1602::SetContrast(uint8_t c)
MikamiUitOpen 0:f177013dc4fc 64 {
MikamiUitOpen 0:f177013dc4fc 65 WriteCmd(0x39);
MikamiUitOpen 0:f177013dc4fc 66 WriteCmd(0x70 | (c & 0x0f)); // Lower 4 bits
MikamiUitOpen 0:f177013dc4fc 67 WriteCmd(0x5C | ((c >> 4) & 0x03)); // Higher 2 bits
MikamiUitOpen 0:f177013dc4fc 68 WriteCmd(0x38);
MikamiUitOpen 0:f177013dc4fc 69 }
MikamiUitOpen 0:f177013dc4fc 70
MikamiUitOpen 0:f177013dc4fc 71 //---------------------------------------------------
MikamiUitOpen 0:f177013dc4fc 72 // Following functions: private
MikamiUitOpen 0:f177013dc4fc 73
MikamiUitOpen 8:854c244a7863 74 // Initialize
MikamiUitOpen 8:854c244a7863 75 void Aqm1602::Init(uint32_t clock, bool cursor, bool blink)
MikamiUitOpen 8:854c244a7863 76 {
MikamiUitOpen 8:854c244a7863 77 if (clock != 100000) i2c_.frequency(clock);
MikamiUitOpen 8:854c244a7863 78
MikamiUitOpen 12:21830002e12d 79 wait_ms(100);
MikamiUitOpen 12:21830002e12d 80
MikamiUitOpen 12:21830002e12d 81 // 初期化のためのコマンド送信手順は,秋月電子の AE-AQM1602A(KIT) の
MikamiUitOpen 12:21830002e12d 82 // データシートの記載に従った
MikamiUitOpen 12:21830002e12d 83 connected_ = WriteCmd(0x38); // data length:8-bit, 2-line, 5×8 dots
MikamiUitOpen 8:854c244a7863 84 if (!connected_)
MikamiUitOpen 8:854c244a7863 85 {
MikamiUitOpen 8:854c244a7863 86 fprintf(stderr, "\r\nLCD AQM1602 not connected\r\n");
MikamiUitOpen 8:854c244a7863 87 return;
MikamiUitOpen 8:854c244a7863 88 }
MikamiUitOpen 8:854c244a7863 89
MikamiUitOpen 8:854c244a7863 90 WriteCmd(0x39); // To extended command
MikamiUitOpen 8:854c244a7863 91 WriteCmd(0x14); // Internal OSC frequency
MikamiUitOpen 8:854c244a7863 92 WriteCmd(0x70 | 0x00); // Contrast set
MikamiUitOpen 8:854c244a7863 93 WriteCmd(0x54 | 0x02); // Power/ICON/Contrast control
MikamiUitOpen 8:854c244a7863 94 WriteCmd(0x6C); // Follower control
MikamiUitOpen 8:854c244a7863 95 wait_ms(200);
MikamiUitOpen 8:854c244a7863 96
MikamiUitOpen 8:854c244a7863 97 WriteCmd(0x38); // data length:8-bit, 2-line, 5×8 dots
MikamiUitOpen 12:21830002e12d 98 // WriteCmd(0x01); // clear,これを入れると正常に動作しない
MikamiUitOpen 8:854c244a7863 99 WriteCmd(0x0C | (cursor << 1) | blink);
MikamiUitOpen 12:21830002e12d 100
MikamiUitOpen 12:21830002e12d 101 Clear();
MikamiUitOpen 8:854c244a7863 102 }
MikamiUitOpen 8:854c244a7863 103
MikamiUitOpen 0:f177013dc4fc 104 // Send command and data
MikamiUitOpen 3:414f98234c94 105 bool Aqm1602::LcdTx(uint8_t cmdData, uint8_t data)
MikamiUitOpen 0:f177013dc4fc 106 {
MikamiUitOpen 11:f650f1e809a9 107 /*
MikamiUitOpen 11:f650f1e809a9 108 // mbed Rev.130 以降では割り込み処理でうまく動作しない場合がある
MikamiUitOpen 0:f177013dc4fc 109 char tx[2] = { cmdData, data };
MikamiUitOpen 3:414f98234c94 110 int rt = i2c_.write(LCD_ADDRESS_, tx, 2);
MikamiUitOpen 7:5375acc9a74a 111 wait_us(30);
MikamiUitOpen 3:414f98234c94 112 return (rt == 0) ? true : false;
MikamiUitOpen 11:f650f1e809a9 113 */
MikamiUitOpen 12:21830002e12d 114 // 以下は Rev.12 で変更したもの
MikamiUitOpen 11:f650f1e809a9 115 i2c_.start();
MikamiUitOpen 12:21830002e12d 116 if (1 != i2c_.write(LCD_ADDRESS_)) return false;
MikamiUitOpen 12:21830002e12d 117 if (1 != i2c_.write(cmdData)) return false;
MikamiUitOpen 12:21830002e12d 118 if (1 != i2c_.write(data)) return false;
MikamiUitOpen 11:f650f1e809a9 119 i2c_.stop();
MikamiUitOpen 11:f650f1e809a9 120 wait_us(30);
MikamiUitOpen 12:21830002e12d 121 return true;
MikamiUitOpen 0:f177013dc4fc 122 }
MikamiUitOpen 0:f177013dc4fc 123 }