LCDモジュール ACM1602NI(I2C接続) を制御するライブラリ

Dependents:   scan2 BoxController

Committer:
orivant
Date:
Wed Dec 14 03:48:13 2016 +0000
Revision:
0:c7da9183f23a
Child:
9:96baac039a90
LCD????? ACM1602NI ???????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
orivant 0:c7da9183f23a 1 /** LCDモジュール ACM1602NI を制御するクラスの定義
orivant 0:c7da9183f23a 2 */
orivant 0:c7da9183f23a 3 #include "LcdAcm1602ni.h"
orivant 0:c7da9183f23a 4
orivant 0:c7da9183f23a 5 const uint8_t LcdAcm1602ni::LINE_HEAD_ADDR_TBL[LINE_COUNT] = {0x00, 0x40}; //!< 行の先頭アドレス
orivant 0:c7da9183f23a 6
orivant 0:c7da9183f23a 7 /** コンストラクタ
orivant 0:c7da9183f23a 8 */
orivant 0:c7da9183f23a 9 LcdAcm1602ni::LcdAcm1602ni(PinName pinSDA, PinName pinSCL)
orivant 0:c7da9183f23a 10 :m_pinSDA(pinSDA)
orivant 0:c7da9183f23a 11 ,m_pinSCL(pinSCL)
orivant 0:c7da9183f23a 12 ,m_i2c(pinSDA, pinSCL)
orivant 0:c7da9183f23a 13 ,m_currentLineNo(0)
orivant 0:c7da9183f23a 14 ,m_currentCharaNo(0)
orivant 0:c7da9183f23a 15 ,m_displayVisible(true)
orivant 0:c7da9183f23a 16 ,m_cursorVisible(false)
orivant 0:c7da9183f23a 17 ,m_blinkEnable(false)
orivant 0:c7da9183f23a 18 {
orivant 0:c7da9183f23a 19 }
orivant 0:c7da9183f23a 20 /** デストラクタ
orivant 0:c7da9183f23a 21 */
orivant 0:c7da9183f23a 22 LcdAcm1602ni::~LcdAcm1602ni()
orivant 0:c7da9183f23a 23 {
orivant 0:c7da9183f23a 24 }
orivant 0:c7da9183f23a 25
orivant 0:c7da9183f23a 26
orivant 0:c7da9183f23a 27 /** 初期化
orivant 0:c7da9183f23a 28 */
orivant 0:c7da9183f23a 29 void LcdAcm1602ni::initialize()
orivant 0:c7da9183f23a 30 {
orivant 0:c7da9183f23a 31 // I2C通信の周波数設定
orivant 0:c7da9183f23a 32 m_i2c.frequency(I2C_MAX_FREQUENCY);
orivant 0:c7da9183f23a 33
orivant 0:c7da9183f23a 34 uint8_t command;
orivant 0:c7da9183f23a 35
orivant 0:c7da9183f23a 36 // ディスプレイを消す
orivant 0:c7da9183f23a 37 command = calcDisplayControlByteData(false, false, false);
orivant 0:c7da9183f23a 38 writeCommand(command);
orivant 0:c7da9183f23a 39 wait_us(53);
orivant 0:c7da9183f23a 40
orivant 0:c7da9183f23a 41 // ファンクション設定(0011[8bitモード]1[2行モード]0[文字5x8表示モー]00 = 00111000 = 0x38)
orivant 0:c7da9183f23a 42 writeCommand(0x38);
orivant 0:c7da9183f23a 43 wait_us(53);
orivant 0:c7da9183f23a 44
orivant 0:c7da9183f23a 45 // 画面クリア(00000001 = 0x01)
orivant 0:c7da9183f23a 46 writeCommand(0x01);
orivant 0:c7da9183f23a 47 wait_us(2160);
orivant 0:c7da9183f23a 48
orivant 0:c7da9183f23a 49 // データ書き込み後アドレス加算モード設定(0000011[インクリメント]0 = 00000110 = 0x06)
orivant 0:c7da9183f23a 50 writeCommand(0x06);
orivant 0:c7da9183f23a 51 wait_us(53);
orivant 0:c7da9183f23a 52
orivant 0:c7da9183f23a 53 // ディスプレイ表示
orivant 0:c7da9183f23a 54 command = calcDisplayControlByteData();
orivant 0:c7da9183f23a 55 writeCommand(command);
orivant 0:c7da9183f23a 56 wait_us(53);
orivant 0:c7da9183f23a 57
orivant 0:c7da9183f23a 58 }
orivant 0:c7da9183f23a 59
orivant 0:c7da9183f23a 60
orivant 0:c7da9183f23a 61 /** 1文字描画
orivant 0:c7da9183f23a 62 */
orivant 0:c7da9183f23a 63 void LcdAcm1602ni::putc(char c)
orivant 0:c7da9183f23a 64 {
orivant 0:c7da9183f23a 65 // 1文字書き込み
orivant 0:c7da9183f23a 66 writeData(c);
orivant 0:c7da9183f23a 67 // カーソル位置管理処理
orivant 0:c7da9183f23a 68 bool ret = incCursorPos();
orivant 0:c7da9183f23a 69 if (ret) {
orivant 0:c7da9183f23a 70 // 復帰・改行が発生したのでカーソル位置変更
orivant 0:c7da9183f23a 71 uint8_t addr = calcCursorAddr(m_currentLineNo, m_currentCharaNo);
orivant 0:c7da9183f23a 72 writeCommand(0x80 | addr);
orivant 0:c7da9183f23a 73 }
orivant 0:c7da9183f23a 74 }
orivant 0:c7da9183f23a 75 /** 文字列描画
orivant 0:c7da9183f23a 76 */
orivant 0:c7da9183f23a 77 void LcdAcm1602ni::puts(const char* pStr)
orivant 0:c7da9183f23a 78 {
orivant 0:c7da9183f23a 79 uint8_t addr;
orivant 0:c7da9183f23a 80 bool ret;
orivant 0:c7da9183f23a 81 const char* pt = pStr;
orivant 0:c7da9183f23a 82 bool stayLocate = false;
orivant 0:c7da9183f23a 83 while (*pt) {
orivant 0:c7da9183f23a 84 const char &c = *pt;
orivant 0:c7da9183f23a 85 if (c == '\r') {
orivant 0:c7da9183f23a 86 // 復帰コードの場合、行の先頭にカーソルを移動する
orivant 0:c7da9183f23a 87 m_currentCharaNo = 0;
orivant 0:c7da9183f23a 88 // 実際の移動処理は後で行う
orivant 0:c7da9183f23a 89 stayLocate = true;
orivant 0:c7da9183f23a 90 }
orivant 0:c7da9183f23a 91 else if (c == '\n') {
orivant 0:c7da9183f23a 92 // 改行コードの場合、次の行にカーソルを移動する
orivant 0:c7da9183f23a 93 m_currentLineNo = (m_currentLineNo + 1) % LINE_COUNT;
orivant 0:c7da9183f23a 94 // 実際の移動処理は後で行う
orivant 0:c7da9183f23a 95 stayLocate = true;
orivant 0:c7da9183f23a 96 }
orivant 0:c7da9183f23a 97 else {
orivant 0:c7da9183f23a 98 // 通常の文字コードの場合
orivant 0:c7da9183f23a 99 if (stayLocate) {
orivant 0:c7da9183f23a 100 // 復帰・改行の予約がある場合は先に処理
orivant 0:c7da9183f23a 101 addr = calcCursorAddr(m_currentLineNo, m_currentCharaNo);
orivant 0:c7da9183f23a 102 writeCommand(0x80 | addr);
orivant 0:c7da9183f23a 103 stayLocate = false;
orivant 0:c7da9183f23a 104 }
orivant 0:c7da9183f23a 105 // 1文字書き込み
orivant 0:c7da9183f23a 106 writeData(c);
orivant 0:c7da9183f23a 107 // カーソル位置管理処理
orivant 0:c7da9183f23a 108 ret = incCursorPos();
orivant 0:c7da9183f23a 109 if (ret) {
orivant 0:c7da9183f23a 110 // 改行が発生したのでカーソル位置変更
orivant 0:c7da9183f23a 111 // 実際の移動処理は後で行う
orivant 0:c7da9183f23a 112 stayLocate = true;
orivant 0:c7da9183f23a 113 }
orivant 0:c7da9183f23a 114 }
orivant 0:c7da9183f23a 115 pt++;
orivant 0:c7da9183f23a 116 }
orivant 0:c7da9183f23a 117 if (stayLocate) {
orivant 0:c7da9183f23a 118 // 復帰・改行の予約が残っている場合は処理する
orivant 0:c7da9183f23a 119 addr = calcCursorAddr(m_currentLineNo, m_currentCharaNo);
orivant 0:c7da9183f23a 120 writeCommand(0x80 | addr);
orivant 0:c7da9183f23a 121 }
orivant 0:c7da9183f23a 122 }
orivant 0:c7da9183f23a 123 /** フォーマット指定描画
orivant 0:c7da9183f23a 124 */
orivant 0:c7da9183f23a 125 void LcdAcm1602ni::printf(const char* pFormat, ...)
orivant 0:c7da9183f23a 126 {
orivant 0:c7da9183f23a 127 va_list ap;
orivant 0:c7da9183f23a 128 va_start(ap, pFormat);
orivant 0:c7da9183f23a 129 char* allocatedBuffer;
orivant 0:c7da9183f23a 130 int size = vasprintf(&allocatedBuffer, pFormat, ap);
orivant 0:c7da9183f23a 131 va_end(ap);
orivant 0:c7da9183f23a 132 puts(allocatedBuffer);
orivant 0:c7da9183f23a 133 free(allocatedBuffer);
orivant 0:c7da9183f23a 134 }
orivant 0:c7da9183f23a 135
orivant 0:c7da9183f23a 136
orivant 0:c7da9183f23a 137 /** カーソル位置変更
orivant 0:c7da9183f23a 138 */
orivant 0:c7da9183f23a 139 void LcdAcm1602ni::locate(uint8_t lineNo, uint8_t charaNo)
orivant 0:c7da9183f23a 140 {
orivant 0:c7da9183f23a 141 if (lineNo >= LINE_COUNT) lineNo = LINE_COUNT - 1;
orivant 0:c7da9183f23a 142 if (charaNo >= LINE_CHARA_COUNT) charaNo = LINE_CHARA_COUNT - 1;
orivant 0:c7da9183f23a 143 m_currentLineNo = lineNo;
orivant 0:c7da9183f23a 144 m_currentCharaNo = charaNo;
orivant 0:c7da9183f23a 145 uint8_t addr = calcCursorAddr(m_currentLineNo, m_currentCharaNo);
orivant 0:c7da9183f23a 146 writeCommand(0x80 | addr);
orivant 0:c7da9183f23a 147 }
orivant 0:c7da9183f23a 148 /** カーソル位置取得:行番号
orivant 0:c7da9183f23a 149 */
orivant 0:c7da9183f23a 150 uint8_t LcdAcm1602ni::getCurrentLineNo() const
orivant 0:c7da9183f23a 151 {
orivant 0:c7da9183f23a 152 return m_currentLineNo;
orivant 0:c7da9183f23a 153 }
orivant 0:c7da9183f23a 154 /** カーソル位置取得:文字番号
orivant 0:c7da9183f23a 155 */
orivant 0:c7da9183f23a 156 uint8_t LcdAcm1602ni::getCurrentCharaNo() const
orivant 0:c7da9183f23a 157 {
orivant 0:c7da9183f23a 158 return m_currentCharaNo;
orivant 0:c7da9183f23a 159 }
orivant 0:c7da9183f23a 160
orivant 0:c7da9183f23a 161
orivant 0:c7da9183f23a 162 /** 画面クリア
orivant 0:c7da9183f23a 163 */
orivant 0:c7da9183f23a 164 void LcdAcm1602ni::clearDisplay()
orivant 0:c7da9183f23a 165 {
orivant 0:c7da9183f23a 166 writeCommand(0x01);
orivant 0:c7da9183f23a 167 wait_us(2160);
orivant 0:c7da9183f23a 168 }
orivant 0:c7da9183f23a 169 /** 行クリア
orivant 0:c7da9183f23a 170 */
orivant 0:c7da9183f23a 171 void LcdAcm1602ni::clearLine(uint8_t lineNo)
orivant 0:c7da9183f23a 172 {
orivant 0:c7da9183f23a 173 if (lineNo >= LINE_COUNT) return;
orivant 0:c7da9183f23a 174
orivant 0:c7da9183f23a 175 // クリアする行の先頭に移動
orivant 0:c7da9183f23a 176 uint8_t addr = calcCursorAddr(lineNo, 0);
orivant 0:c7da9183f23a 177 writeCommand(0x80 | addr);
orivant 0:c7da9183f23a 178 // 1行全体に' '書き込み
orivant 0:c7da9183f23a 179 for (uint8_t i = 0; i < LINE_CHARA_COUNT; i++) {
orivant 0:c7da9183f23a 180 writeData(' ');
orivant 0:c7da9183f23a 181 }
orivant 0:c7da9183f23a 182 // カーソル位置をクリアした行の先頭に移動
orivant 0:c7da9183f23a 183 m_currentLineNo = lineNo;
orivant 0:c7da9183f23a 184 m_currentCharaNo = 0;
orivant 0:c7da9183f23a 185 addr = calcCursorAddr(m_currentLineNo, m_currentCharaNo);
orivant 0:c7da9183f23a 186 writeCommand(0x80 | addr);
orivant 0:c7da9183f23a 187 }
orivant 0:c7da9183f23a 188 /** 範囲クリア
orivant 0:c7da9183f23a 189 */
orivant 0:c7da9183f23a 190 void LcdAcm1602ni::clearRange(uint8_t startLineNo, uint8_t startCharaNo, uint8_t endLineNo, uint8_t endCharaNo)
orivant 0:c7da9183f23a 191 {
orivant 0:c7da9183f23a 192 if (startLineNo >= LINE_COUNT) return;
orivant 0:c7da9183f23a 193 if (startCharaNo >= LINE_CHARA_COUNT) return;
orivant 0:c7da9183f23a 194 if (startLineNo > endLineNo) return;
orivant 0:c7da9183f23a 195 if (startCharaNo > endCharaNo) return;
orivant 0:c7da9183f23a 196 if (endLineNo >= LINE_COUNT) endLineNo = LINE_COUNT - 1;
orivant 0:c7da9183f23a 197 if (endCharaNo >= LINE_CHARA_COUNT) endCharaNo = LINE_CHARA_COUNT - 1;
orivant 0:c7da9183f23a 198
orivant 0:c7da9183f23a 199 uint8_t addr;
orivant 0:c7da9183f23a 200 for (uint8_t lineNo = startLineNo; lineNo <= endLineNo; lineNo++) {
orivant 0:c7da9183f23a 201 // 対象行の削除開始位置にカーソル移動
orivant 0:c7da9183f23a 202 addr = calcCursorAddr(lineNo, startCharaNo);
orivant 0:c7da9183f23a 203 writeCommand(0x80 | addr);
orivant 0:c7da9183f23a 204 // 消す範囲に' 'を書き込み
orivant 0:c7da9183f23a 205 for (uint8_t charaNo = startCharaNo; charaNo <= endCharaNo; charaNo++) {
orivant 0:c7da9183f23a 206 writeData(' ');
orivant 0:c7da9183f23a 207 }
orivant 0:c7da9183f23a 208 }
orivant 0:c7da9183f23a 209 // クリアした範囲の開始位置にカーソルを移動
orivant 0:c7da9183f23a 210 m_currentLineNo = startLineNo;
orivant 0:c7da9183f23a 211 m_currentCharaNo = startCharaNo;
orivant 0:c7da9183f23a 212 addr = calcCursorAddr(m_currentLineNo, m_currentCharaNo);
orivant 0:c7da9183f23a 213 writeCommand(0x80 | addr);
orivant 0:c7da9183f23a 214 }
orivant 0:c7da9183f23a 215
orivant 0:c7da9183f23a 216
orivant 0:c7da9183f23a 217 /** 画面の表示設定
orivant 0:c7da9183f23a 218 */
orivant 0:c7da9183f23a 219 void LcdAcm1602ni::setDisplayVisible(bool visible)
orivant 0:c7da9183f23a 220 {
orivant 0:c7da9183f23a 221 if (m_displayVisible == visible) return;
orivant 0:c7da9183f23a 222 m_displayVisible = visible;
orivant 0:c7da9183f23a 223 uint8_t command = calcDisplayControlByteData();
orivant 0:c7da9183f23a 224 writeCommand(command);
orivant 0:c7da9183f23a 225 }
orivant 0:c7da9183f23a 226 /** 画面の表示設定取得
orivant 0:c7da9183f23a 227 */
orivant 0:c7da9183f23a 228 bool LcdAcm1602ni::getDisplayVisible() const
orivant 0:c7da9183f23a 229 {
orivant 0:c7da9183f23a 230 return m_displayVisible;
orivant 0:c7da9183f23a 231 }
orivant 0:c7da9183f23a 232 /** カーソルの表示設定
orivant 0:c7da9183f23a 233 */
orivant 0:c7da9183f23a 234 void LcdAcm1602ni::setCursorVisible(bool visible)
orivant 0:c7da9183f23a 235 {
orivant 0:c7da9183f23a 236 if (m_cursorVisible == visible) return;
orivant 0:c7da9183f23a 237 m_cursorVisible = visible;
orivant 0:c7da9183f23a 238 uint8_t command = calcDisplayControlByteData();
orivant 0:c7da9183f23a 239 writeCommand(command);
orivant 0:c7da9183f23a 240 }
orivant 0:c7da9183f23a 241 /** カーソルの表示設定取得
orivant 0:c7da9183f23a 242 */
orivant 0:c7da9183f23a 243 bool LcdAcm1602ni::getCursorVisible() const
orivant 0:c7da9183f23a 244 {
orivant 0:c7da9183f23a 245 return m_cursorVisible;
orivant 0:c7da9183f23a 246 }
orivant 0:c7da9183f23a 247 /** カーソルの点滅設定
orivant 0:c7da9183f23a 248 */
orivant 0:c7da9183f23a 249 void LcdAcm1602ni::setBlinkEnable(bool enable)
orivant 0:c7da9183f23a 250 {
orivant 0:c7da9183f23a 251 if (m_blinkEnable == enable) return;
orivant 0:c7da9183f23a 252 m_blinkEnable = enable;
orivant 0:c7da9183f23a 253 uint8_t command = calcDisplayControlByteData();
orivant 0:c7da9183f23a 254 writeCommand(command);
orivant 0:c7da9183f23a 255 }
orivant 0:c7da9183f23a 256 /** カーソルの点滅設定取得
orivant 0:c7da9183f23a 257 */
orivant 0:c7da9183f23a 258 bool LcdAcm1602ni::getBlinkEnable() const
orivant 0:c7da9183f23a 259 {
orivant 0:c7da9183f23a 260 return m_blinkEnable;
orivant 0:c7da9183f23a 261 }
orivant 0:c7da9183f23a 262
orivant 0:c7da9183f23a 263
orivant 0:c7da9183f23a 264 /** LCDコマンド書き込み
orivant 0:c7da9183f23a 265 */
orivant 0:c7da9183f23a 266 void LcdAcm1602ni::writeCommand(uint8_t commandByte)
orivant 0:c7da9183f23a 267 {
orivant 0:c7da9183f23a 268 m_i2c.start();
orivant 0:c7da9183f23a 269 m_i2c.write(ADDR_BYTE_WRITE);
orivant 0:c7da9183f23a 270 m_i2c.write(CTRL_BYTE_COMMAND);
orivant 0:c7da9183f23a 271 m_i2c.write(commandByte);
orivant 0:c7da9183f23a 272 m_i2c.stop();
orivant 0:c7da9183f23a 273 }
orivant 0:c7da9183f23a 274 /** LCDデータ書き込み
orivant 0:c7da9183f23a 275 */
orivant 0:c7da9183f23a 276 void LcdAcm1602ni::writeData(uint8_t dataByte)
orivant 0:c7da9183f23a 277 {
orivant 0:c7da9183f23a 278 m_i2c.start();
orivant 0:c7da9183f23a 279 m_i2c.write(ADDR_BYTE_WRITE);
orivant 0:c7da9183f23a 280 m_i2c.write(CTRL_BYTE_DATA);
orivant 0:c7da9183f23a 281 m_i2c.write(dataByte);
orivant 0:c7da9183f23a 282 m_i2c.stop();
orivant 0:c7da9183f23a 283 }
orivant 0:c7da9183f23a 284
orivant 0:c7da9183f23a 285
orivant 0:c7da9183f23a 286 /** ディスプレイ制御コマンド指定バイトデータの生成
orivant 0:c7da9183f23a 287 */
orivant 0:c7da9183f23a 288 uint8_t LcdAcm1602ni::calcDisplayControlByteData(bool displayVisible, bool cursorVisible, bool blinkEnable) const
orivant 0:c7da9183f23a 289 {
orivant 0:c7da9183f23a 290 uint8_t byteData = 0x08;
orivant 0:c7da9183f23a 291 if (displayVisible) byteData |= 0x04;
orivant 0:c7da9183f23a 292 if (cursorVisible) byteData |= 0x02;
orivant 0:c7da9183f23a 293 if (blinkEnable) byteData |= 0x01;
orivant 0:c7da9183f23a 294 return byteData;
orivant 0:c7da9183f23a 295 }
orivant 0:c7da9183f23a 296
orivant 0:c7da9183f23a 297
orivant 0:c7da9183f23a 298 /** カーソル位置移動管理
orivant 0:c7da9183f23a 299 */
orivant 0:c7da9183f23a 300 bool LcdAcm1602ni::incCursorPos()
orivant 0:c7da9183f23a 301 {
orivant 0:c7da9183f23a 302 m_currentCharaNo++;
orivant 0:c7da9183f23a 303 if (m_currentCharaNo >= LINE_CHARA_COUNT) {
orivant 0:c7da9183f23a 304 m_currentCharaNo = 0;
orivant 0:c7da9183f23a 305 m_currentLineNo = (m_currentLineNo + 1) % LINE_COUNT;
orivant 0:c7da9183f23a 306 return true;
orivant 0:c7da9183f23a 307 }
orivant 0:c7da9183f23a 308 return false;
orivant 0:c7da9183f23a 309 }
orivant 0:c7da9183f23a 310
orivant 0:c7da9183f23a 311
orivant 0:c7da9183f23a 312 /** カーソル位置のアドレス計算
orivant 0:c7da9183f23a 313 */
orivant 0:c7da9183f23a 314 uint8_t LcdAcm1602ni::calcCursorAddr(uint8_t lineNo, uint8_t charaNo)
orivant 0:c7da9183f23a 315 {
orivant 0:c7da9183f23a 316 uint8_t addr = LINE_HEAD_ADDR_TBL[lineNo] + charaNo;
orivant 0:c7da9183f23a 317 return addr;
orivant 0:c7da9183f23a 318 }