LCDモジュール AQM0802 を制御するクラス
LcdAqm0802.h
- Committer:
- orivant
- Date:
- 2016-12-19
- Revision:
- 1:9ac3c6f45e84
- Parent:
- 0:ea6cbd4e50ce
File content as of revision 1:9ac3c6f45e84:
/** * @file LCDモジュール AQM0802 を制御するクラスの宣言 */ #if !defined(LCD_AQM0802_H) #include "mbed.h" #define LCD_AQM0802_H /** LCDモジュール AQM0802 制御クラス * @brief LCDモジュール AQM0802 をI2C通信で制御するクラス * @date 2016/12/18 * @code * #include "mbed.h" * #include "LcdAqm0802.h" * * LcdAqm0802 lcd(p8, p9, p10); * * int main() { * wait_ms(40); //!< LCD動作が安定するまで電源投入後40ms以上待つ必要がある * lcd.initialize(); * * lcd.puts("Hellow\r\nWorld!"); * * wait(1) { * } * } * @endcode */ class LcdAqm0802 { public: static const uint8_t SLAVE_ADDR = 0x7c; //!< LCDのスレーブアドレス static const uint8_t LINE_COUNT = 2; //!< 行数 static const uint8_t LINE_CHARA_COUNT = 8; //!< 行の文字数 static const uint8_t MAX_CONTRAST = 63; //!< コントラスト最大値 static const uint8_t DEFAULT_CONTRAST = 32; //!< コントラスト初期値 private: static const int32_t I2C_MAX_FREQUENCY = 400 * 1000; //!< I2C通信の最高周波数 static const uint8_t LINE_HEAD_ADDR_TBL[LINE_COUNT]; //!< 行先頭アドレス static const uint8_t CTRL_BYTE_RS_COMMAND = 0x00; //!< 制御指定用bit_RS:コマンド送信 static const uint8_t CTRL_BYTE_RS_DATA = 0x40; //!< 制御指定用bit_RS:データ送信 static const uint8_t CTRL_BYTE_CO_SINGLE = 0x80; //!< 制御指定用bit_Co:単発 static const uint8_t CTRL_BYTE_CO_CHAIN = 0x00; //!< 制御指定用bit_Co:連続 static const uint8_t ADDR_BYTE_WRITE = SLAVE_ADDR; //!< アドレス指定用バイトデータ:書き込み static const uint8_t ADDR_BYTE_READ = SLAVE_ADDR | 0x01; //!< アドレス指定用バイトデータ:読み込み static const uint8_t CTRL_BYTE_SINGLE_COMMAND = CTRL_BYTE_RS_COMMAND | CTRL_BYTE_CO_SINGLE; //!< 制御指定用バイトデータ:単発コマンド static const uint8_t CTRL_BYTE_CHAIN_COMMAND = CTRL_BYTE_RS_COMMAND | CTRL_BYTE_CO_CHAIN; //!< 制御指定用バイトデータ:連続コマンド static const uint8_t CTRL_BYTE_SINGLE_DATA = CTRL_BYTE_RS_DATA | CTRL_BYTE_CO_SINGLE; //!< 制御指定用バイトデータ:単発データ static const uint8_t CTRL_BYTE_CHAIN_DATA = CTRL_BYTE_RS_DATA | CTRL_BYTE_CO_CHAIN; //!< 制御指定用バイトデータ:連続データ static const uint8_t FUNC_SET_BYTE_EX = 0x39; //!< ファンクションセット用バイト:拡張設定 static const uint8_t FUNC_SET_BYTE_NRM = 0x38; //!< ファンクションセット用バイト:通常設定 private: PinName m_pinReset; //!< リセットピン PinName m_pinSDA; //!< SDAピン PinName m_pinSCL; //!< SCLピン DigitalOut m_resetOut; //!< リセット制御 I2C m_i2c; //!< I2C制御 bool m_displayVisible; //!< ディスプレイ表示フラグ bool m_cursorVisible; //!< カーソル表示フラグ bool m_blinkEnable; //!< カーソル点滅フラグ uint8_t m_contrast; //!< コントラスト uint8_t m_currentLineNo; //!< 現在位置:行 uint8_t m_currentCharaNo; //!< 現在位置:文字 public: /** コンストラクタ * @brief クラス内のI2Cインスタンスを使用する場合のコンストラクタ * @param pinReset リセットピン指定 * @param pinSDA SDAピン指定 * @param pinSCL SCLピン指定 */ LcdAqm0802(PinName pinReset, PinName pinSDA, PinName pinSCL); /** コンストラクタ * @brief クラス外のI2Cインスタンスを使用する場合のコンストラクタ * @param pinReset リセットピン指定 * @param i2c I2Cインスタンス */ LcdAqm0802(PinName pinReset, I2C& i2c); /** デストラクタ */ ~LcdAqm0802(); /** 初期化 * @brief LCDの表示に必要な各種初期化を行います。 * これを行わないと表示されません。 * ※LCDに電源投入後(もしくはリセット後)、必ず40ms以上経過後に呼び出してください。 */ void initialize(); /** リセット * @brief LCDを初期化前の状態に戻します。 */ void reset(); /** 1文字描画 * @brief 1文字描画します。 * カーソル位置は一つ進みます。 * 行端まで来た場合は自動で復帰・改行します。 * @param c 文字コード */ void putc(char c); /** 文字列描画 * @brief 文字列の終端まで描画します。 * カーソル位置は文字数分進みます。 * 行端まで来た場合は自動で復帰・改行します。 * @param pStr 文字列 */ void puts(const char* pStr); /** フォーマット指定描画 * @brief フォーマットと可変長引数から生成した文字列を描画します。 * 文字列生成後、puts()を内部で呼び出しています。 * @param pFormat フォーマット * @param ... 可変長引数 */ void printf(const char* pFormat, ...); /** カーソル位置変更 * @brief 指定位置までカーソルを移動させます。 * @param lineNo 行番号(0~LINE_COUNT) * @param charaNo 文字番号(0~LINE_CHARA_COUNT) */ void locate(uint8_t lineNo, uint8_t charaNo); /** カーソル位置取得:行番号 * @return カーソルのある行番号 */ uint8_t getCurrentLineNo() const; /** カーソル位置取得:文字番号 * @return カーソルのある文字番号 */ uint8_t getCurrentCharaNo() const; /** 画面クリア * @brief 画面全域をクリアし、カーソル位置を先頭に移動させます。 */ void clearDisplay(); /** 行クリア * @brief 指定行をクリアし、カーソルを指定行の先頭に移動させます。 * @param lineNo 行番号 */ void clearLine(uint8_t lineNo); /** 範囲クリア * @brief 指定範囲をクリアし、カーソルを指定範囲の開始位置に移動させます。 * @param startLineNo 開始行番号 * @param startCharaNo 開始文字番号 * @param endLineNo; 終了行番号 * @param endCharaNo 終了文字番号 */ void clearRange(uint8_t startLineNo, uint8_t startCharaNo, uint8_t endLineNo, uint8_t endCharaNo); /** 画面の表示設定 * @param visible 表示フラグ */ void setDisplayVisible(bool visible); /** 画面の表示設定取得 * @return 表示フラグ */ bool getDisplayVisible() const; /** カーソルの表示設定 * @param visible 表示フラグ */ void setCursorVisible(bool visible); /** カーソルの表示設定取得 * @return 表示フラグ */ bool getCursorVisible() const; /** カーソルの点滅設定 * @param enable 点滅フラグ */ void setBlinkEnable(bool enable); /** カーソルの点滅設定取得 * @return 点滅フラグ */ bool getBlinkEnable() const; /** コントラスト設定 * @param val コントラスト値(0~MAX_CONTRAST) */ void setContrast(uint8_t val); /** コントラスト取得 * @return コントラスト値 */ uint8_t getContrast() const; private: /** LCDコマンド単発書き込み * @brief LCDのコマンドを一つ書き込み(実行し)ます。 * @param commandByte コマンド指定バイトデータ */ void writeCommand(uint8_t commandByte); /** LCDコマンド連続書き込み * @brief LCDのコマンドを複数書き込み(実行し)ます。 * @param commandBytes コマンド指定バイトデータ配列 * @param commandCount コマンド指定バイトデータ数 */ void writeCommand(uint8_t commandBytes[], uint8_t commandCount); /** LCDデータ単発書き込み * @brief LCDのデータを一つ書き込み(実行し)ます。 * @param dataByte データ指定バイトデータ */ void writeData(uint8_t dataByte); /** LCDデータ連続書き込み * @brief LCDのデータを複数書き込み(実行し)ます。 * @param dataBytes データ指定バイトデータ配列 * @param dataCount データ指定バイトデータ数 */ void writeData(uint8_t dataBytes[], uint8_t dataCount); /** コントラスト設定用バイトデータ生成(上位ビット) * @return コントラスト設定用バイトデータ(上位ビット) */ uint8_t calcContrastSettingByteUpper() const; /** コントラスト設定用バイトデータ生成(下位ビット) * @return コントラスト設定用バイトデータ(下位ビット) */ uint8_t calcContrastSettingByteLowwer() const; /** ディスプレイ制御コマンド指定バイトデータの生成 * @param displayVisible ディスプレイ表示設定 * @param cursorVisible カーソル表示設定 * @param blinkEnable カーソル点滅設定 * @return コマンド指定バイトデータ */ uint8_t calcDisplayControlByteData(bool displayVisible, bool cursorVisible, bool blinkEnable) const; uint8_t calcDisplayControlByteData() const { return calcDisplayControlByteData(m_displayVisible, m_cursorVisible, m_blinkEnable); } /** カーソル位置移動管理 * @brief カーソル位置を一つ進め、改行が発生するかを調べる * @return 改行が発生する場合はtrue */ bool incCursorPos(); /** カーソル位置のアドレス計算 * @param lineNo 行番号 * @param charaNo 文字番号 * @return アドレス */ uint8_t calcCursorAddr(uint8_t lineNo, uint8_t charaNo); }; #endif //!defined(LCD_AQM0802_H)