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

Dependents:   scan2 BoxController

Committer:
orivant
Date:
Thu Dec 15 06:02:13 2016 +0000
Revision:
9:96baac039a90
Parent:
0:c7da9183f23a
Child:
10:4ceccdba0248
????????

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