Library for LCD ACM1602NI connected using I2C on Nucleo F401 is not to be found. Using I2C class offered by mbed, I cannot program for this LCD on Nucleo F401. So I programmed for this LCD to control by direct accsessing registors for I2C in STM32F401RE. Nucleo F401 で使用できる,I2C 接続の LCD ACM1602NI 用のライブラリ.このライブラリでは,I2C クラスのコンストラクタとクロック周波数設定のメンバ関数は使っているが,その他のメンバ関数などは使っていない.その理由は,タイミングの関係だと思うが,I2C クラスのメンバ関数では正常に動くプログラムを,どうしても作れないことによる.しょうがないので,MCU の I2C 関係のレジスタに直接アクセスするようなプログラムを作ったたところ,動くようになった.Nucleo の F401RE 以外については確認していない.動かない場合は,I2C 用のレジスタのアドレスを,使っている MCU に応じて書きかえる必要がある.

Dependents:   ACM1602NI_Nucleo_Demo

Committer:
MikamiUitOpen
Date:
Mon Dec 01 03:47:45 2014 +0000
Revision:
3:b2a573e31cc9
4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 3:b2a573e31cc9 1 //------------------------------------------------------
MikamiUitOpen 3:b2a573e31cc9 2 // Class for LCD, ACM1602NI (Header)
MikamiUitOpen 3:b2a573e31cc9 3 //
MikamiUitOpen 3:b2a573e31cc9 4 // Default pin assignments
MikamiUitOpen 3:b2a573e31cc9 5 // D14 SDA ---- to pin5 of LCD module
MikamiUitOpen 3:b2a573e31cc9 6 // D15 SCL ---- to pin4 of LCD module
MikamiUitOpen 3:b2a573e31cc9 7 //
MikamiUitOpen 3:b2a573e31cc9 8 // Assignment of I2C ports
MikamiUitOpen 3:b2a573e31cc9 9 // SDA SCL
MikamiUitOpen 3:b2a573e31cc9 10 // I2C1 PB_7 or PB_9(D14) PB_6(D10) or PB_8(D15)
MikamiUitOpen 3:b2a573e31cc9 11 // I2C2 PB_3(D3) PB_10(D6)
MikamiUitOpen 3:b2a573e31cc9 12 // I2C3 PB_4(D5) or PC_9 PA_8(D7)
MikamiUitOpen 3:b2a573e31cc9 13 //
MikamiUitOpen 3:b2a573e31cc9 14 // 2014/08/27, Copyright (c) 2014 MIKAMI, Naoki
MikamiUitOpen 3:b2a573e31cc9 15 //------------------------------------------------------
MikamiUitOpen 3:b2a573e31cc9 16
MikamiUitOpen 3:b2a573e31cc9 17 #ifndef ACM1602NI_HPP
MikamiUitOpen 3:b2a573e31cc9 18 #define ACM1602NI_HPP
MikamiUitOpen 3:b2a573e31cc9 19
MikamiUitOpen 3:b2a573e31cc9 20 #include "mbed.h"
MikamiUitOpen 3:b2a573e31cc9 21
MikamiUitOpen 3:b2a573e31cc9 22 namespace Mikami
MikamiUitOpen 3:b2a573e31cc9 23 {
MikamiUitOpen 3:b2a573e31cc9 24 class Acm1602Ni
MikamiUitOpen 3:b2a573e31cc9 25 {
MikamiUitOpen 3:b2a573e31cc9 26 public:
MikamiUitOpen 3:b2a573e31cc9 27 // Constructor
MikamiUitOpen 3:b2a573e31cc9 28 Acm1602Ni(PinName sda = D14, // SDA
MikamiUitOpen 3:b2a573e31cc9 29 PinName scl = D15, // SCL
MikamiUitOpen 3:b2a573e31cc9 30 uint32_t clock = 100000, // clock: 100 kHz
MikamiUitOpen 3:b2a573e31cc9 31 bool cursor = false, // cursor: off
MikamiUitOpen 3:b2a573e31cc9 32 bool blink = false); // blink: off
MikamiUitOpen 3:b2a573e31cc9 33 // Return false if LCD is not connected
MikamiUitOpen 3:b2a573e31cc9 34 bool GetOk() { return connected_; }
MikamiUitOpen 3:b2a573e31cc9 35 // All clear
MikamiUitOpen 3:b2a573e31cc9 36 bool Clear();
MikamiUitOpen 3:b2a573e31cc9 37 // Send command
MikamiUitOpen 3:b2a573e31cc9 38 bool WriteCmd(uint8_t cmd) { return LcdTx(0x00, cmd); }
MikamiUitOpen 3:b2a573e31cc9 39 // Write character
MikamiUitOpen 3:b2a573e31cc9 40 void WriteChar(char data) { LcdTx(0x80, data); }
MikamiUitOpen 3:b2a573e31cc9 41 // Specify display position, x: 0 - 15, y: 0, 1
MikamiUitOpen 3:b2a573e31cc9 42 void SetXY(uint8_t x = 0, uint8_t y = 0) { WriteCmd(x + y*0x40 | 0x80);}
MikamiUitOpen 3:b2a573e31cc9 43 // Write string from specified position
MikamiUitOpen 3:b2a573e31cc9 44 void WriteString(const char str[], uint8_t x = 0, uint8_t y = 0);
MikamiUitOpen 3:b2a573e31cc9 45 // Clear of specified line
MikamiUitOpen 3:b2a573e31cc9 46 void ClearLine(uint8_t line)
MikamiUitOpen 3:b2a573e31cc9 47 { WriteString(" ", 0, line); }
MikamiUitOpen 3:b2a573e31cc9 48
MikamiUitOpen 3:b2a573e31cc9 49 private:
MikamiUitOpen 3:b2a573e31cc9 50 // Slave address of ACM1602NI (0x50)
MikamiUitOpen 3:b2a573e31cc9 51 static const uint8_t LCD_ADDRESS_ = 0x50 << 1; // left-justified 7-bit address
MikamiUitOpen 3:b2a573e31cc9 52
MikamiUitOpen 3:b2a573e31cc9 53 bool connected_; // Set false in constructor if LCD is not connected
MikamiUitOpen 3:b2a573e31cc9 54
MikamiUitOpen 3:b2a573e31cc9 55 bool LcdTx(uint8_t cmdData, uint8_t data);
MikamiUitOpen 3:b2a573e31cc9 56 bool Start();
MikamiUitOpen 3:b2a573e31cc9 57
MikamiUitOpen 3:b2a573e31cc9 58 // Forbid to use copy constructor
MikamiUitOpen 3:b2a573e31cc9 59 Acm1602Ni(const Acm1602Ni&);
MikamiUitOpen 3:b2a573e31cc9 60 // Forbid to use substitution operator
MikamiUitOpen 3:b2a573e31cc9 61 Acm1602Ni& operator=(const Acm1602Ni&);
MikamiUitOpen 3:b2a573e31cc9 62
MikamiUitOpen 3:b2a573e31cc9 63 uint32_t* i2c_cr1_; // pointer to I2C_CR1 (control register 1)
MikamiUitOpen 3:b2a573e31cc9 64 uint32_t* i2c_dr_; // pointer to I2C_DR (data register)
MikamiUitOpen 3:b2a573e31cc9 65 uint32_t* i2c_sr1_; // pointer to I2C_SR1 (status register 1)
MikamiUitOpen 3:b2a573e31cc9 66 uint32_t* i2c_sr2_; // pointer to I2C_SR2 (status register 2)
MikamiUitOpen 3:b2a573e31cc9 67 I2C i2c_; // Object of I2C
MikamiUitOpen 3:b2a573e31cc9 68
MikamiUitOpen 3:b2a573e31cc9 69 // For check contents of register
MikamiUitOpen 3:b2a573e31cc9 70 bool Check(uint32_t* rg, uint16_t value)
MikamiUitOpen 3:b2a573e31cc9 71 { return value == ((*rg) & value); }
MikamiUitOpen 3:b2a573e31cc9 72
MikamiUitOpen 3:b2a573e31cc9 73 void TxDR(uint8_t data) { *i2c_dr_ = data; }
MikamiUitOpen 3:b2a573e31cc9 74 void SetCR1(uint16_t data) { *i2c_cr1_ |= data; }
MikamiUitOpen 3:b2a573e31cc9 75 };
MikamiUitOpen 3:b2a573e31cc9 76 }
MikamiUitOpen 3:b2a573e31cc9 77 #endif // ACM1602NI_HPP