Class library for LCD character display ACM1602NI using I2C on Nucleo. Nucleo 用 I2C 接続の LCD キャラクタ・ディスプレー ACM1602Ni 用のクラス・ライブラリ.
Dependents: UIT2_VariableFIR_LPFHPF UIT2_VariableFIR_LPF UIT2_InputSW_LCD ADDA_Prototype_PollingSW ... more
ACM1602NI.cpp@8:6f28524bcb29, 2015-03-26 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Thu Mar 26 01:34:27 2015 +0000
- Revision:
- 8:6f28524bcb29
- Parent:
- 7:fd23d2941f36
- Child:
- 10:49e6a8f8fe4f
- Child:
- 11:bbf31054cfd8
9
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:d8048b36d982 | 1 | //------------------------------------------------------- |
MikamiUitOpen | 1:7c6b2df4e60b | 2 | // Class for LCD, ACM1602Ni |
MikamiUitOpen | 0:d8048b36d982 | 3 | // |
MikamiUitOpen | 8:6f28524bcb29 | 4 | // 2015/03/26, Copyright (c) 2015 MIKAMI, Naoki |
MikamiUitOpen | 0:d8048b36d982 | 5 | //------------------------------------------------------- |
MikamiUitOpen | 0:d8048b36d982 | 6 | |
MikamiUitOpen | 0:d8048b36d982 | 7 | #include "ACM1602NI.hpp" |
MikamiUitOpen | 0:d8048b36d982 | 8 | |
MikamiUitOpen | 0:d8048b36d982 | 9 | namespace Mikami |
MikamiUitOpen | 0:d8048b36d982 | 10 | { |
MikamiUitOpen | 0:d8048b36d982 | 11 | // Constructor |
MikamiUitOpen | 0:d8048b36d982 | 12 | Acm1602Ni::Acm1602Ni(PinName sda, PinName scl, uint32_t clock, |
MikamiUitOpen | 0:d8048b36d982 | 13 | bool cursor, bool blink) |
MikamiUitOpen | 0:d8048b36d982 | 14 | : i2c_(sda, scl), myI2c_((I2C_TypeDef*)NULL) |
MikamiUitOpen | 0:d8048b36d982 | 15 | { |
MikamiUitOpen | 0:d8048b36d982 | 16 | if ( ((sda == PB_9) || (sda == PB_7)) && |
MikamiUitOpen | 0:d8048b36d982 | 17 | ((scl == PB_8) || (scl == PB_6)) ) |
MikamiUitOpen | 0:d8048b36d982 | 18 | myI2c_ = (I2C_TypeDef*)I2C_1; // I2C1 will be used |
MikamiUitOpen | 0:d8048b36d982 | 19 | if ( (sda == PB_3) && (scl == PB_10) ) |
MikamiUitOpen | 0:d8048b36d982 | 20 | myI2c_ = (I2C_TypeDef*)I2C_2; // I2C2 will be used |
MikamiUitOpen | 0:d8048b36d982 | 21 | if ( ((sda == PC_9) || (sda == PB_4)) && |
MikamiUitOpen | 0:d8048b36d982 | 22 | (scl == PA_8) ) |
MikamiUitOpen | 0:d8048b36d982 | 23 | myI2c_ = (I2C_TypeDef*)I2C_3; // I2C3 will be used |
MikamiUitOpen | 0:d8048b36d982 | 24 | |
MikamiUitOpen | 0:d8048b36d982 | 25 | connected_ = Clear(); // Clear display |
MikamiUitOpen | 1:7c6b2df4e60b | 26 | if (!connected_) |
MikamiUitOpen | 1:7c6b2df4e60b | 27 | { |
MikamiUitOpen | 1:7c6b2df4e60b | 28 | fprintf(stderr, "\r\nLCD device not connected\r\n"); |
MikamiUitOpen | 1:7c6b2df4e60b | 29 | return; |
MikamiUitOpen | 1:7c6b2df4e60b | 30 | } |
MikamiUitOpen | 0:d8048b36d982 | 31 | if (clock != 100000) i2c_.frequency(clock); |
MikamiUitOpen | 0:d8048b36d982 | 32 | |
MikamiUitOpen | 0:d8048b36d982 | 33 | WriteCmd(0x38); // data length:8-bit, 2-line, 5×8 dots |
MikamiUitOpen | 0:d8048b36d982 | 34 | WriteCmd(0x0C | (cursor << 1) | blink); |
MikamiUitOpen | 0:d8048b36d982 | 35 | WriteCmd(0x06); // cursor direction: rightward |
MikamiUitOpen | 0:d8048b36d982 | 36 | } |
MikamiUitOpen | 0:d8048b36d982 | 37 | |
MikamiUitOpen | 0:d8048b36d982 | 38 | // All clear |
MikamiUitOpen | 0:d8048b36d982 | 39 | bool Acm1602Ni::Clear() |
MikamiUitOpen | 0:d8048b36d982 | 40 | { |
MikamiUitOpen | 0:d8048b36d982 | 41 | bool ok = WriteCmd(0x01); |
MikamiUitOpen | 0:d8048b36d982 | 42 | wait_ms(50); |
MikamiUitOpen | 0:d8048b36d982 | 43 | return ok; |
MikamiUitOpen | 0:d8048b36d982 | 44 | } |
MikamiUitOpen | 0:d8048b36d982 | 45 | |
MikamiUitOpen | 2:0936ba74019a | 46 | // Write string |
MikamiUitOpen | 1:7c6b2df4e60b | 47 | void Acm1602Ni::WriteString(const char str[]) |
MikamiUitOpen | 1:7c6b2df4e60b | 48 | { |
MikamiUitOpen | 1:7c6b2df4e60b | 49 | for (int n=0; n<16; n++) |
MikamiUitOpen | 1:7c6b2df4e60b | 50 | if (str[n] == 0) break; |
MikamiUitOpen | 1:7c6b2df4e60b | 51 | else WriteChar(str[n]); |
MikamiUitOpen | 1:7c6b2df4e60b | 52 | } |
MikamiUitOpen | 1:7c6b2df4e60b | 53 | |
MikamiUitOpen | 1:7c6b2df4e60b | 54 | // Write string from specified position |
MikamiUitOpen | 1:7c6b2df4e60b | 55 | void Acm1602Ni::WriteStringXY(const char str[], |
MikamiUitOpen | 6:b911485a6f4d | 56 | uint8_t x, uint8_t y) |
MikamiUitOpen | 0:d8048b36d982 | 57 | { |
MikamiUitOpen | 0:d8048b36d982 | 58 | SetXY(x, y); |
MikamiUitOpen | 1:7c6b2df4e60b | 59 | WriteString(str); |
MikamiUitOpen | 0:d8048b36d982 | 60 | } |
MikamiUitOpen | 0:d8048b36d982 | 61 | |
MikamiUitOpen | 0:d8048b36d982 | 62 | //--------------------------------------------------- |
MikamiUitOpen | 7:fd23d2941f36 | 63 | // Following member functions: private |
MikamiUitOpen | 0:d8048b36d982 | 64 | |
MikamiUitOpen | 0:d8048b36d982 | 65 | // Send command and data |
MikamiUitOpen | 0:d8048b36d982 | 66 | bool Acm1602Ni::LcdTx(uint8_t cmdData, uint8_t data) |
MikamiUitOpen | 0:d8048b36d982 | 67 | { |
MikamiUitOpen | 8:6f28524bcb29 | 68 | // Generate start condition |
MikamiUitOpen | 8:6f28524bcb29 | 69 | i2c_.start(); |
MikamiUitOpen | 8:6f28524bcb29 | 70 | |
MikamiUitOpen | 8:6f28524bcb29 | 71 | // Send slave address |
MikamiUitOpen | 8:6f28524bcb29 | 72 | TxDR(LCD_ADDRESS_); |
MikamiUitOpen | 8:6f28524bcb29 | 73 | |
MikamiUitOpen | 8:6f28524bcb29 | 74 | if (!IsTxMode()) return false; |
MikamiUitOpen | 7:fd23d2941f36 | 75 | |
MikamiUitOpen | 8:6f28524bcb29 | 76 | // Define kind of "data" in next statement |
MikamiUitOpen | 0:d8048b36d982 | 77 | TxDR(cmdData); |
MikamiUitOpen | 0:d8048b36d982 | 78 | TxDR(data); |
MikamiUitOpen | 0:d8048b36d982 | 79 | wait_us(500); // indispensable |
MikamiUitOpen | 7:fd23d2941f36 | 80 | |
MikamiUitOpen | 0:d8048b36d982 | 81 | // Generate stop condition |
MikamiUitOpen | 7:fd23d2941f36 | 82 | i2c_.stop(); |
MikamiUitOpen | 7:fd23d2941f36 | 83 | |
MikamiUitOpen | 0:d8048b36d982 | 84 | return true; |
MikamiUitOpen | 0:d8048b36d982 | 85 | } |
MikamiUitOpen | 0:d8048b36d982 | 86 | |
MikamiUitOpen | 8:6f28524bcb29 | 87 | // Check on transmitter mode |
MikamiUitOpen | 8:6f28524bcb29 | 88 | bool Acm1602Ni::IsTxMode() |
MikamiUitOpen | 0:d8048b36d982 | 89 | { |
MikamiUitOpen | 8:6f28524bcb29 | 90 | for (int n=0; n<10; n++) |
MikamiUitOpen | 0:d8048b36d982 | 91 | { |
MikamiUitOpen | 7:fd23d2941f36 | 92 | wait_us(10); |
MikamiUitOpen | 1:7c6b2df4e60b | 93 | if (CheckSR12(I2C_SR1_TXE | I2C_SR1_ADDR, |
MikamiUitOpen | 1:7c6b2df4e60b | 94 | I2C_SR2_MSL | I2C_SR2_BUSY |
MikamiUitOpen | 8:6f28524bcb29 | 95 | | I2C_SR2_TRA)) |
MikamiUitOpen | 8:6f28524bcb29 | 96 | return true; |
MikamiUitOpen | 0:d8048b36d982 | 97 | } |
MikamiUitOpen | 8:6f28524bcb29 | 98 | |
MikamiUitOpen | 8:6f28524bcb29 | 99 | return false; |
MikamiUitOpen | 0:d8048b36d982 | 100 | } |
MikamiUitOpen | 0:d8048b36d982 | 101 | } |