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 Jul 22 01:56:41 2017 +0000
Revision:
11:f650f1e809a9
Parent:
10:6e6c0f24e81f
Child:
12:21830002e12d
12, mbed Rev.130 ???????????????????????DISCO-F746 ?????????????????

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 10:6e6c0f24e81f 3 // Use mbed Rev.129 for Nucleo-F401/446/746 and DISCO-F746
MikamiUitOpen 11:f650f1e809a9 4 // mbed Rev.130 以降で起こる,割り込み処理での動作不良を修正
MikamiUitOpen 11:f650f1e809a9 5 // DISCO-F746 では動作不良は修正できないようだ
MikamiUitOpen 0:f177013dc4fc 6 //
MikamiUitOpen 11:f650f1e809a9 7 // 2017/07/21, Copyright (c) 2016 MIKAMI, Naoki
MikamiUitOpen 10:6e6c0f24e81f 8 //---------------------------------------------------------------
MikamiUitOpen 0:f177013dc4fc 9
MikamiUitOpen 0:f177013dc4fc 10 #include "AQM1602.hpp"
MikamiUitOpen 0:f177013dc4fc 11
MikamiUitOpen 0:f177013dc4fc 12 namespace Mikami
MikamiUitOpen 0:f177013dc4fc 13 {
MikamiUitOpen 0:f177013dc4fc 14 // Constructor
MikamiUitOpen 0:f177013dc4fc 15 Aqm1602::Aqm1602(PinName sda, PinName scl, uint32_t clock,
MikamiUitOpen 0:f177013dc4fc 16 bool cursor, bool blink)
MikamiUitOpen 8:854c244a7863 17 : i2cPtr_(new I2C(sda, scl)), i2c_(*i2cPtr_)
MikamiUitOpen 8:854c244a7863 18 { Init(clock, cursor, blink); }
MikamiUitOpen 0:f177013dc4fc 19
MikamiUitOpen 8:854c244a7863 20 Aqm1602::Aqm1602(I2C &i2c, uint32_t clock,
MikamiUitOpen 8:854c244a7863 21 bool cursor, bool blink)
MikamiUitOpen 8:854c244a7863 22 : i2cPtr_(NULL), i2c_(i2c)
MikamiUitOpen 8:854c244a7863 23 { Init(clock, cursor, blink); }
MikamiUitOpen 0:f177013dc4fc 24
MikamiUitOpen 0:f177013dc4fc 25 // All clear
MikamiUitOpen 8:854c244a7863 26 bool Aqm1602::Clear()
MikamiUitOpen 0:f177013dc4fc 27 {
MikamiUitOpen 8:854c244a7863 28 bool ok = WriteCmd(0x01);
MikamiUitOpen 8:854c244a7863 29 wait_ms(50);
MikamiUitOpen 8:854c244a7863 30 return ok;
MikamiUitOpen 0:f177013dc4fc 31 }
MikamiUitOpen 0:f177013dc4fc 32
MikamiUitOpen 0:f177013dc4fc 33 // Write string
MikamiUitOpen 0:f177013dc4fc 34 void Aqm1602::WriteString(const char str[])
MikamiUitOpen 0:f177013dc4fc 35 {
MikamiUitOpen 0:f177013dc4fc 36 for (int n=0; n<N_CHR; n++)
MikamiUitOpen 0:f177013dc4fc 37 if (str[n] == 0) break;
MikamiUitOpen 0:f177013dc4fc 38 else WriteChar(str[n]);
MikamiUitOpen 0:f177013dc4fc 39 }
MikamiUitOpen 0:f177013dc4fc 40
MikamiUitOpen 0:f177013dc4fc 41 // Write string from specified position
MikamiUitOpen 0:f177013dc4fc 42 void Aqm1602::WriteStringXY(const char str[],
MikamiUitOpen 9:74a845df6e7a 43 uint8_t x, uint8_t y)
MikamiUitOpen 0:f177013dc4fc 44 {
MikamiUitOpen 0:f177013dc4fc 45 SetXY(x, y);
MikamiUitOpen 0:f177013dc4fc 46 WriteString(str);
MikamiUitOpen 0:f177013dc4fc 47 }
MikamiUitOpen 9:74a845df6e7a 48
MikamiUitOpen 0:f177013dc4fc 49 // Clear of specified line
MikamiUitOpen 0:f177013dc4fc 50 void Aqm1602::ClearLine(uint8_t line)
MikamiUitOpen 0:f177013dc4fc 51 {
MikamiUitOpen 0:f177013dc4fc 52 SetXY(0, line);
MikamiUitOpen 0:f177013dc4fc 53 for (int n=0; n<N_CHR; n++)
MikamiUitOpen 0:f177013dc4fc 54 WriteString(" ");
MikamiUitOpen 0:f177013dc4fc 55 }
MikamiUitOpen 0:f177013dc4fc 56
MikamiUitOpen 0:f177013dc4fc 57 // Set contrast
MikamiUitOpen 0:f177013dc4fc 58 void Aqm1602::SetContrast(uint8_t c)
MikamiUitOpen 0:f177013dc4fc 59 {
MikamiUitOpen 0:f177013dc4fc 60 WriteCmd(0x39);
MikamiUitOpen 0:f177013dc4fc 61 WriteCmd(0x70 | (c & 0x0f)); // Lower 4 bits
MikamiUitOpen 0:f177013dc4fc 62 WriteCmd(0x5C | ((c >> 4) & 0x03)); // Higher 2 bits
MikamiUitOpen 0:f177013dc4fc 63 WriteCmd(0x38);
MikamiUitOpen 0:f177013dc4fc 64 }
MikamiUitOpen 0:f177013dc4fc 65
MikamiUitOpen 0:f177013dc4fc 66 //---------------------------------------------------
MikamiUitOpen 0:f177013dc4fc 67 // Following functions: private
MikamiUitOpen 0:f177013dc4fc 68
MikamiUitOpen 8:854c244a7863 69 // Initialize
MikamiUitOpen 8:854c244a7863 70 void Aqm1602::Init(uint32_t clock, bool cursor, bool blink)
MikamiUitOpen 8:854c244a7863 71 {
MikamiUitOpen 8:854c244a7863 72 if (clock != 100000) i2c_.frequency(clock);
MikamiUitOpen 8:854c244a7863 73
MikamiUitOpen 8:854c244a7863 74 wait_ms(40);
MikamiUitOpen 8:854c244a7863 75 connected_ = Clear(); // Clear display
MikamiUitOpen 8:854c244a7863 76 if (!connected_)
MikamiUitOpen 8:854c244a7863 77 {
MikamiUitOpen 8:854c244a7863 78 fprintf(stderr, "\r\nLCD AQM1602 not connected\r\n");
MikamiUitOpen 8:854c244a7863 79 return;
MikamiUitOpen 8:854c244a7863 80 }
MikamiUitOpen 8:854c244a7863 81
MikamiUitOpen 8:854c244a7863 82 WriteCmd(0x39); // To extended command
MikamiUitOpen 8:854c244a7863 83 WriteCmd(0x14); // Internal OSC frequency
MikamiUitOpen 8:854c244a7863 84 WriteCmd(0x70 | 0x00); // Contrast set
MikamiUitOpen 8:854c244a7863 85 WriteCmd(0x54 | 0x02); // Power/ICON/Contrast control
MikamiUitOpen 8:854c244a7863 86 WriteCmd(0x6C); // Follower control
MikamiUitOpen 8:854c244a7863 87 wait_ms(200);
MikamiUitOpen 8:854c244a7863 88
MikamiUitOpen 8:854c244a7863 89 WriteCmd(0x38); // data length:8-bit, 2-line, 5×8 dots
MikamiUitOpen 8:854c244a7863 90 WriteCmd(0x0C | (cursor << 1) | blink);
MikamiUitOpen 8:854c244a7863 91 }
MikamiUitOpen 8:854c244a7863 92
MikamiUitOpen 0:f177013dc4fc 93 // Send command and data
MikamiUitOpen 3:414f98234c94 94 bool Aqm1602::LcdTx(uint8_t cmdData, uint8_t data)
MikamiUitOpen 0:f177013dc4fc 95 {
MikamiUitOpen 11:f650f1e809a9 96 /*
MikamiUitOpen 11:f650f1e809a9 97 // mbed Rev.130 以降では割り込み処理でうまく動作しない場合がある
MikamiUitOpen 0:f177013dc4fc 98 char tx[2] = { cmdData, data };
MikamiUitOpen 3:414f98234c94 99 int rt = i2c_.write(LCD_ADDRESS_, tx, 2);
MikamiUitOpen 7:5375acc9a74a 100 wait_us(30);
MikamiUitOpen 3:414f98234c94 101 return (rt == 0) ? true : false;
MikamiUitOpen 11:f650f1e809a9 102 */
MikamiUitOpen 11:f650f1e809a9 103 // mbed Rev.130 以降は下記を使う
MikamiUitOpen 11:f650f1e809a9 104 i2c_.start();
MikamiUitOpen 11:f650f1e809a9 105 int ack = i2c_.write(LCD_ADDRESS_);
MikamiUitOpen 11:f650f1e809a9 106 ack &= i2c_.write(cmdData);
MikamiUitOpen 11:f650f1e809a9 107 ack &= i2c_.write(data);
MikamiUitOpen 11:f650f1e809a9 108 i2c_.stop();
MikamiUitOpen 11:f650f1e809a9 109 wait_us(30);
MikamiUitOpen 11:f650f1e809a9 110 return (ack == 1) ? true : false;
MikamiUitOpen 0:f177013dc4fc 111 }
MikamiUitOpen 0:f177013dc4fc 112 }