I2C 接続の LCD AQM1602XA-RN-GBW 用のライブラリ. Library for LCD 1602XA-RN-GBW connected using I2C interface.
Dependents: UIT2_MovingAv_Intr UIT2_VariableFIR UIT2_VowelSynthesizer UIT2_ALE_LeakyLMS ... more
AQM1602.cpp
- Committer:
- MikamiUitOpen
- Date:
- 2017-10-28
- Revision:
- 12:21830002e12d
- Parent:
- 11:f650f1e809a9
- Child:
- 13:4975e1c1d743
File content as of revision 12:21830002e12d:
//--------------------------------------------------------------- // Class for LCD, AQM1602XA-RN-GBW // // Default pin assignments for Nucleo // D14 SDA ---- to pin4 of LCD module // D15 SCL ---- to pin3 of LCD module // // 動作を確認したボード: Nucleo-F401RE, Nucleo-F411RE, Nucleo-F446RE, // LPC1768 // 動作が不良なボード: Nucleo-F302R8, Nucle0-F746ZG, Disco-f746NG // // このプログラムを作った際の mbed のリビジョン:Rev.154 // // 2017/10/28, Copyright (c) 2017 MIKAMI, Naoki //--------------------------------------------------------------- #include "AQM1602.hpp" namespace Mikami { // Constructor Aqm1602::Aqm1602(PinName sda, PinName scl, uint32_t clock, bool cursor, bool blink) : i2cPtr_(new I2C(sda, scl)), i2c_(*i2cPtr_) { Init(clock, cursor, blink); } Aqm1602::Aqm1602(I2C &i2c, uint32_t clock, bool cursor, bool blink) : i2cPtr_(NULL), i2c_(i2c) { Init(clock, cursor, blink); } // All clear void Aqm1602::Clear() { WriteCmd(0x01); wait_ms(50); } // Write string void Aqm1602::WriteString(const string str) { int length = min(str.length(), (size_t)N_CHR); for (int n=0; n<length; n++) WriteChar(str[n]); } // Write string from specified position void Aqm1602::WriteStringXY(const string str, uint8_t x, uint8_t y) { SetXY(x, y); WriteString(str); } // Clear of specified line void Aqm1602::ClearLine(uint8_t line) { SetXY(0, line); for (int n=0; n<N_CHR; n++) WriteString(" "); } // Set contrast void Aqm1602::SetContrast(uint8_t c) { WriteCmd(0x39); WriteCmd(0x70 | (c & 0x0f)); // Lower 4 bits WriteCmd(0x5C | ((c >> 4) & 0x03)); // Higher 2 bits WriteCmd(0x38); } //--------------------------------------------------- // Following functions: private // Initialize void Aqm1602::Init(uint32_t clock, bool cursor, bool blink) { if (clock != 100000) i2c_.frequency(clock); wait_ms(100); // 初期化のためのコマンド送信手順は,秋月電子の AE-AQM1602A(KIT) の // データシートの記載に従った connected_ = WriteCmd(0x38); // data length:8-bit, 2-line, 5×8 dots if (!connected_) { fprintf(stderr, "\r\nLCD AQM1602 not connected\r\n"); return; } WriteCmd(0x39); // To extended command WriteCmd(0x14); // Internal OSC frequency WriteCmd(0x70 | 0x00); // Contrast set WriteCmd(0x54 | 0x02); // Power/ICON/Contrast control WriteCmd(0x6C); // Follower control wait_ms(200); WriteCmd(0x38); // data length:8-bit, 2-line, 5×8 dots // WriteCmd(0x01); // clear,これを入れると正常に動作しない WriteCmd(0x0C | (cursor << 1) | blink); Clear(); } // Send command and data bool Aqm1602::LcdTx(uint8_t cmdData, uint8_t data) { /* // mbed Rev.130 以降では割り込み処理でうまく動作しない場合がある char tx[2] = { cmdData, data }; int rt = i2c_.write(LCD_ADDRESS_, tx, 2); wait_us(30); return (rt == 0) ? true : false; */ // 以下は Rev.12 で変更したもの i2c_.start(); if (1 != i2c_.write(LCD_ADDRESS_)) return false; if (1 != i2c_.write(cmdData)) return false; if (1 != i2c_.write(data)) return false; i2c_.stop(); wait_us(30); return true; } }