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@0:d8048b36d982, 2014-10-20 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Mon Oct 20 03:01:24 2014 +0000
- Revision:
- 0:d8048b36d982
- Child:
- 1:7c6b2df4e60b
1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:d8048b36d982 | 1 | //------------------------------------------------------- |
MikamiUitOpen | 0:d8048b36d982 | 2 | // Class for LCD, ACM1602NI |
MikamiUitOpen | 0:d8048b36d982 | 3 | // |
MikamiUitOpen | 0:d8048b36d982 | 4 | // 2014/09/13, Copyright (c) 2014 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 | 0:d8048b36d982 | 26 | if (!connected_) return; |
MikamiUitOpen | 0:d8048b36d982 | 27 | |
MikamiUitOpen | 0:d8048b36d982 | 28 | if (clock != 100000) i2c_.frequency(clock); |
MikamiUitOpen | 0:d8048b36d982 | 29 | |
MikamiUitOpen | 0:d8048b36d982 | 30 | WriteCmd(0x38); // data length:8-bit, 2-line, 5×8 dots |
MikamiUitOpen | 0:d8048b36d982 | 31 | WriteCmd(0x0C | (cursor << 1) | blink); |
MikamiUitOpen | 0:d8048b36d982 | 32 | WriteCmd(0x06); // cursor direction: rightward |
MikamiUitOpen | 0:d8048b36d982 | 33 | } |
MikamiUitOpen | 0:d8048b36d982 | 34 | |
MikamiUitOpen | 0:d8048b36d982 | 35 | // All clear |
MikamiUitOpen | 0:d8048b36d982 | 36 | bool Acm1602Ni::Clear() |
MikamiUitOpen | 0:d8048b36d982 | 37 | { |
MikamiUitOpen | 0:d8048b36d982 | 38 | bool ok = WriteCmd(0x01); |
MikamiUitOpen | 0:d8048b36d982 | 39 | wait_ms(50); |
MikamiUitOpen | 0:d8048b36d982 | 40 | return ok; |
MikamiUitOpen | 0:d8048b36d982 | 41 | } |
MikamiUitOpen | 0:d8048b36d982 | 42 | |
MikamiUitOpen | 0:d8048b36d982 | 43 | // Write string from specified position |
MikamiUitOpen | 0:d8048b36d982 | 44 | void Acm1602Ni::WriteString(const char str[], |
MikamiUitOpen | 0:d8048b36d982 | 45 | uint8_t x, uint8_t y) |
MikamiUitOpen | 0:d8048b36d982 | 46 | { |
MikamiUitOpen | 0:d8048b36d982 | 47 | SetXY(x, y); |
MikamiUitOpen | 0:d8048b36d982 | 48 | for (int n=0; n<16; n++) |
MikamiUitOpen | 0:d8048b36d982 | 49 | if (str[n] == 0) break; |
MikamiUitOpen | 0:d8048b36d982 | 50 | else WriteChar(str[n]); |
MikamiUitOpen | 0:d8048b36d982 | 51 | } |
MikamiUitOpen | 0:d8048b36d982 | 52 | |
MikamiUitOpen | 0:d8048b36d982 | 53 | //--------------------------------------------------- |
MikamiUitOpen | 0:d8048b36d982 | 54 | // Following functions: private |
MikamiUitOpen | 0:d8048b36d982 | 55 | |
MikamiUitOpen | 0:d8048b36d982 | 56 | // Send command and data |
MikamiUitOpen | 0:d8048b36d982 | 57 | bool Acm1602Ni::LcdTx(uint8_t cmdData, uint8_t data) |
MikamiUitOpen | 0:d8048b36d982 | 58 | { |
MikamiUitOpen | 0:d8048b36d982 | 59 | if (!Start()) return false; |
MikamiUitOpen | 0:d8048b36d982 | 60 | // defines king of "data" in next statement |
MikamiUitOpen | 0:d8048b36d982 | 61 | TxDR(cmdData); |
MikamiUitOpen | 0:d8048b36d982 | 62 | TxDR(data); |
MikamiUitOpen | 0:d8048b36d982 | 63 | wait_us(500); // indispensable |
MikamiUitOpen | 0:d8048b36d982 | 64 | // Generate stop condition |
MikamiUitOpen | 0:d8048b36d982 | 65 | SetCR1(I2C_CR1_STOP); |
MikamiUitOpen | 0:d8048b36d982 | 66 | return true; |
MikamiUitOpen | 0:d8048b36d982 | 67 | } |
MikamiUitOpen | 0:d8048b36d982 | 68 | |
MikamiUitOpen | 0:d8048b36d982 | 69 | // Preparation for send of command and data |
MikamiUitOpen | 0:d8048b36d982 | 70 | bool Acm1602Ni::Start() |
MikamiUitOpen | 0:d8048b36d982 | 71 | { |
MikamiUitOpen | 0:d8048b36d982 | 72 | const uint8_t WAIT = 20; |
MikamiUitOpen | 0:d8048b36d982 | 73 | const uint8_t LENGTH = 10; |
MikamiUitOpen | 0:d8048b36d982 | 74 | |
MikamiUitOpen | 0:d8048b36d982 | 75 | // wait for I2C not busy |
MikamiUitOpen | 0:d8048b36d982 | 76 | for (int n=0; n<LENGTH; n++) |
MikamiUitOpen | 0:d8048b36d982 | 77 | { |
MikamiUitOpen | 0:d8048b36d982 | 78 | wait_us(WAIT); |
MikamiUitOpen | 0:d8048b36d982 | 79 | if (!Check(myI2c_->SR2, I2C_SR2_BUSY)) break; |
MikamiUitOpen | 0:d8048b36d982 | 80 | if (n == LENGTH-1) return false; |
MikamiUitOpen | 0:d8048b36d982 | 81 | } |
MikamiUitOpen | 0:d8048b36d982 | 82 | |
MikamiUitOpen | 0:d8048b36d982 | 83 | // Generate start condition |
MikamiUitOpen | 0:d8048b36d982 | 84 | SetCR1(I2C_CR1_START); |
MikamiUitOpen | 0:d8048b36d982 | 85 | // Confirm start condition and master mode |
MikamiUitOpen | 0:d8048b36d982 | 86 | for (int n=0; n<LENGTH; n++) |
MikamiUitOpen | 0:d8048b36d982 | 87 | { |
MikamiUitOpen | 0:d8048b36d982 | 88 | wait_us(WAIT); |
MikamiUitOpen | 0:d8048b36d982 | 89 | if (Check(myI2c_->SR1, I2C_SR1_SB) && |
MikamiUitOpen | 0:d8048b36d982 | 90 | Check(myI2c_->SR2, I2C_SR2_MSL | |
MikamiUitOpen | 0:d8048b36d982 | 91 | I2C_SR2_BUSY)) break; |
MikamiUitOpen | 0:d8048b36d982 | 92 | if (n == LENGTH-1) return false; |
MikamiUitOpen | 0:d8048b36d982 | 93 | } |
MikamiUitOpen | 0:d8048b36d982 | 94 | |
MikamiUitOpen | 0:d8048b36d982 | 95 | // Send slave address |
MikamiUitOpen | 0:d8048b36d982 | 96 | TxDR(LCD_ADDRESS_); |
MikamiUitOpen | 0:d8048b36d982 | 97 | // Confirm on transmit mode |
MikamiUitOpen | 0:d8048b36d982 | 98 | for (int n=0; n<LENGTH; n++) |
MikamiUitOpen | 0:d8048b36d982 | 99 | { |
MikamiUitOpen | 0:d8048b36d982 | 100 | wait_us(WAIT); |
MikamiUitOpen | 0:d8048b36d982 | 101 | if (Check(myI2c_->SR1, I2C_SR1_TXE | |
MikamiUitOpen | 0:d8048b36d982 | 102 | I2C_SR1_ADDR) && |
MikamiUitOpen | 0:d8048b36d982 | 103 | Check(myI2c_->SR2, I2C_SR2_MSL | |
MikamiUitOpen | 0:d8048b36d982 | 104 | I2C_SR2_BUSY | |
MikamiUitOpen | 0:d8048b36d982 | 105 | I2C_SR2_TRA)) break; |
MikamiUitOpen | 0:d8048b36d982 | 106 | if (n == LENGTH-1) return false; |
MikamiUitOpen | 0:d8048b36d982 | 107 | } |
MikamiUitOpen | 0:d8048b36d982 | 108 | |
MikamiUitOpen | 0:d8048b36d982 | 109 | return true; |
MikamiUitOpen | 0:d8048b36d982 | 110 | } |
MikamiUitOpen | 0:d8048b36d982 | 111 | } |