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:
Sun Nov 30 06:10:19 2014 +0000
Revision:
2:edf345c86b3b
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 2:edf345c86b3b 1 //-------------------------------------------------------
MikamiUitOpen 2:edf345c86b3b 2 // Class for LCD, AQM0802A
MikamiUitOpen 2:edf345c86b3b 3 //
MikamiUitOpen 2:edf345c86b3b 4 // 2014/11/30, Copyright (c) 2014 MIKAMI, Naoki
MikamiUitOpen 2:edf345c86b3b 5 //-------------------------------------------------------
MikamiUitOpen 2:edf345c86b3b 6
MikamiUitOpen 2:edf345c86b3b 7 #include "AQM0802A.hpp"
MikamiUitOpen 2:edf345c86b3b 8
MikamiUitOpen 2:edf345c86b3b 9 namespace Mikami
MikamiUitOpen 2:edf345c86b3b 10 {
MikamiUitOpen 2:edf345c86b3b 11 // Constructor
MikamiUitOpen 2:edf345c86b3b 12 Aqm0802A::Aqm0802A(PinName sda, PinName scl, uint32_t clock,
MikamiUitOpen 2:edf345c86b3b 13 bool cursor, bool blink)
MikamiUitOpen 2:edf345c86b3b 14 : i2c_(sda, scl)
MikamiUitOpen 2:edf345c86b3b 15 {
MikamiUitOpen 2:edf345c86b3b 16 if (clock != 100000) i2c_.frequency(clock);
MikamiUitOpen 2:edf345c86b3b 17
MikamiUitOpen 2:edf345c86b3b 18 wait_ms(40);
MikamiUitOpen 2:edf345c86b3b 19 WriteCmd(0x39); // To extended command
MikamiUitOpen 2:edf345c86b3b 20 WriteCmd(0x14); // Internal OSC frequency
MikamiUitOpen 2:edf345c86b3b 21 WriteCmd(0x70 | 0x00); // Contrast set
MikamiUitOpen 2:edf345c86b3b 22 WriteCmd(0x54 | 0x02); // Power/ICON/Contrast control
MikamiUitOpen 2:edf345c86b3b 23 WriteCmd(0x6C); // Follower control
MikamiUitOpen 2:edf345c86b3b 24 wait_ms(200);
MikamiUitOpen 2:edf345c86b3b 25
MikamiUitOpen 2:edf345c86b3b 26 WriteCmd(0x38); // data length:8-bit, 2-line, 5×8 dots
MikamiUitOpen 2:edf345c86b3b 27 WriteCmd(0x0C | (cursor << 1) | blink);
MikamiUitOpen 2:edf345c86b3b 28 Clear(); // Clear display
MikamiUitOpen 2:edf345c86b3b 29 }
MikamiUitOpen 2:edf345c86b3b 30
MikamiUitOpen 2:edf345c86b3b 31 // All clear
MikamiUitOpen 2:edf345c86b3b 32 void Aqm0802A::Clear()
MikamiUitOpen 2:edf345c86b3b 33 {
MikamiUitOpen 2:edf345c86b3b 34 WriteCmd(0x01);
MikamiUitOpen 2:edf345c86b3b 35 wait_ms(50);
MikamiUitOpen 2:edf345c86b3b 36 }
MikamiUitOpen 2:edf345c86b3b 37
MikamiUitOpen 2:edf345c86b3b 38 // Write string
MikamiUitOpen 2:edf345c86b3b 39 void Aqm0802A::WriteString(const char str[])
MikamiUitOpen 2:edf345c86b3b 40 {
MikamiUitOpen 2:edf345c86b3b 41 for (int n=0; n<8; n++)
MikamiUitOpen 2:edf345c86b3b 42 if (str[n] == 0) break;
MikamiUitOpen 2:edf345c86b3b 43 else WriteChar(str[n]);
MikamiUitOpen 2:edf345c86b3b 44 }
MikamiUitOpen 2:edf345c86b3b 45
MikamiUitOpen 2:edf345c86b3b 46 // Write string from specified position
MikamiUitOpen 2:edf345c86b3b 47 void Aqm0802A::WriteStringXY(const char str[],
MikamiUitOpen 2:edf345c86b3b 48 uint8_t x, uint8_t y)
MikamiUitOpen 2:edf345c86b3b 49 {
MikamiUitOpen 2:edf345c86b3b 50 SetXY(x, y);
MikamiUitOpen 2:edf345c86b3b 51 WriteString(str);
MikamiUitOpen 2:edf345c86b3b 52 }
MikamiUitOpen 2:edf345c86b3b 53
MikamiUitOpen 2:edf345c86b3b 54 // Set contrast
MikamiUitOpen 2:edf345c86b3b 55 void Aqm0802A::SetContrast(uint8_t c)
MikamiUitOpen 2:edf345c86b3b 56 {
MikamiUitOpen 2:edf345c86b3b 57 WriteCmd(0x39);
MikamiUitOpen 2:edf345c86b3b 58 WriteCmd(0x70 | (c & 0x0f)); // Lower 4 bits
MikamiUitOpen 2:edf345c86b3b 59 WriteCmd(0x5C | ((c >> 4) & 0x03)); // Higher 2 bits
MikamiUitOpen 2:edf345c86b3b 60 WriteCmd(0x38);
MikamiUitOpen 2:edf345c86b3b 61 }
MikamiUitOpen 2:edf345c86b3b 62
MikamiUitOpen 2:edf345c86b3b 63 //---------------------------------------------------
MikamiUitOpen 2:edf345c86b3b 64 // Following functions: private
MikamiUitOpen 2:edf345c86b3b 65
MikamiUitOpen 2:edf345c86b3b 66 // Send command and data
MikamiUitOpen 2:edf345c86b3b 67 void Aqm0802A::LcdTx(uint8_t cmdData, uint8_t data)
MikamiUitOpen 2:edf345c86b3b 68 {
MikamiUitOpen 2:edf345c86b3b 69 char tx[2];
MikamiUitOpen 2:edf345c86b3b 70 tx[0] = cmdData;
MikamiUitOpen 2:edf345c86b3b 71 tx[1] = data;
MikamiUitOpen 2:edf345c86b3b 72 i2c_.write(LCD_ADDRESS_, tx, 2);
MikamiUitOpen 2:edf345c86b3b 73 }
MikamiUitOpen 2:edf345c86b3b 74 }
MikamiUitOpen 2:edf345c86b3b 75
MikamiUitOpen 2:edf345c86b3b 76