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

Committer:
MikamiUitOpen
Date:
Mon Oct 20 03:01:24 2014 +0000
Revision:
0:d8048b36d982
Child:
1:7c6b2df4e60b
1

Who changed what in which revision?

UserRevisionLine numberNew 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 }