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:
Fri Apr 01 04:28:15 2016 +0000
Revision:
13:68b93c16fd1d
Parent:
12:b7c761c179c9
14

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:d8048b36d982 1 //-------------------------------------------------------
MikamiUitOpen 1:7c6b2df4e60b 2 // Class for LCD, ACM1602Ni
MikamiUitOpen 0:d8048b36d982 3 //
MikamiUitOpen 13:68b93c16fd1d 4 // 2016/04/01, Copyright (c) 2016 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 13:68b93c16fd1d 24
MikamiUitOpen 10:49e6a8f8fe4f 25 if (clock != 100000) i2c_.frequency(clock);
MikamiUitOpen 10:49e6a8f8fe4f 26
MikamiUitOpen 10:49e6a8f8fe4f 27 wait_ms(40);
MikamiUitOpen 0:d8048b36d982 28 connected_ = Clear(); // Clear display
MikamiUitOpen 1:7c6b2df4e60b 29 if (!connected_)
MikamiUitOpen 1:7c6b2df4e60b 30 {
MikamiUitOpen 10:49e6a8f8fe4f 31 fprintf(stderr, "\r\nLCD ACM1602NI not connected\r\n");
MikamiUitOpen 1:7c6b2df4e60b 32 return;
MikamiUitOpen 1:7c6b2df4e60b 33 }
MikamiUitOpen 0:d8048b36d982 34
MikamiUitOpen 0:d8048b36d982 35 WriteCmd(0x38); // data length:8-bit, 2-line, 5×8 dots
MikamiUitOpen 0:d8048b36d982 36 WriteCmd(0x0C | (cursor << 1) | blink);
MikamiUitOpen 0:d8048b36d982 37 WriteCmd(0x06); // cursor direction: rightward
MikamiUitOpen 0:d8048b36d982 38 }
MikamiUitOpen 0:d8048b36d982 39
MikamiUitOpen 0:d8048b36d982 40 // All clear
MikamiUitOpen 0:d8048b36d982 41 bool Acm1602Ni::Clear()
MikamiUitOpen 0:d8048b36d982 42 {
MikamiUitOpen 0:d8048b36d982 43 bool ok = WriteCmd(0x01);
MikamiUitOpen 0:d8048b36d982 44 wait_ms(50);
MikamiUitOpen 0:d8048b36d982 45 return ok;
MikamiUitOpen 0:d8048b36d982 46 }
MikamiUitOpen 0:d8048b36d982 47
MikamiUitOpen 2:0936ba74019a 48 // Write string
MikamiUitOpen 1:7c6b2df4e60b 49 void Acm1602Ni::WriteString(const char str[])
MikamiUitOpen 1:7c6b2df4e60b 50 {
MikamiUitOpen 1:7c6b2df4e60b 51 for (int n=0; n<16; n++)
MikamiUitOpen 1:7c6b2df4e60b 52 if (str[n] == 0) break;
MikamiUitOpen 1:7c6b2df4e60b 53 else WriteChar(str[n]);
MikamiUitOpen 1:7c6b2df4e60b 54 }
MikamiUitOpen 1:7c6b2df4e60b 55
MikamiUitOpen 1:7c6b2df4e60b 56 // Write string from specified position
MikamiUitOpen 1:7c6b2df4e60b 57 void Acm1602Ni::WriteStringXY(const char str[],
MikamiUitOpen 6:b911485a6f4d 58 uint8_t x, uint8_t y)
MikamiUitOpen 0:d8048b36d982 59 {
MikamiUitOpen 0:d8048b36d982 60 SetXY(x, y);
MikamiUitOpen 1:7c6b2df4e60b 61 WriteString(str);
MikamiUitOpen 0:d8048b36d982 62 }
MikamiUitOpen 0:d8048b36d982 63
MikamiUitOpen 0:d8048b36d982 64 //---------------------------------------------------
MikamiUitOpen 7:fd23d2941f36 65 // Following member functions: private
MikamiUitOpen 0:d8048b36d982 66
MikamiUitOpen 0:d8048b36d982 67 // Send command and data
MikamiUitOpen 0:d8048b36d982 68 bool Acm1602Ni::LcdTx(uint8_t cmdData, uint8_t data)
MikamiUitOpen 0:d8048b36d982 69 {
MikamiUitOpen 8:6f28524bcb29 70 // Generate start condition
MikamiUitOpen 8:6f28524bcb29 71 i2c_.start();
MikamiUitOpen 8:6f28524bcb29 72
MikamiUitOpen 8:6f28524bcb29 73 // Send slave address
MikamiUitOpen 8:6f28524bcb29 74 TxDR(LCD_ADDRESS_);
MikamiUitOpen 8:6f28524bcb29 75
MikamiUitOpen 8:6f28524bcb29 76 if (!IsTxMode()) return false;
MikamiUitOpen 7:fd23d2941f36 77
MikamiUitOpen 8:6f28524bcb29 78 // Define kind of "data" in next statement
MikamiUitOpen 0:d8048b36d982 79 TxDR(cmdData);
MikamiUitOpen 0:d8048b36d982 80 TxDR(data);
MikamiUitOpen 0:d8048b36d982 81 wait_us(500); // indispensable
MikamiUitOpen 7:fd23d2941f36 82
MikamiUitOpen 0:d8048b36d982 83 // Generate stop condition
MikamiUitOpen 7:fd23d2941f36 84 i2c_.stop();
MikamiUitOpen 7:fd23d2941f36 85
MikamiUitOpen 0:d8048b36d982 86 return true;
MikamiUitOpen 0:d8048b36d982 87 }
MikamiUitOpen 0:d8048b36d982 88
MikamiUitOpen 8:6f28524bcb29 89 // Check on transmitter mode
MikamiUitOpen 8:6f28524bcb29 90 bool Acm1602Ni::IsTxMode()
MikamiUitOpen 0:d8048b36d982 91 {
MikamiUitOpen 8:6f28524bcb29 92 for (int n=0; n<10; n++)
MikamiUitOpen 0:d8048b36d982 93 {
MikamiUitOpen 7:fd23d2941f36 94 wait_us(10);
MikamiUitOpen 1:7c6b2df4e60b 95 if (CheckSR12(I2C_SR1_TXE | I2C_SR1_ADDR,
MikamiUitOpen 1:7c6b2df4e60b 96 I2C_SR2_MSL | I2C_SR2_BUSY
MikamiUitOpen 8:6f28524bcb29 97 | I2C_SR2_TRA))
MikamiUitOpen 8:6f28524bcb29 98 return true;
MikamiUitOpen 0:d8048b36d982 99 }
MikamiUitOpen 8:6f28524bcb29 100
MikamiUitOpen 8:6f28524bcb29 101 return false;
MikamiUitOpen 0:d8048b36d982 102 }
MikamiUitOpen 0:d8048b36d982 103 }