I2C LCD SPLC792A
SPLC792A_I2C.cpp@0:070d3d0b6f37, 2017-03-18 (annotated)
- Committer:
- Yajirushi
- Date:
- Sat Mar 18 01:41:30 2017 +0000
- Revision:
- 0:070d3d0b6f37
first commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Yajirushi | 0:070d3d0b6f37 | 1 | #include "SPLC792A_I2C.h" |
Yajirushi | 0:070d3d0b6f37 | 2 | |
Yajirushi | 0:070d3d0b6f37 | 3 | LCDI2C_SPLC792A::LCDI2C_SPLC792A(PinName i2c_SDA, PinName i2c_SCL, unsigned char lcd_LOOP){ |
Yajirushi | 0:070d3d0b6f37 | 4 | lcdCols = LCD_COLS; |
Yajirushi | 0:070d3d0b6f37 | 5 | lcdRows = LCD_ROWS; |
Yajirushi | 0:070d3d0b6f37 | 6 | |
Yajirushi | 0:070d3d0b6f37 | 7 | lcd = new I2C(i2c_SDA, i2c_SCL); |
Yajirushi | 0:070d3d0b6f37 | 8 | |
Yajirushi | 0:070d3d0b6f37 | 9 | loopMode = (lcd_LOOP > 2) ? 2 : lcd_LOOP; |
Yajirushi | 0:070d3d0b6f37 | 10 | |
Yajirushi | 0:070d3d0b6f37 | 11 | box[0] = 0; |
Yajirushi | 0:070d3d0b6f37 | 12 | box[1] = 0; |
Yajirushi | 0:070d3d0b6f37 | 13 | i2c_addr = SPLC792A_I2C_SLAVEADDR << 1; //mbedはスレーブアドレスが8bitなので左シフトする |
Yajirushi | 0:070d3d0b6f37 | 14 | wait_ms(50); |
Yajirushi | 0:070d3d0b6f37 | 15 | lcd->frequency(SPLC792A_I2C_FREQ); |
Yajirushi | 0:070d3d0b6f37 | 16 | } |
Yajirushi | 0:070d3d0b6f37 | 17 | |
Yajirushi | 0:070d3d0b6f37 | 18 | LCDI2C_SPLC792A::LCDI2C_SPLC792A(unsigned char lcd_Cols, unsigned char lcd_Rows, PinName i2c_SDA, PinName i2c_SCL, unsigned char lcd_LOOP){ |
Yajirushi | 0:070d3d0b6f37 | 19 | lcdCols = lcd_Cols; |
Yajirushi | 0:070d3d0b6f37 | 20 | lcdRows = lcd_Rows; |
Yajirushi | 0:070d3d0b6f37 | 21 | |
Yajirushi | 0:070d3d0b6f37 | 22 | lcd = new I2C(i2c_SDA, i2c_SCL); |
Yajirushi | 0:070d3d0b6f37 | 23 | |
Yajirushi | 0:070d3d0b6f37 | 24 | loopMode = (lcd_LOOP > 2) ? 2 : lcd_LOOP; |
Yajirushi | 0:070d3d0b6f37 | 25 | |
Yajirushi | 0:070d3d0b6f37 | 26 | box[0] = 0; |
Yajirushi | 0:070d3d0b6f37 | 27 | box[1] = 0; |
Yajirushi | 0:070d3d0b6f37 | 28 | i2c_addr = SPLC792A_I2C_SLAVEADDR << 1; //mbedはスレーブアドレスが8bitなので左シフトする |
Yajirushi | 0:070d3d0b6f37 | 29 | wait_ms(50); |
Yajirushi | 0:070d3d0b6f37 | 30 | lcd->frequency(SPLC792A_I2C_FREQ); |
Yajirushi | 0:070d3d0b6f37 | 31 | } |
Yajirushi | 0:070d3d0b6f37 | 32 | |
Yajirushi | 0:070d3d0b6f37 | 33 | LCDI2C_SPLC792A::~LCDI2C_SPLC792A(){ |
Yajirushi | 0:070d3d0b6f37 | 34 | delete lcd; |
Yajirushi | 0:070d3d0b6f37 | 35 | } |
Yajirushi | 0:070d3d0b6f37 | 36 | |
Yajirushi | 0:070d3d0b6f37 | 37 | void LCDI2C_SPLC792A::sendCmd(char Lbyte){ |
Yajirushi | 0:070d3d0b6f37 | 38 | //A0 bit = 0 then Command |
Yajirushi | 0:070d3d0b6f37 | 39 | box[0] = 0x00; |
Yajirushi | 0:070d3d0b6f37 | 40 | box[1] = Lbyte; |
Yajirushi | 0:070d3d0b6f37 | 41 | lcd->write(i2c_addr, box, 2); |
Yajirushi | 0:070d3d0b6f37 | 42 | } |
Yajirushi | 0:070d3d0b6f37 | 43 | |
Yajirushi | 0:070d3d0b6f37 | 44 | void LCDI2C_SPLC792A::sendVal(char Lbyte){ |
Yajirushi | 0:070d3d0b6f37 | 45 | //A0 bit = 1 then Data Value |
Yajirushi | 0:070d3d0b6f37 | 46 | box[0] = 0x40; |
Yajirushi | 0:070d3d0b6f37 | 47 | box[1] = Lbyte; |
Yajirushi | 0:070d3d0b6f37 | 48 | lcd->write(i2c_addr, box, 2); |
Yajirushi | 0:070d3d0b6f37 | 49 | } |
Yajirushi | 0:070d3d0b6f37 | 50 | |
Yajirushi | 0:070d3d0b6f37 | 51 | void LCDI2C_SPLC792A::init(){ |
Yajirushi | 0:070d3d0b6f37 | 52 | //カーソルカウンタを初期化 |
Yajirushi | 0:070d3d0b6f37 | 53 | nowRow = 1; |
Yajirushi | 0:070d3d0b6f37 | 54 | nowCol = 1; |
Yajirushi | 0:070d3d0b6f37 | 55 | //各モードの初期化 |
Yajirushi | 0:070d3d0b6f37 | 56 | sendCmd(0x3F); //Data-transfer 8bit mode, Two-Lines Display |
Yajirushi | 0:070d3d0b6f37 | 57 | wait_us(15); |
Yajirushi | 0:070d3d0b6f37 | 58 | sendCmd(0x39); //DoubleHeightMode = false, 5x8 dots x Two-Lines |
Yajirushi | 0:070d3d0b6f37 | 59 | wait_us(15); |
Yajirushi | 0:070d3d0b6f37 | 60 | nowContrast = SPLC792A_DEFAULT_CONTRAST; |
Yajirushi | 0:070d3d0b6f37 | 61 | sendCmd(0x50 | ((nowContrast & 30) >> 4)); //LCD Contrast setting High-2bit |
Yajirushi | 0:070d3d0b6f37 | 62 | sendCmd(0x70 | (nowContrast & 0x0F)); //LCD Contrast setting Low-4bit |
Yajirushi | 0:070d3d0b6f37 | 63 | sendCmd(0x60 | 0x04); //Set LCD voltage: 3.636V(default 3.333V) |
Yajirushi | 0:070d3d0b6f37 | 64 | wait_us(15); |
Yajirushi | 0:070d3d0b6f37 | 65 | sendCmd(0x0D); //Display ON, Blink ON, Cursor OFF |
Yajirushi | 0:070d3d0b6f37 | 66 | sendCmd(0x01); //Clear Display |
Yajirushi | 0:070d3d0b6f37 | 67 | } |
Yajirushi | 0:070d3d0b6f37 | 68 | |
Yajirushi | 0:070d3d0b6f37 | 69 | void LCDI2C_SPLC792A::reset(){ |
Yajirushi | 0:070d3d0b6f37 | 70 | init(); |
Yajirushi | 0:070d3d0b6f37 | 71 | wait_ms(5); |
Yajirushi | 0:070d3d0b6f37 | 72 | } |
Yajirushi | 0:070d3d0b6f37 | 73 | |
Yajirushi | 0:070d3d0b6f37 | 74 | void LCDI2C_SPLC792A::cls(){ |
Yajirushi | 0:070d3d0b6f37 | 75 | sendCmd(0x01); |
Yajirushi | 0:070d3d0b6f37 | 76 | wait_ms(5); |
Yajirushi | 0:070d3d0b6f37 | 77 | } |
Yajirushi | 0:070d3d0b6f37 | 78 | |
Yajirushi | 0:070d3d0b6f37 | 79 | void LCDI2C_SPLC792A::clear(){ |
Yajirushi | 0:070d3d0b6f37 | 80 | cls(); |
Yajirushi | 0:070d3d0b6f37 | 81 | } |
Yajirushi | 0:070d3d0b6f37 | 82 | |
Yajirushi | 0:070d3d0b6f37 | 83 | void LCDI2C_SPLC792A::home(){ |
Yajirushi | 0:070d3d0b6f37 | 84 | nowRow = 1; |
Yajirushi | 0:070d3d0b6f37 | 85 | nowCol = 1; |
Yajirushi | 0:070d3d0b6f37 | 86 | sendCmd(0x02); |
Yajirushi | 0:070d3d0b6f37 | 87 | wait_ms(5); |
Yajirushi | 0:070d3d0b6f37 | 88 | } |
Yajirushi | 0:070d3d0b6f37 | 89 | |
Yajirushi | 0:070d3d0b6f37 | 90 | void LCDI2C_SPLC792A::setCharCode(const char characterCode){ |
Yajirushi | 0:070d3d0b6f37 | 91 | //ASCII code (e.g. A = 0x41, z = 0x7a) |
Yajirushi | 0:070d3d0b6f37 | 92 | sendVal(characterCode); |
Yajirushi | 0:070d3d0b6f37 | 93 | nowCol++; |
Yajirushi | 0:070d3d0b6f37 | 94 | |
Yajirushi | 0:070d3d0b6f37 | 95 | //画面右端にカーソルが来ていたら |
Yajirushi | 0:070d3d0b6f37 | 96 | if(nowCol > lcdCols && loopMode != 0){ |
Yajirushi | 0:070d3d0b6f37 | 97 | if(loopMode == 1){ //モード1:同じ行の先頭に戻る |
Yajirushi | 0:070d3d0b6f37 | 98 | nowCol = 1; |
Yajirushi | 0:070d3d0b6f37 | 99 | setCursorfromAddr((nowRow == 1)?0x00:0x40); |
Yajirushi | 0:070d3d0b6f37 | 100 | }else if(loopMode == 2){ //モード2:別の行の先頭に戻る |
Yajirushi | 0:070d3d0b6f37 | 101 | nowRow = (nowRow%LCD_ROWS)+1; |
Yajirushi | 0:070d3d0b6f37 | 102 | nowCol = 1; |
Yajirushi | 0:070d3d0b6f37 | 103 | setCursorfromAddr((nowRow == 1)?0x00:0x40); |
Yajirushi | 0:070d3d0b6f37 | 104 | } |
Yajirushi | 0:070d3d0b6f37 | 105 | } |
Yajirushi | 0:070d3d0b6f37 | 106 | } |
Yajirushi | 0:070d3d0b6f37 | 107 | |
Yajirushi | 0:070d3d0b6f37 | 108 | void LCDI2C_SPLC792A::writeString(const char *str, unsigned short dispWaitTime_ms){ |
Yajirushi | 0:070d3d0b6f37 | 109 | while(*str){ |
Yajirushi | 0:070d3d0b6f37 | 110 | setCharCode(*str); |
Yajirushi | 0:070d3d0b6f37 | 111 | str++; |
Yajirushi | 0:070d3d0b6f37 | 112 | if(dispWaitTime_ms < 1) continue; |
Yajirushi | 0:070d3d0b6f37 | 113 | wait_ms((*str == ' ') ? dispWaitTime_ms << 1 : dispWaitTime_ms); |
Yajirushi | 0:070d3d0b6f37 | 114 | } |
Yajirushi | 0:070d3d0b6f37 | 115 | } |
Yajirushi | 0:070d3d0b6f37 | 116 | |
Yajirushi | 0:070d3d0b6f37 | 117 | void LCDI2C_SPLC792A::print(const char *str, unsigned short dispWaitTime_ms){ |
Yajirushi | 0:070d3d0b6f37 | 118 | writeString(str, dispWaitTime_ms); |
Yajirushi | 0:070d3d0b6f37 | 119 | } |
Yajirushi | 0:070d3d0b6f37 | 120 | |
Yajirushi | 0:070d3d0b6f37 | 121 | void LCDI2C_SPLC792A::write(const char *str, unsigned short dispWaitTime_ms){ |
Yajirushi | 0:070d3d0b6f37 | 122 | writeString(str, dispWaitTime_ms); |
Yajirushi | 0:070d3d0b6f37 | 123 | } |
Yajirushi | 0:070d3d0b6f37 | 124 | |
Yajirushi | 0:070d3d0b6f37 | 125 | void LCDI2C_SPLC792A::o(const char *str, unsigned short dispWaitTime_ms){ |
Yajirushi | 0:070d3d0b6f37 | 126 | writeString(str, dispWaitTime_ms); |
Yajirushi | 0:070d3d0b6f37 | 127 | } |
Yajirushi | 0:070d3d0b6f37 | 128 | |
Yajirushi | 0:070d3d0b6f37 | 129 | void LCDI2C_SPLC792A::setCursorfromAddr(char cursorAddr){ |
Yajirushi | 0:070d3d0b6f37 | 130 | if(cursorAddr < 0x00 || cursorAddr > 0x67) cursorAddr = 0x67; |
Yajirushi | 0:070d3d0b6f37 | 131 | if(cursorAddr > 0x27 && cursorAddr < 0x40) cursorAddr = 0x67; |
Yajirushi | 0:070d3d0b6f37 | 132 | sendCmd(0x80 | cursorAddr); |
Yajirushi | 0:070d3d0b6f37 | 133 | wait_us(20); |
Yajirushi | 0:070d3d0b6f37 | 134 | } |
Yajirushi | 0:070d3d0b6f37 | 135 | |
Yajirushi | 0:070d3d0b6f37 | 136 | void LCDI2C_SPLC792A::setCursorfromColRow(unsigned char col, unsigned char row){ |
Yajirushi | 0:070d3d0b6f37 | 137 | col = (col == 0) ? 1 : (col > lcdCols) ? lcdCols : col; |
Yajirushi | 0:070d3d0b6f37 | 138 | row = (row == 0) ? 1 : (row > lcdRows) ? lcdRows : row; |
Yajirushi | 0:070d3d0b6f37 | 139 | nowCol = col; |
Yajirushi | 0:070d3d0b6f37 | 140 | nowRow = row; |
Yajirushi | 0:070d3d0b6f37 | 141 | setCursorfromAddr(((row == 1) ? 0x00 : 0x40) | (col - 1)); |
Yajirushi | 0:070d3d0b6f37 | 142 | } |
Yajirushi | 0:070d3d0b6f37 | 143 | |
Yajirushi | 0:070d3d0b6f37 | 144 | void LCDI2C_SPLC792A::setCursor(unsigned char x, unsigned char y){ |
Yajirushi | 0:070d3d0b6f37 | 145 | setCursorfromColRow(x, y); |
Yajirushi | 0:070d3d0b6f37 | 146 | } |
Yajirushi | 0:070d3d0b6f37 | 147 | |
Yajirushi | 0:070d3d0b6f37 | 148 | void LCDI2C_SPLC792A::setDisplay(bool display_on, bool cursor_underbar_on, bool blink_on){ |
Yajirushi | 0:070d3d0b6f37 | 149 | sendCmd(0x08 | (display_on?4:0 | cursor_underbar_on?2:0 | blink_on?1:0)); |
Yajirushi | 0:070d3d0b6f37 | 150 | wait_us(20); |
Yajirushi | 0:070d3d0b6f37 | 151 | } |
Yajirushi | 0:070d3d0b6f37 | 152 | |
Yajirushi | 0:070d3d0b6f37 | 153 | void LCDI2C_SPLC792A::setEntryMode(bool shift_on, bool isIncrement){ |
Yajirushi | 0:070d3d0b6f37 | 154 | sendCmd(0x04 | shift_on?2:0 | isIncrement?1:0); |
Yajirushi | 0:070d3d0b6f37 | 155 | wait_us(20); |
Yajirushi | 0:070d3d0b6f37 | 156 | } |
Yajirushi | 0:070d3d0b6f37 | 157 | |
Yajirushi | 0:070d3d0b6f37 | 158 | void LCDI2C_SPLC792A::setFunction(bool isTwoLineLCD, bool isDoubleHeightMode){ |
Yajirushi | 0:070d3d0b6f37 | 159 | sendCmd(0x20 | isDoubleHeightMode?16:0 | isTwoLineLCD?8:0); |
Yajirushi | 0:070d3d0b6f37 | 160 | wait_us(15); |
Yajirushi | 0:070d3d0b6f37 | 161 | sendCmd(0x21 | isDoubleHeightMode?16:0 | isTwoLineLCD?8:0); |
Yajirushi | 0:070d3d0b6f37 | 162 | wait_us(15); |
Yajirushi | 0:070d3d0b6f37 | 163 | } |
Yajirushi | 0:070d3d0b6f37 | 164 | |
Yajirushi | 0:070d3d0b6f37 | 165 | void LCDI2C_SPLC792A::setShift(bool cursor_shift_on, bool display_shift_on){ |
Yajirushi | 0:070d3d0b6f37 | 166 | sendCmd(0x01 | cursor_shift_on?8:0 | display_shift_on?4:0); |
Yajirushi | 0:070d3d0b6f37 | 167 | } |
Yajirushi | 0:070d3d0b6f37 | 168 | |
Yajirushi | 0:070d3d0b6f37 | 169 | void LCDI2C_SPLC792A::setContrast(char voltage_0to7, char contrast_0to64){ |
Yajirushi | 0:070d3d0b6f37 | 170 | if(voltage_0to7 < 0 || voltage_0to7 > 7) voltage_0to7 = 4; |
Yajirushi | 0:070d3d0b6f37 | 171 | if(contrast_0to64 < 0 || contrast_0to64 > 64) contrast_0to64 = SPLC792A_DEFAULT_CONTRAST; |
Yajirushi | 0:070d3d0b6f37 | 172 | |
Yajirushi | 0:070d3d0b6f37 | 173 | sendCmd(0x50 | ((contrast_0to64 & 30) >> 4)); //LCD Contrast setting High-2bit |
Yajirushi | 0:070d3d0b6f37 | 174 | sendCmd(0x70 | (contrast_0to64 & 0x0F)); //LCD Contrast setting Low-4bit |
Yajirushi | 0:070d3d0b6f37 | 175 | sendCmd(0x60 | voltage_0to7); //Set LCD voltage |
Yajirushi | 0:070d3d0b6f37 | 176 | |
Yajirushi | 0:070d3d0b6f37 | 177 | nowContrast = contrast_0to64; |
Yajirushi | 0:070d3d0b6f37 | 178 | nowVoltage = voltage_0to7; |
Yajirushi | 0:070d3d0b6f37 | 179 | } |
Yajirushi | 0:070d3d0b6f37 | 180 | |
Yajirushi | 0:070d3d0b6f37 | 181 | char LCDI2C_SPLC792A::getRow(){ |
Yajirushi | 0:070d3d0b6f37 | 182 | return nowRow; |
Yajirushi | 0:070d3d0b6f37 | 183 | } |
Yajirushi | 0:070d3d0b6f37 | 184 | |
Yajirushi | 0:070d3d0b6f37 | 185 | char LCDI2C_SPLC792A::getCol(){ |
Yajirushi | 0:070d3d0b6f37 | 186 | return nowCol; |
Yajirushi | 0:070d3d0b6f37 | 187 | } |
Yajirushi | 0:070d3d0b6f37 | 188 | |
Yajirushi | 0:070d3d0b6f37 | 189 | char LCDI2C_SPLC792A::getContrast(){ |
Yajirushi | 0:070d3d0b6f37 | 190 | return nowContrast; |
Yajirushi | 0:070d3d0b6f37 | 191 | } |
Yajirushi | 0:070d3d0b6f37 | 192 | |
Yajirushi | 0:070d3d0b6f37 | 193 | char LCDI2C_SPLC792A::getVoltage0to7(){ |
Yajirushi | 0:070d3d0b6f37 | 194 | return nowVoltage; |
Yajirushi | 0:070d3d0b6f37 | 195 | } |
Yajirushi | 0:070d3d0b6f37 | 196 | |
Yajirushi | 0:070d3d0b6f37 | 197 | float LCDI2C_SPLC792A::getVoltageValue(){ |
Yajirushi | 0:070d3d0b6f37 | 198 | float val = 0.0f; |
Yajirushi | 0:070d3d0b6f37 | 199 | switch(nowVoltage){ |
Yajirushi | 0:070d3d0b6f37 | 200 | case 0: |
Yajirushi | 0:070d3d0b6f37 | 201 | val = 1.818f; |
Yajirushi | 0:070d3d0b6f37 | 202 | break; |
Yajirushi | 0:070d3d0b6f37 | 203 | case 1: |
Yajirushi | 0:070d3d0b6f37 | 204 | val = 2.222f; |
Yajirushi | 0:070d3d0b6f37 | 205 | break; |
Yajirushi | 0:070d3d0b6f37 | 206 | case 2: |
Yajirushi | 0:070d3d0b6f37 | 207 | val = 2.667f; |
Yajirushi | 0:070d3d0b6f37 | 208 | break; |
Yajirushi | 0:070d3d0b6f37 | 209 | case 3: |
Yajirushi | 0:070d3d0b6f37 | 210 | val = 3.333f; |
Yajirushi | 0:070d3d0b6f37 | 211 | break; |
Yajirushi | 0:070d3d0b6f37 | 212 | case 4: |
Yajirushi | 0:070d3d0b6f37 | 213 | val = 3.636f; |
Yajirushi | 0:070d3d0b6f37 | 214 | break; |
Yajirushi | 0:070d3d0b6f37 | 215 | case 5: |
Yajirushi | 0:070d3d0b6f37 | 216 | val = 4.000f; |
Yajirushi | 0:070d3d0b6f37 | 217 | break; |
Yajirushi | 0:070d3d0b6f37 | 218 | case 6: |
Yajirushi | 0:070d3d0b6f37 | 219 | val = 4.444f; |
Yajirushi | 0:070d3d0b6f37 | 220 | break; |
Yajirushi | 0:070d3d0b6f37 | 221 | case 7: |
Yajirushi | 0:070d3d0b6f37 | 222 | val = 5.000f; |
Yajirushi | 0:070d3d0b6f37 | 223 | break; |
Yajirushi | 0:070d3d0b6f37 | 224 | } |
Yajirushi | 0:070d3d0b6f37 | 225 | return val; |
Yajirushi | 0:070d3d0b6f37 | 226 | } |