You can output chars to AQM1602 with printf(). ex. lcd.printf("iter: %5.5d.\r\n", iter);
Dependents: aqm1602 FCAS-M101V1
AQM1602.cpp@4:43f874a2b8e9, 2016-09-05 (annotated)
- 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?
User | Revision | Line number | New 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 |