You can output chars to AQM1602 with printf(). ex. lcd.printf("iter: %5.5d.\r\n", iter);

Dependents:   aqm1602 FCAS-M101V1

Committer:
AkinoriHashimoto
Date:
Fri Nov 06 06:29:22 2015 +0000
Revision:
2:9233e977ee6e
Parent:
1:ac441b938a80
Child:
3:4a1be7924c30
Adj. constructor, Refer.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AkinoriHashimoto 0:4d904885c9b8 1 #include "AQM1602.h"
AkinoriHashimoto 0:4d904885c9b8 2
AkinoriHashimoto 1:ac441b938a80 3 AQM1602::AQM1602(PinName sda, PinName scl, bool pw3v3, char address)
AkinoriHashimoto 2:9233e977ee6e 4 : p_i2c(new I2C(sda, scl)), i2c(*p_i2c), addr(address), vdd3v3(pw3v3)
AkinoriHashimoto 0:4d904885c9b8 5 {
AkinoriHashimoto 0:4d904885c9b8 6 init();
AkinoriHashimoto 0:4d904885c9b8 7 }
AkinoriHashimoto 1:ac441b938a80 8 AQM1602::AQM1602(I2C &_i2c, bool pw3v3, char address)
AkinoriHashimoto 2:9233e977ee6e 9 : p_i2c(NULL), i2c(_i2c), addr(address), vdd3v3(pw3v3)
AkinoriHashimoto 0:4d904885c9b8 10 {
AkinoriHashimoto 0:4d904885c9b8 11 init();
AkinoriHashimoto 0:4d904885c9b8 12 }
AkinoriHashimoto 2:9233e977ee6e 13 AQM1602::~AQM1602()
AkinoriHashimoto 2:9233e977ee6e 14 {
AkinoriHashimoto 2:9233e977ee6e 15 if(p_i2c != NULL)
AkinoriHashimoto 2:9233e977ee6e 16 delete p_i2c;
AkinoriHashimoto 2:9233e977ee6e 17 }
AkinoriHashimoto 0:4d904885c9b8 18
AkinoriHashimoto 0:4d904885c9b8 19 bool AQM1602::cmd(char chr)
AkinoriHashimoto 0:4d904885c9b8 20 {
AkinoriHashimoto 0:4d904885c9b8 21 buf[0]= 0x00;
AkinoriHashimoto 0:4d904885c9b8 22 buf[1]= chr;
AkinoriHashimoto 0:4d904885c9b8 23 // if write success:0, other: err code.
AkinoriHashimoto 0:4d904885c9b8 24 int status= i2c.write(addr, buf, 2);
AkinoriHashimoto 0:4d904885c9b8 25 wait_ms(3);
AkinoriHashimoto 0:4d904885c9b8 26
AkinoriHashimoto 0:4d904885c9b8 27 if(status == 0)
AkinoriHashimoto 0:4d904885c9b8 28 return true;
AkinoriHashimoto 0:4d904885c9b8 29 else
AkinoriHashimoto 0:4d904885c9b8 30 return false;
AkinoriHashimoto 0:4d904885c9b8 31 }
AkinoriHashimoto 0:4d904885c9b8 32
AkinoriHashimoto 0:4d904885c9b8 33 int AQM1602::_putc(int val) // for printf()
AkinoriHashimoto 0:4d904885c9b8 34 {
AkinoriHashimoto 0:4d904885c9b8 35 if (val == '\n') {
AkinoriHashimoto 1:ac441b938a80 36 col = 0;
AkinoriHashimoto 1:ac441b938a80 37 row = (row + 1) % 2;
AkinoriHashimoto 0:4d904885c9b8 38 } else {
AkinoriHashimoto 1:ac441b938a80 39 locate(col, row);
AkinoriHashimoto 0:4d904885c9b8 40 buf[0]= 0x40;
AkinoriHashimoto 0:4d904885c9b8 41 buf[1]= val;
AkinoriHashimoto 0:4d904885c9b8 42 i2c.write(addr, buf, 2);
AkinoriHashimoto 0:4d904885c9b8 43
AkinoriHashimoto 1:ac441b938a80 44 col++;
AkinoriHashimoto 1:ac441b938a80 45 if (col >= 16) {
AkinoriHashimoto 1:ac441b938a80 46 col = 0;
AkinoriHashimoto 1:ac441b938a80 47 row = (row + 1) % 2;
AkinoriHashimoto 0:4d904885c9b8 48 }
AkinoriHashimoto 0:4d904885c9b8 49 }
AkinoriHashimoto 0:4d904885c9b8 50 wait_ms(1);
AkinoriHashimoto 0:4d904885c9b8 51 return val;
AkinoriHashimoto 0:4d904885c9b8 52 }
AkinoriHashimoto 0:4d904885c9b8 53
AkinoriHashimoto 0:4d904885c9b8 54 // for "Stream"
AkinoriHashimoto 0:4d904885c9b8 55 int AQM1602::_getc()
AkinoriHashimoto 0:4d904885c9b8 56 {
AkinoriHashimoto 0:4d904885c9b8 57 return -1;
AkinoriHashimoto 0:4d904885c9b8 58 }
AkinoriHashimoto 0:4d904885c9b8 59
AkinoriHashimoto 1:ac441b938a80 60 void AQM1602::locate(int _col, int _row)
AkinoriHashimoto 0:4d904885c9b8 61 {
AkinoriHashimoto 1:ac441b938a80 62 col= _col;
AkinoriHashimoto 1:ac441b938a80 63 row= _row;
AkinoriHashimoto 0:4d904885c9b8 64 cmd(0x80 + row * 0x40 + col);
AkinoriHashimoto 0:4d904885c9b8 65 return;
AkinoriHashimoto 0:4d904885c9b8 66 }
AkinoriHashimoto 0:4d904885c9b8 67
AkinoriHashimoto 0:4d904885c9b8 68 void AQM1602::init()
AkinoriHashimoto 0:4d904885c9b8 69 {
AkinoriHashimoto 1:ac441b938a80 70 col= row= 0;
AkinoriHashimoto 0:4d904885c9b8 71 buf[0]= 0x00;
AkinoriHashimoto 0:4d904885c9b8 72 buf[1]= 0x00;
AkinoriHashimoto 0:4d904885c9b8 73 buf[2]= 0x00;
AkinoriHashimoto 0:4d904885c9b8 74 wait4cmd= 3;
AkinoriHashimoto 1:ac441b938a80 75 // valContrast= 0x23;
AkinoriHashimoto 0:4d904885c9b8 76
AkinoriHashimoto 0:4d904885c9b8 77 wait_ms(wait4cmd);
AkinoriHashimoto 0:4d904885c9b8 78 // Function set = 0x38; 0b0011 1000
AkinoriHashimoto 0:4d904885c9b8 79 // Function set = 0x39; 0b0011 1001
AkinoriHashimoto 0:4d904885c9b8 80 this->clearIS();
AkinoriHashimoto 0:4d904885c9b8 81 this->setIS();
AkinoriHashimoto 1:ac441b938a80 82
AkinoriHashimoto 0:4d904885c9b8 83 // ** must be IS=1. **
AkinoriHashimoto 0:4d904885c9b8 84 // Internal OSC frequency = 0x14; 0b0001 0100
AkinoriHashimoto 0:4d904885c9b8 85 this->cmd(0x14);
AkinoriHashimoto 0:4d904885c9b8 86 wait_ms(wait4cmd);
AkinoriHashimoto 0:4d904885c9b8 87
AkinoriHashimoto 0:4d904885c9b8 88 // Power/ICON/Contrast control = 0x56; 0b0101 0110
AkinoriHashimoto 0:4d904885c9b8 89 // Contrast set = 0x70; 0b0111 0011
AkinoriHashimoto 1:ac441b938a80 90 this->setContrast(0x23, false);
AkinoriHashimoto 0:4d904885c9b8 91
AkinoriHashimoto 0:4d904885c9b8 92 // Follower control = 0x6C; 0b0110 1100
AkinoriHashimoto 0:4d904885c9b8 93 this->cmd(0x6C);
AkinoriHashimoto 0:4d904885c9b8 94 wait_ms(220);
AkinoriHashimoto 0:4d904885c9b8 95
AkinoriHashimoto 0:4d904885c9b8 96 this->clearIS();
AkinoriHashimoto 0:4d904885c9b8 97 this->setDispFlag(true, true, true);
AkinoriHashimoto 0:4d904885c9b8 98 this->clear();
AkinoriHashimoto 1:ac441b938a80 99
AkinoriHashimoto 0:4d904885c9b8 100 // Function set = 0x38; 0b0011 1000
AkinoriHashimoto 0:4d904885c9b8 101 // Display ON/OFF control = 0x0C; 0b 0000 1DCB
AkinoriHashimoto 0:4d904885c9b8 102 // Clear Display = 0x01; 0b 0000 0001
AkinoriHashimoto 1:ac441b938a80 103
AkinoriHashimoto 0:4d904885c9b8 104 return;
AkinoriHashimoto 0:4d904885c9b8 105 }
AkinoriHashimoto 0:4d904885c9b8 106
AkinoriHashimoto 0:4d904885c9b8 107 void AQM1602::setContrast(char val, bool ctrlIS)
AkinoriHashimoto 0:4d904885c9b8 108 {
AkinoriHashimoto 0:4d904885c9b8 109 // C5,C4,C3,C2,C1,C0 can only be set when internal follower is used (OPF1=0,OPF2=0).
AkinoriHashimoto 0:4d904885c9b8 110 // They can more precisely adjust the input reference voltage of V0 generator.
AkinoriHashimoto 0:4d904885c9b8 111 // The details please refer to the supply voltage for LCD driver.
AkinoriHashimoto 1:ac441b938a80 112
AkinoriHashimoto 1:ac441b938a80 113 if(val > 0x3f)// || val < 0x00)
AkinoriHashimoto 0:4d904885c9b8 114 return;
AkinoriHashimoto 1:ac441b938a80 115
AkinoriHashimoto 1:ac441b938a80 116 contrast= val;
AkinoriHashimoto 1:ac441b938a80 117 setPwContrast(ctrlIS);
AkinoriHashimoto 1:ac441b938a80 118
AkinoriHashimoto 1:ac441b938a80 119 return;
AkinoriHashimoto 1:ac441b938a80 120 }
AkinoriHashimoto 1:ac441b938a80 121
AkinoriHashimoto 1:ac441b938a80 122 void AQM1602::setPwContrast(bool ctrlIS)
AkinoriHashimoto 1:ac441b938a80 123 {
AkinoriHashimoto 1:ac441b938a80 124 // C5,C4,C3,C2,C1,C0 can only be set when internal follower is used (OPF1=0,OPF2=0).
AkinoriHashimoto 1:ac441b938a80 125 // They can more precisely adjust the input reference voltage of V0 generator.
AkinoriHashimoto 1:ac441b938a80 126 // The details please refer to the supply voltage for LCD driver.
AkinoriHashimoto 1:ac441b938a80 127
AkinoriHashimoto 0:4d904885c9b8 128 // Cmd of Contrast-setting must be setted IS.
AkinoriHashimoto 0:4d904885c9b8 129 if(ctrlIS)
AkinoriHashimoto 0:4d904885c9b8 130 this->setIS();
AkinoriHashimoto 1:ac441b938a80 131
AkinoriHashimoto 1:ac441b938a80 132 // 0b 0101 0*++ // PW, C5, C4
AkinoriHashimoto 1:ac441b938a80 133 char val= 0x50;
AkinoriHashimoto 1:ac441b938a80 134 if(vdd3v3) // set Booster circuit.
AkinoriHashimoto 1:ac441b938a80 135 val += 0x04;
AkinoriHashimoto 1:ac441b938a80 136 val += (contrast>>4);
AkinoriHashimoto 1:ac441b938a80 137 this->cmd(val);
AkinoriHashimoto 1:ac441b938a80 138 // this->cmd(0x54+ (contrast>>4));
AkinoriHashimoto 0:4d904885c9b8 139 wait_ms(wait4cmd);
AkinoriHashimoto 1:ac441b938a80 140
AkinoriHashimoto 1:ac441b938a80 141 // 0b 0111 ++++ // C3, C2, C1, C0
AkinoriHashimoto 1:ac441b938a80 142 this->cmd(0x70+ (contrast&0x0f));
AkinoriHashimoto 0:4d904885c9b8 143 wait_ms(wait4cmd);
AkinoriHashimoto 1:ac441b938a80 144
AkinoriHashimoto 0:4d904885c9b8 145 if(ctrlIS)
AkinoriHashimoto 0:4d904885c9b8 146 this->clearIS();
AkinoriHashimoto 1:ac441b938a80 147
AkinoriHashimoto 0:4d904885c9b8 148 wait_ms(wait4cmd);
AkinoriHashimoto 0:4d904885c9b8 149 return;
AkinoriHashimoto 0:4d904885c9b8 150 }
AkinoriHashimoto 0:4d904885c9b8 151
AkinoriHashimoto 0:4d904885c9b8 152 void AQM1602::clear()
AkinoriHashimoto 0:4d904885c9b8 153 {
AkinoriHashimoto 0:4d904885c9b8 154 this->cmd(0x01);
AkinoriHashimoto 0:4d904885c9b8 155 locate(0, 0);
AkinoriHashimoto 0:4d904885c9b8 156 wait_ms(wait4cmd);
AkinoriHashimoto 0:4d904885c9b8 157 return;
AkinoriHashimoto 0:4d904885c9b8 158 }
AkinoriHashimoto 0:4d904885c9b8 159
AkinoriHashimoto 0:4d904885c9b8 160 void AQM1602::setDispFlag(bool disp, bool cursor, bool blink)
AkinoriHashimoto 0:4d904885c9b8 161 {
AkinoriHashimoto 0:4d904885c9b8 162 // set On/Off. b3=1, b2:Disp, b1:Cursor, b0:blink.
AkinoriHashimoto 0:4d904885c9b8 163 char tmp= 0x08;
AkinoriHashimoto 0:4d904885c9b8 164 if(disp)
AkinoriHashimoto 0:4d904885c9b8 165 tmp += 0x04;
AkinoriHashimoto 0:4d904885c9b8 166 if(cursor)
AkinoriHashimoto 0:4d904885c9b8 167 tmp += 0x02;
AkinoriHashimoto 0:4d904885c9b8 168 if(blink)
AkinoriHashimoto 0:4d904885c9b8 169 tmp += 0x01;
AkinoriHashimoto 0:4d904885c9b8 170 this->cmd(tmp);
AkinoriHashimoto 0:4d904885c9b8 171 this->cmd(0x01); //Clear Disp.
AkinoriHashimoto 0:4d904885c9b8 172 wait_ms(wait4cmd);
AkinoriHashimoto 0:4d904885c9b8 173 return;
AkinoriHashimoto 0:4d904885c9b8 174 }
AkinoriHashimoto 0:4d904885c9b8 175
AkinoriHashimoto 0:4d904885c9b8 176 // ******************** FUNCTION SET **********************
AkinoriHashimoto 0:4d904885c9b8 177 // IS func-set -> 0b 001L NH0I
AkinoriHashimoto 0:4d904885c9b8 178 // L: Interface data Length. 1:8bit-bus, 0:4bit.
AkinoriHashimoto 0:4d904885c9b8 179 // N: Display line Number. 1: 2 lines, 0: 1 line.
AkinoriHashimoto 0:4d904885c9b8 180 // H: Double Hight font. if H=1 and N=1, 5x16 dots.
AkinoriHashimoto 0:4d904885c9b8 181 // 0: Normal (5x8 dots).
AkinoriHashimoto 0:4d904885c9b8 182 // I: Normal / Extentsion Instruction. 1: Ext Instruction, 0: Norm.
AkinoriHashimoto 0:4d904885c9b8 183 void AQM1602::setIS()
AkinoriHashimoto 0:4d904885c9b8 184 {
AkinoriHashimoto 0:4d904885c9b8 185 this->cmd(0x39);
AkinoriHashimoto 0:4d904885c9b8 186 wait_ms(wait4cmd);
AkinoriHashimoto 0:4d904885c9b8 187 return;
AkinoriHashimoto 0:4d904885c9b8 188 }
AkinoriHashimoto 0:4d904885c9b8 189 void AQM1602::clearIS()
AkinoriHashimoto 0:4d904885c9b8 190 {
AkinoriHashimoto 0:4d904885c9b8 191 this->cmd(0x38);
AkinoriHashimoto 0:4d904885c9b8 192 wait_ms(wait4cmd);
AkinoriHashimoto 0:4d904885c9b8 193 return;
AkinoriHashimoto 0:4d904885c9b8 194 }
AkinoriHashimoto 0:4d904885c9b8 195
AkinoriHashimoto 0:4d904885c9b8 196 // EOF