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

Dependents:   aqm1602 FCAS-M101V1

Committer:
AkinoriHashimoto
Date:
Mon Sep 05 06:27:05 2016 +0000
Revision:
4:43f874a2b8e9
Parent:
3:4a1be7924c30
Adj. CR, LF

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