I2C LCD SPLC792A

Dependents:   SPLC792A_LCD

Committer:
Yajirushi
Date:
Sat Mar 18 01:41:30 2017 +0000
Revision:
0:070d3d0b6f37
first commit

Who changed what in which revision?

UserRevisionLine numberNew 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 }