LCDモジュール AQM0802 を制御するクラス

Committer:
orivant
Date:
Mon Dec 19 05:36:54 2016 +0000
Revision:
1:9ac3c6f45e84
Parent:
0:ea6cbd4e50ce
?????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
orivant 0:ea6cbd4e50ce 1 /**
orivant 0:ea6cbd4e50ce 2 * @file LCDモジュール AQM0802 を制御するクラスの宣言
orivant 0:ea6cbd4e50ce 3 */
orivant 0:ea6cbd4e50ce 4 #if !defined(LCD_AQM0802_H)
orivant 0:ea6cbd4e50ce 5
orivant 0:ea6cbd4e50ce 6 #include "mbed.h"
orivant 0:ea6cbd4e50ce 7
orivant 0:ea6cbd4e50ce 8 #define LCD_AQM0802_H
orivant 0:ea6cbd4e50ce 9
orivant 0:ea6cbd4e50ce 10
orivant 0:ea6cbd4e50ce 11 /** LCDモジュール AQM0802 制御クラス
orivant 0:ea6cbd4e50ce 12 * @brief LCDモジュール AQM0802 をI2C通信で制御するクラス
orivant 0:ea6cbd4e50ce 13 * @date 2016/12/18
orivant 0:ea6cbd4e50ce 14 * @code
orivant 0:ea6cbd4e50ce 15 * #include "mbed.h"
orivant 0:ea6cbd4e50ce 16 * #include "LcdAqm0802.h"
orivant 0:ea6cbd4e50ce 17 *
orivant 0:ea6cbd4e50ce 18 * LcdAqm0802 lcd(p8, p9, p10);
orivant 0:ea6cbd4e50ce 19 *
orivant 0:ea6cbd4e50ce 20 * int main() {
orivant 0:ea6cbd4e50ce 21 * wait_ms(40); //!< LCD動作が安定するまで電源投入後40ms以上待つ必要がある
orivant 0:ea6cbd4e50ce 22 * lcd.initialize();
orivant 0:ea6cbd4e50ce 23 *
orivant 1:9ac3c6f45e84 24 * lcd.puts("Hellow\r\nWorld!");
orivant 0:ea6cbd4e50ce 25 *
orivant 0:ea6cbd4e50ce 26 * wait(1) {
orivant 0:ea6cbd4e50ce 27 * }
orivant 0:ea6cbd4e50ce 28 * }
orivant 0:ea6cbd4e50ce 29 * @endcode
orivant 0:ea6cbd4e50ce 30 */
orivant 0:ea6cbd4e50ce 31 class LcdAqm0802 {
orivant 0:ea6cbd4e50ce 32 public:
orivant 0:ea6cbd4e50ce 33 static const uint8_t SLAVE_ADDR = 0x7c; //!< LCDのスレーブアドレス
orivant 0:ea6cbd4e50ce 34 static const uint8_t LINE_COUNT = 2; //!< 行数
orivant 0:ea6cbd4e50ce 35 static const uint8_t LINE_CHARA_COUNT = 8; //!< 行の文字数
orivant 0:ea6cbd4e50ce 36
orivant 0:ea6cbd4e50ce 37 static const uint8_t MAX_CONTRAST = 63; //!< コントラスト最大値
orivant 0:ea6cbd4e50ce 38 static const uint8_t DEFAULT_CONTRAST = 32; //!< コントラスト初期値
orivant 0:ea6cbd4e50ce 39
orivant 0:ea6cbd4e50ce 40 private:
orivant 0:ea6cbd4e50ce 41 static const int32_t I2C_MAX_FREQUENCY = 400 * 1000; //!< I2C通信の最高周波数
orivant 0:ea6cbd4e50ce 42 static const uint8_t LINE_HEAD_ADDR_TBL[LINE_COUNT]; //!< 行先頭アドレス
orivant 0:ea6cbd4e50ce 43
orivant 0:ea6cbd4e50ce 44 static const uint8_t CTRL_BYTE_RS_COMMAND = 0x00; //!< 制御指定用bit_RS:コマンド送信
orivant 0:ea6cbd4e50ce 45 static const uint8_t CTRL_BYTE_RS_DATA = 0x40; //!< 制御指定用bit_RS:データ送信
orivant 0:ea6cbd4e50ce 46 static const uint8_t CTRL_BYTE_CO_SINGLE = 0x80; //!< 制御指定用bit_Co:単発
orivant 0:ea6cbd4e50ce 47 static const uint8_t CTRL_BYTE_CO_CHAIN = 0x00; //!< 制御指定用bit_Co:連続
orivant 0:ea6cbd4e50ce 48
orivant 0:ea6cbd4e50ce 49 static const uint8_t ADDR_BYTE_WRITE = SLAVE_ADDR; //!< アドレス指定用バイトデータ:書き込み
orivant 0:ea6cbd4e50ce 50 static const uint8_t ADDR_BYTE_READ = SLAVE_ADDR | 0x01; //!< アドレス指定用バイトデータ:読み込み
orivant 0:ea6cbd4e50ce 51 static const uint8_t CTRL_BYTE_SINGLE_COMMAND = CTRL_BYTE_RS_COMMAND | CTRL_BYTE_CO_SINGLE; //!< 制御指定用バイトデータ:単発コマンド
orivant 0:ea6cbd4e50ce 52 static const uint8_t CTRL_BYTE_CHAIN_COMMAND = CTRL_BYTE_RS_COMMAND | CTRL_BYTE_CO_CHAIN; //!< 制御指定用バイトデータ:連続コマンド
orivant 0:ea6cbd4e50ce 53 static const uint8_t CTRL_BYTE_SINGLE_DATA = CTRL_BYTE_RS_DATA | CTRL_BYTE_CO_SINGLE; //!< 制御指定用バイトデータ:単発データ
orivant 0:ea6cbd4e50ce 54 static const uint8_t CTRL_BYTE_CHAIN_DATA = CTRL_BYTE_RS_DATA | CTRL_BYTE_CO_CHAIN; //!< 制御指定用バイトデータ:連続データ
orivant 0:ea6cbd4e50ce 55
orivant 0:ea6cbd4e50ce 56 static const uint8_t FUNC_SET_BYTE_EX = 0x39; //!< ファンクションセット用バイト:拡張設定
orivant 0:ea6cbd4e50ce 57 static const uint8_t FUNC_SET_BYTE_NRM = 0x38; //!< ファンクションセット用バイト:通常設定
orivant 0:ea6cbd4e50ce 58
orivant 0:ea6cbd4e50ce 59 private:
orivant 0:ea6cbd4e50ce 60 PinName m_pinReset; //!< リセットピン
orivant 0:ea6cbd4e50ce 61 PinName m_pinSDA; //!< SDAピン
orivant 0:ea6cbd4e50ce 62 PinName m_pinSCL; //!< SCLピン
orivant 0:ea6cbd4e50ce 63 DigitalOut m_resetOut; //!< リセット制御
orivant 0:ea6cbd4e50ce 64 I2C m_i2c; //!< I2C制御
orivant 0:ea6cbd4e50ce 65
orivant 0:ea6cbd4e50ce 66 bool m_displayVisible; //!< ディスプレイ表示フラグ
orivant 0:ea6cbd4e50ce 67 bool m_cursorVisible; //!< カーソル表示フラグ
orivant 0:ea6cbd4e50ce 68 bool m_blinkEnable; //!< カーソル点滅フラグ
orivant 0:ea6cbd4e50ce 69
orivant 0:ea6cbd4e50ce 70 uint8_t m_contrast; //!< コントラスト
orivant 0:ea6cbd4e50ce 71 uint8_t m_currentLineNo; //!< 現在位置:行
orivant 0:ea6cbd4e50ce 72 uint8_t m_currentCharaNo; //!< 現在位置:文字
orivant 0:ea6cbd4e50ce 73 public:
orivant 0:ea6cbd4e50ce 74 /** コンストラクタ
orivant 0:ea6cbd4e50ce 75 * @brief クラス内のI2Cインスタンスを使用する場合のコンストラクタ
orivant 0:ea6cbd4e50ce 76 * @param pinReset リセットピン指定
orivant 0:ea6cbd4e50ce 77 * @param pinSDA SDAピン指定
orivant 0:ea6cbd4e50ce 78 * @param pinSCL SCLピン指定
orivant 0:ea6cbd4e50ce 79 */
orivant 0:ea6cbd4e50ce 80 LcdAqm0802(PinName pinReset, PinName pinSDA, PinName pinSCL);
orivant 0:ea6cbd4e50ce 81 /** コンストラクタ
orivant 0:ea6cbd4e50ce 82 * @brief クラス外のI2Cインスタンスを使用する場合のコンストラクタ
orivant 0:ea6cbd4e50ce 83 * @param pinReset リセットピン指定
orivant 0:ea6cbd4e50ce 84 * @param i2c I2Cインスタンス
orivant 0:ea6cbd4e50ce 85 */
orivant 0:ea6cbd4e50ce 86 LcdAqm0802(PinName pinReset, I2C& i2c);
orivant 0:ea6cbd4e50ce 87 /** デストラクタ
orivant 0:ea6cbd4e50ce 88 */
orivant 0:ea6cbd4e50ce 89 ~LcdAqm0802();
orivant 0:ea6cbd4e50ce 90
orivant 0:ea6cbd4e50ce 91
orivant 0:ea6cbd4e50ce 92 /** 初期化
orivant 0:ea6cbd4e50ce 93 * @brief LCDの表示に必要な各種初期化を行います。
orivant 0:ea6cbd4e50ce 94 * これを行わないと表示されません。
orivant 0:ea6cbd4e50ce 95 * ※LCDに電源投入後(もしくはリセット後)、必ず40ms以上経過後に呼び出してください。
orivant 0:ea6cbd4e50ce 96 */
orivant 0:ea6cbd4e50ce 97 void initialize();
orivant 0:ea6cbd4e50ce 98 /** リセット
orivant 0:ea6cbd4e50ce 99 * @brief LCDを初期化前の状態に戻します。
orivant 0:ea6cbd4e50ce 100 */
orivant 0:ea6cbd4e50ce 101 void reset();
orivant 0:ea6cbd4e50ce 102
orivant 0:ea6cbd4e50ce 103
orivant 0:ea6cbd4e50ce 104 /** 1文字描画
orivant 0:ea6cbd4e50ce 105 * @brief 1文字描画します。
orivant 0:ea6cbd4e50ce 106 * カーソル位置は一つ進みます。
orivant 0:ea6cbd4e50ce 107 * 行端まで来た場合は自動で復帰・改行します。
orivant 0:ea6cbd4e50ce 108 * @param c 文字コード
orivant 0:ea6cbd4e50ce 109 */
orivant 0:ea6cbd4e50ce 110 void putc(char c);
orivant 0:ea6cbd4e50ce 111 /** 文字列描画
orivant 0:ea6cbd4e50ce 112 * @brief 文字列の終端まで描画します。
orivant 0:ea6cbd4e50ce 113 * カーソル位置は文字数分進みます。
orivant 0:ea6cbd4e50ce 114 * 行端まで来た場合は自動で復帰・改行します。
orivant 0:ea6cbd4e50ce 115 * @param pStr 文字列
orivant 0:ea6cbd4e50ce 116 */
orivant 0:ea6cbd4e50ce 117 void puts(const char* pStr);
orivant 0:ea6cbd4e50ce 118 /** フォーマット指定描画
orivant 0:ea6cbd4e50ce 119 * @brief フォーマットと可変長引数から生成した文字列を描画します。
orivant 0:ea6cbd4e50ce 120 * 文字列生成後、puts()を内部で呼び出しています。
orivant 0:ea6cbd4e50ce 121 * @param pFormat フォーマット
orivant 0:ea6cbd4e50ce 122 * @param ... 可変長引数
orivant 0:ea6cbd4e50ce 123 */
orivant 0:ea6cbd4e50ce 124 void printf(const char* pFormat, ...);
orivant 0:ea6cbd4e50ce 125
orivant 0:ea6cbd4e50ce 126
orivant 0:ea6cbd4e50ce 127 /** カーソル位置変更
orivant 0:ea6cbd4e50ce 128 * @brief 指定位置までカーソルを移動させます。
orivant 0:ea6cbd4e50ce 129 * @param lineNo 行番号(0~LINE_COUNT)
orivant 0:ea6cbd4e50ce 130 * @param charaNo 文字番号(0~LINE_CHARA_COUNT)
orivant 0:ea6cbd4e50ce 131 */
orivant 0:ea6cbd4e50ce 132 void locate(uint8_t lineNo, uint8_t charaNo);
orivant 0:ea6cbd4e50ce 133 /** カーソル位置取得:行番号
orivant 0:ea6cbd4e50ce 134 * @return カーソルのある行番号
orivant 0:ea6cbd4e50ce 135 */
orivant 0:ea6cbd4e50ce 136 uint8_t getCurrentLineNo() const;
orivant 0:ea6cbd4e50ce 137 /** カーソル位置取得:文字番号
orivant 0:ea6cbd4e50ce 138 * @return カーソルのある文字番号
orivant 0:ea6cbd4e50ce 139 */
orivant 0:ea6cbd4e50ce 140 uint8_t getCurrentCharaNo() const;
orivant 0:ea6cbd4e50ce 141
orivant 0:ea6cbd4e50ce 142
orivant 0:ea6cbd4e50ce 143 /** 画面クリア
orivant 0:ea6cbd4e50ce 144 * @brief 画面全域をクリアし、カーソル位置を先頭に移動させます。
orivant 0:ea6cbd4e50ce 145 */
orivant 0:ea6cbd4e50ce 146 void clearDisplay();
orivant 0:ea6cbd4e50ce 147 /** 行クリア
orivant 0:ea6cbd4e50ce 148 * @brief 指定行をクリアし、カーソルを指定行の先頭に移動させます。
orivant 0:ea6cbd4e50ce 149 * @param lineNo 行番号
orivant 0:ea6cbd4e50ce 150 */
orivant 0:ea6cbd4e50ce 151 void clearLine(uint8_t lineNo);
orivant 0:ea6cbd4e50ce 152 /** 範囲クリア
orivant 0:ea6cbd4e50ce 153 * @brief 指定範囲をクリアし、カーソルを指定範囲の開始位置に移動させます。
orivant 0:ea6cbd4e50ce 154 * @param startLineNo 開始行番号
orivant 0:ea6cbd4e50ce 155 * @param startCharaNo 開始文字番号
orivant 0:ea6cbd4e50ce 156 * @param endLineNo; 終了行番号
orivant 0:ea6cbd4e50ce 157 * @param endCharaNo 終了文字番号
orivant 0:ea6cbd4e50ce 158 */
orivant 0:ea6cbd4e50ce 159 void clearRange(uint8_t startLineNo, uint8_t startCharaNo, uint8_t endLineNo, uint8_t endCharaNo);
orivant 0:ea6cbd4e50ce 160
orivant 0:ea6cbd4e50ce 161
orivant 0:ea6cbd4e50ce 162 /** 画面の表示設定
orivant 0:ea6cbd4e50ce 163 * @param visible 表示フラグ
orivant 0:ea6cbd4e50ce 164 */
orivant 0:ea6cbd4e50ce 165 void setDisplayVisible(bool visible);
orivant 0:ea6cbd4e50ce 166 /** 画面の表示設定取得
orivant 0:ea6cbd4e50ce 167 * @return 表示フラグ
orivant 0:ea6cbd4e50ce 168 */
orivant 0:ea6cbd4e50ce 169 bool getDisplayVisible() const;
orivant 0:ea6cbd4e50ce 170 /** カーソルの表示設定
orivant 0:ea6cbd4e50ce 171 * @param visible 表示フラグ
orivant 0:ea6cbd4e50ce 172 */
orivant 0:ea6cbd4e50ce 173 void setCursorVisible(bool visible);
orivant 0:ea6cbd4e50ce 174 /** カーソルの表示設定取得
orivant 0:ea6cbd4e50ce 175 * @return 表示フラグ
orivant 0:ea6cbd4e50ce 176 */
orivant 0:ea6cbd4e50ce 177 bool getCursorVisible() const;
orivant 0:ea6cbd4e50ce 178 /** カーソルの点滅設定
orivant 0:ea6cbd4e50ce 179 * @param enable 点滅フラグ
orivant 0:ea6cbd4e50ce 180 */
orivant 0:ea6cbd4e50ce 181 void setBlinkEnable(bool enable);
orivant 0:ea6cbd4e50ce 182 /** カーソルの点滅設定取得
orivant 0:ea6cbd4e50ce 183 * @return 点滅フラグ
orivant 0:ea6cbd4e50ce 184 */
orivant 0:ea6cbd4e50ce 185 bool getBlinkEnable() const;
orivant 0:ea6cbd4e50ce 186
orivant 0:ea6cbd4e50ce 187
orivant 0:ea6cbd4e50ce 188 /** コントラスト設定
orivant 0:ea6cbd4e50ce 189 * @param val コントラスト値(0~MAX_CONTRAST)
orivant 0:ea6cbd4e50ce 190 */
orivant 0:ea6cbd4e50ce 191 void setContrast(uint8_t val);
orivant 0:ea6cbd4e50ce 192 /** コントラスト取得
orivant 0:ea6cbd4e50ce 193 * @return コントラスト値
orivant 0:ea6cbd4e50ce 194 */
orivant 0:ea6cbd4e50ce 195 uint8_t getContrast() const;
orivant 0:ea6cbd4e50ce 196 private:
orivant 0:ea6cbd4e50ce 197 /** LCDコマンド単発書き込み
orivant 0:ea6cbd4e50ce 198 * @brief LCDのコマンドを一つ書き込み(実行し)ます。
orivant 0:ea6cbd4e50ce 199 * @param commandByte コマンド指定バイトデータ
orivant 0:ea6cbd4e50ce 200 */
orivant 0:ea6cbd4e50ce 201 void writeCommand(uint8_t commandByte);
orivant 0:ea6cbd4e50ce 202 /** LCDコマンド連続書き込み
orivant 0:ea6cbd4e50ce 203 * @brief LCDのコマンドを複数書き込み(実行し)ます。
orivant 0:ea6cbd4e50ce 204 * @param commandBytes コマンド指定バイトデータ配列
orivant 0:ea6cbd4e50ce 205 * @param commandCount コマンド指定バイトデータ数
orivant 0:ea6cbd4e50ce 206 */
orivant 0:ea6cbd4e50ce 207 void writeCommand(uint8_t commandBytes[], uint8_t commandCount);
orivant 0:ea6cbd4e50ce 208 /** LCDデータ単発書き込み
orivant 0:ea6cbd4e50ce 209 * @brief LCDのデータを一つ書き込み(実行し)ます。
orivant 0:ea6cbd4e50ce 210 * @param dataByte データ指定バイトデータ
orivant 0:ea6cbd4e50ce 211 */
orivant 0:ea6cbd4e50ce 212 void writeData(uint8_t dataByte);
orivant 0:ea6cbd4e50ce 213 /** LCDデータ連続書き込み
orivant 0:ea6cbd4e50ce 214 * @brief LCDのデータを複数書き込み(実行し)ます。
orivant 0:ea6cbd4e50ce 215 * @param dataBytes データ指定バイトデータ配列
orivant 0:ea6cbd4e50ce 216 * @param dataCount データ指定バイトデータ数
orivant 0:ea6cbd4e50ce 217 */
orivant 0:ea6cbd4e50ce 218 void writeData(uint8_t dataBytes[], uint8_t dataCount);
orivant 0:ea6cbd4e50ce 219
orivant 0:ea6cbd4e50ce 220
orivant 0:ea6cbd4e50ce 221 /** コントラスト設定用バイトデータ生成(上位ビット)
orivant 0:ea6cbd4e50ce 222 * @return コントラスト設定用バイトデータ(上位ビット)
orivant 0:ea6cbd4e50ce 223 */
orivant 0:ea6cbd4e50ce 224 uint8_t calcContrastSettingByteUpper() const;
orivant 0:ea6cbd4e50ce 225 /** コントラスト設定用バイトデータ生成(下位ビット)
orivant 0:ea6cbd4e50ce 226 * @return コントラスト設定用バイトデータ(下位ビット)
orivant 0:ea6cbd4e50ce 227 */
orivant 0:ea6cbd4e50ce 228 uint8_t calcContrastSettingByteLowwer() const;
orivant 0:ea6cbd4e50ce 229
orivant 0:ea6cbd4e50ce 230
orivant 0:ea6cbd4e50ce 231 /** ディスプレイ制御コマンド指定バイトデータの生成
orivant 0:ea6cbd4e50ce 232 * @param displayVisible ディスプレイ表示設定
orivant 0:ea6cbd4e50ce 233 * @param cursorVisible カーソル表示設定
orivant 0:ea6cbd4e50ce 234 * @param blinkEnable カーソル点滅設定
orivant 0:ea6cbd4e50ce 235 * @return コマンド指定バイトデータ
orivant 0:ea6cbd4e50ce 236 */
orivant 0:ea6cbd4e50ce 237 uint8_t calcDisplayControlByteData(bool displayVisible, bool cursorVisible, bool blinkEnable) const;
orivant 0:ea6cbd4e50ce 238 uint8_t calcDisplayControlByteData() const {
orivant 0:ea6cbd4e50ce 239 return calcDisplayControlByteData(m_displayVisible, m_cursorVisible, m_blinkEnable);
orivant 0:ea6cbd4e50ce 240 }
orivant 0:ea6cbd4e50ce 241
orivant 0:ea6cbd4e50ce 242
orivant 0:ea6cbd4e50ce 243 /** カーソル位置移動管理
orivant 0:ea6cbd4e50ce 244 * @brief カーソル位置を一つ進め、改行が発生するかを調べる
orivant 0:ea6cbd4e50ce 245 * @return 改行が発生する場合はtrue
orivant 0:ea6cbd4e50ce 246 */
orivant 0:ea6cbd4e50ce 247 bool incCursorPos();
orivant 0:ea6cbd4e50ce 248
orivant 0:ea6cbd4e50ce 249
orivant 0:ea6cbd4e50ce 250 /** カーソル位置のアドレス計算
orivant 0:ea6cbd4e50ce 251 * @param lineNo 行番号
orivant 0:ea6cbd4e50ce 252 * @param charaNo 文字番号
orivant 0:ea6cbd4e50ce 253 * @return アドレス
orivant 0:ea6cbd4e50ce 254 */
orivant 0:ea6cbd4e50ce 255 uint8_t calcCursorAddr(uint8_t lineNo, uint8_t charaNo);
orivant 0:ea6cbd4e50ce 256 };
orivant 0:ea6cbd4e50ce 257
orivant 0:ea6cbd4e50ce 258 #endif //!defined(LCD_AQM0802_H)