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:
Sat Jan 17 09:59:57 2015 +0000
Revision:
7:fd23d2941f36
Parent:
6:b911485a6f4d
Child:
8:6f28524bcb29
8

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 7:fd23d2941f36 4 // 2015/01/17, 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 0:d8048b36d982 68 if (!Start()) return false;
MikamiUitOpen 7:fd23d2941f36 69
MikamiUitOpen 6:b911485a6f4d 70 // defines kind of "data" in next statement
MikamiUitOpen 0:d8048b36d982 71 TxDR(cmdData);
MikamiUitOpen 0:d8048b36d982 72 TxDR(data);
MikamiUitOpen 0:d8048b36d982 73 wait_us(500); // indispensable
MikamiUitOpen 7:fd23d2941f36 74
MikamiUitOpen 0:d8048b36d982 75 // Generate stop condition
MikamiUitOpen 7:fd23d2941f36 76 i2c_.stop();
MikamiUitOpen 7:fd23d2941f36 77
MikamiUitOpen 0:d8048b36d982 78 return true;
MikamiUitOpen 0:d8048b36d982 79 }
MikamiUitOpen 0:d8048b36d982 80
MikamiUitOpen 0:d8048b36d982 81 // Preparation for send of command and data
MikamiUitOpen 0:d8048b36d982 82 bool Acm1602Ni::Start()
MikamiUitOpen 0:d8048b36d982 83 {
MikamiUitOpen 0:d8048b36d982 84 const uint8_t LENGTH = 10;
MikamiUitOpen 0:d8048b36d982 85
MikamiUitOpen 0:d8048b36d982 86 // Generate start condition
MikamiUitOpen 7:fd23d2941f36 87 i2c_.start();
MikamiUitOpen 0:d8048b36d982 88
MikamiUitOpen 0:d8048b36d982 89 // Send slave address
MikamiUitOpen 0:d8048b36d982 90 TxDR(LCD_ADDRESS_);
MikamiUitOpen 0:d8048b36d982 91 // Confirm on transmit mode
MikamiUitOpen 0:d8048b36d982 92 for (int n=0; n<LENGTH; 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 1:7c6b2df4e60b 97 | I2C_SR2_TRA)) break;
MikamiUitOpen 0:d8048b36d982 98 if (n == LENGTH-1) return false;
MikamiUitOpen 0:d8048b36d982 99 }
MikamiUitOpen 0:d8048b36d982 100
MikamiUitOpen 0:d8048b36d982 101 return true;
MikamiUitOpen 0:d8048b36d982 102 }
MikamiUitOpen 0:d8048b36d982 103 }