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