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:
Thu Nov 13 04:49:38 2014 +0000
Revision:
2:0936ba74019a
Parent:
1:7c6b2df4e60b
Child:
5:b4f73f5851fb
3

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 2:0936ba74019a 4 // 2014/11/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 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 0:d8048b36d982 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 0:d8048b36d982 63 // Following 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 0:d8048b36d982 68 if (!Start()) return false;
MikamiUitOpen 0:d8048b36d982 69 // defines king of "data" in next statement
MikamiUitOpen 0:d8048b36d982 70 TxDR(cmdData);
MikamiUitOpen 0:d8048b36d982 71 TxDR(data);
MikamiUitOpen 0:d8048b36d982 72 wait_us(500); // indispensable
MikamiUitOpen 0:d8048b36d982 73 // Generate stop condition
MikamiUitOpen 0:d8048b36d982 74 SetCR1(I2C_CR1_STOP);
MikamiUitOpen 0:d8048b36d982 75 return true;
MikamiUitOpen 0:d8048b36d982 76 }
MikamiUitOpen 0:d8048b36d982 77
MikamiUitOpen 0:d8048b36d982 78 // Preparation for send of command and data
MikamiUitOpen 0:d8048b36d982 79 bool Acm1602Ni::Start()
MikamiUitOpen 0:d8048b36d982 80 {
MikamiUitOpen 0:d8048b36d982 81 const uint8_t WAIT = 20;
MikamiUitOpen 0:d8048b36d982 82 const uint8_t LENGTH = 10;
MikamiUitOpen 0:d8048b36d982 83
MikamiUitOpen 0:d8048b36d982 84 // wait for I2C not busy
MikamiUitOpen 0:d8048b36d982 85 for (int n=0; n<LENGTH; n++)
MikamiUitOpen 0:d8048b36d982 86 {
MikamiUitOpen 0:d8048b36d982 87 wait_us(WAIT);
MikamiUitOpen 1:7c6b2df4e60b 88 if (!CheckSR2(I2C_SR2_BUSY)) break;
MikamiUitOpen 0:d8048b36d982 89 if (n == LENGTH-1) return false;
MikamiUitOpen 0:d8048b36d982 90 }
MikamiUitOpen 0:d8048b36d982 91
MikamiUitOpen 0:d8048b36d982 92 // Generate start condition
MikamiUitOpen 0:d8048b36d982 93 SetCR1(I2C_CR1_START);
MikamiUitOpen 0:d8048b36d982 94 // Confirm start condition and master mode
MikamiUitOpen 0:d8048b36d982 95 for (int n=0; n<LENGTH; n++)
MikamiUitOpen 0:d8048b36d982 96 {
MikamiUitOpen 1:7c6b2df4e60b 97 wait_us(WAIT);
MikamiUitOpen 1:7c6b2df4e60b 98 if (CheckSR12(I2C_SR1_SB, I2C_SR2_MSL |
MikamiUitOpen 1:7c6b2df4e60b 99 I2C_SR2_BUSY)) break;
MikamiUitOpen 0:d8048b36d982 100 if (n == LENGTH-1) return false;
MikamiUitOpen 0:d8048b36d982 101 }
MikamiUitOpen 0:d8048b36d982 102
MikamiUitOpen 0:d8048b36d982 103 // Send slave address
MikamiUitOpen 0:d8048b36d982 104 TxDR(LCD_ADDRESS_);
MikamiUitOpen 0:d8048b36d982 105 // Confirm on transmit mode
MikamiUitOpen 0:d8048b36d982 106 for (int n=0; n<LENGTH; n++)
MikamiUitOpen 0:d8048b36d982 107 {
MikamiUitOpen 0:d8048b36d982 108 wait_us(WAIT);
MikamiUitOpen 1:7c6b2df4e60b 109 if (CheckSR12(I2C_SR1_TXE | I2C_SR1_ADDR,
MikamiUitOpen 1:7c6b2df4e60b 110 I2C_SR2_MSL | I2C_SR2_BUSY
MikamiUitOpen 1:7c6b2df4e60b 111 | I2C_SR2_TRA)) break;
MikamiUitOpen 0:d8048b36d982 112 if (n == LENGTH-1) return false;
MikamiUitOpen 0:d8048b36d982 113 }
MikamiUitOpen 0:d8048b36d982 114
MikamiUitOpen 0:d8048b36d982 115 return true;
MikamiUitOpen 0:d8048b36d982 116 }
MikamiUitOpen 0:d8048b36d982 117 }
MikamiUitOpen 1:7c6b2df4e60b 118
MikamiUitOpen 2:0936ba74019a 119