You can output chars to AQM1602 with printf(). ex. lcd.printf("iter: %5.5d.\r\n", iter);
Dependents: aqm1602 FCAS-M101V1
AQM1602.cpp@0:4d904885c9b8, 2015-10-02 (annotated)
- Committer:
- AkinoriHashimoto
- Date:
- Fri Oct 02 06:13:12 2015 +0000
- Revision:
- 0:4d904885c9b8
- Child:
- 1:ac441b938a80
publish
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 | 0:4d904885c9b8 | 3 | AQM1602::AQM1602(PinName sda, PinName scl, char address) |
AkinoriHashimoto | 0:4d904885c9b8 | 4 | : i2c(sda, scl), addr(address) |
AkinoriHashimoto | 0:4d904885c9b8 | 5 | { |
AkinoriHashimoto | 0:4d904885c9b8 | 6 | init(); |
AkinoriHashimoto | 0:4d904885c9b8 | 7 | } |
AkinoriHashimoto | 0:4d904885c9b8 | 8 | AQM1602::AQM1602(I2C &_i2c, char address) |
AkinoriHashimoto | 0:4d904885c9b8 | 9 | : i2c(_i2c), addr(address) |
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 | 0:4d904885c9b8 | 31 | _column = 0; |
AkinoriHashimoto | 0:4d904885c9b8 | 32 | _row = (_row + 1) % 2; |
AkinoriHashimoto | 0:4d904885c9b8 | 33 | } else { |
AkinoriHashimoto | 0:4d904885c9b8 | 34 | locate(_column, _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 | 0:4d904885c9b8 | 39 | _column++; |
AkinoriHashimoto | 0:4d904885c9b8 | 40 | if (_column >= 16) { |
AkinoriHashimoto | 0:4d904885c9b8 | 41 | _column = 0; |
AkinoriHashimoto | 0:4d904885c9b8 | 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 | 0:4d904885c9b8 | 55 | void AQM1602::locate(int col, int row) |
AkinoriHashimoto | 0:4d904885c9b8 | 56 | { |
AkinoriHashimoto | 0:4d904885c9b8 | 57 | cmd(0x80 + row * 0x40 + col); |
AkinoriHashimoto | 0:4d904885c9b8 | 58 | return; |
AkinoriHashimoto | 0:4d904885c9b8 | 59 | } |
AkinoriHashimoto | 0:4d904885c9b8 | 60 | |
AkinoriHashimoto | 0:4d904885c9b8 | 61 | void AQM1602::init() |
AkinoriHashimoto | 0:4d904885c9b8 | 62 | { |
AkinoriHashimoto | 0:4d904885c9b8 | 63 | _column= _row= 0; |
AkinoriHashimoto | 0:4d904885c9b8 | 64 | buf[0]= 0x00; |
AkinoriHashimoto | 0:4d904885c9b8 | 65 | buf[1]= 0x00; |
AkinoriHashimoto | 0:4d904885c9b8 | 66 | buf[2]= 0x00; |
AkinoriHashimoto | 0:4d904885c9b8 | 67 | wait4cmd= 3; |
AkinoriHashimoto | 0:4d904885c9b8 | 68 | valContrast= 0x23; |
AkinoriHashimoto | 0:4d904885c9b8 | 69 | |
AkinoriHashimoto | 0:4d904885c9b8 | 70 | wait_ms(wait4cmd); |
AkinoriHashimoto | 0:4d904885c9b8 | 71 | // Function set = 0x38; 0b0011 1000 |
AkinoriHashimoto | 0:4d904885c9b8 | 72 | // Function set = 0x39; 0b0011 1001 |
AkinoriHashimoto | 0:4d904885c9b8 | 73 | this->clearIS(); |
AkinoriHashimoto | 0:4d904885c9b8 | 74 | this->setIS(); |
AkinoriHashimoto | 0:4d904885c9b8 | 75 | |
AkinoriHashimoto | 0:4d904885c9b8 | 76 | // ** must be IS=1. ** |
AkinoriHashimoto | 0:4d904885c9b8 | 77 | // Internal OSC frequency = 0x14; 0b0001 0100 |
AkinoriHashimoto | 0:4d904885c9b8 | 78 | this->cmd(0x14); |
AkinoriHashimoto | 0:4d904885c9b8 | 79 | wait_ms(wait4cmd); |
AkinoriHashimoto | 0:4d904885c9b8 | 80 | |
AkinoriHashimoto | 0:4d904885c9b8 | 81 | // Power/ICON/Contrast control = 0x56; 0b0101 0110 |
AkinoriHashimoto | 0:4d904885c9b8 | 82 | // Contrast set = 0x70; 0b0111 0011 |
AkinoriHashimoto | 0:4d904885c9b8 | 83 | this->setContrast(valContrast, false); |
AkinoriHashimoto | 0:4d904885c9b8 | 84 | |
AkinoriHashimoto | 0:4d904885c9b8 | 85 | // Follower control = 0x6C; 0b0110 1100 |
AkinoriHashimoto | 0:4d904885c9b8 | 86 | this->cmd(0x6C); |
AkinoriHashimoto | 0:4d904885c9b8 | 87 | wait_ms(220); |
AkinoriHashimoto | 0:4d904885c9b8 | 88 | |
AkinoriHashimoto | 0:4d904885c9b8 | 89 | this->clearIS(); |
AkinoriHashimoto | 0:4d904885c9b8 | 90 | this->setDispFlag(true, true, true); |
AkinoriHashimoto | 0:4d904885c9b8 | 91 | this->clear(); |
AkinoriHashimoto | 0:4d904885c9b8 | 92 | |
AkinoriHashimoto | 0:4d904885c9b8 | 93 | // Function set = 0x38; 0b0011 1000 |
AkinoriHashimoto | 0:4d904885c9b8 | 94 | // Display ON/OFF control = 0x0C; 0b 0000 1DCB |
AkinoriHashimoto | 0:4d904885c9b8 | 95 | // Clear Display = 0x01; 0b 0000 0001 |
AkinoriHashimoto | 0:4d904885c9b8 | 96 | |
AkinoriHashimoto | 0:4d904885c9b8 | 97 | return; |
AkinoriHashimoto | 0:4d904885c9b8 | 98 | } |
AkinoriHashimoto | 0:4d904885c9b8 | 99 | |
AkinoriHashimoto | 0:4d904885c9b8 | 100 | void AQM1602::setContrast(char val, bool ctrlIS) |
AkinoriHashimoto | 0:4d904885c9b8 | 101 | { |
AkinoriHashimoto | 0:4d904885c9b8 | 102 | // C5,C4,C3,C2,C1,C0 can only be set when internal follower is used (OPF1=0,OPF2=0). |
AkinoriHashimoto | 0:4d904885c9b8 | 103 | // They can more precisely adjust the input reference voltage of V0 generator. |
AkinoriHashimoto | 0:4d904885c9b8 | 104 | // The details please refer to the supply voltage for LCD driver. |
AkinoriHashimoto | 0:4d904885c9b8 | 105 | |
AkinoriHashimoto | 0:4d904885c9b8 | 106 | if(val > 0x3f) |
AkinoriHashimoto | 0:4d904885c9b8 | 107 | return; |
AkinoriHashimoto | 0:4d904885c9b8 | 108 | |
AkinoriHashimoto | 0:4d904885c9b8 | 109 | valContrast= val; |
AkinoriHashimoto | 0:4d904885c9b8 | 110 | // Cmd of Contrast-setting must be setted IS. |
AkinoriHashimoto | 0:4d904885c9b8 | 111 | if(ctrlIS) |
AkinoriHashimoto | 0:4d904885c9b8 | 112 | this->setIS(); |
AkinoriHashimoto | 0:4d904885c9b8 | 113 | |
AkinoriHashimoto | 0:4d904885c9b8 | 114 | // 0b 0101 01++ |
AkinoriHashimoto | 0:4d904885c9b8 | 115 | this->cmd(0x54+ (val>>4)); |
AkinoriHashimoto | 0:4d904885c9b8 | 116 | wait_ms(wait4cmd); |
AkinoriHashimoto | 0:4d904885c9b8 | 117 | |
AkinoriHashimoto | 0:4d904885c9b8 | 118 | // 0b 0111 ++++ |
AkinoriHashimoto | 0:4d904885c9b8 | 119 | this->cmd(0x70+ (val&0x0f)); |
AkinoriHashimoto | 0:4d904885c9b8 | 120 | wait_ms(wait4cmd); |
AkinoriHashimoto | 0:4d904885c9b8 | 121 | |
AkinoriHashimoto | 0:4d904885c9b8 | 122 | if(ctrlIS) |
AkinoriHashimoto | 0:4d904885c9b8 | 123 | this->clearIS(); |
AkinoriHashimoto | 0:4d904885c9b8 | 124 | |
AkinoriHashimoto | 0:4d904885c9b8 | 125 | wait_ms(wait4cmd); |
AkinoriHashimoto | 0:4d904885c9b8 | 126 | return; |
AkinoriHashimoto | 0:4d904885c9b8 | 127 | } |
AkinoriHashimoto | 0:4d904885c9b8 | 128 | |
AkinoriHashimoto | 0:4d904885c9b8 | 129 | void AQM1602::clear() |
AkinoriHashimoto | 0:4d904885c9b8 | 130 | { |
AkinoriHashimoto | 0:4d904885c9b8 | 131 | this->cmd(0x01); |
AkinoriHashimoto | 0:4d904885c9b8 | 132 | locate(0, 0); |
AkinoriHashimoto | 0:4d904885c9b8 | 133 | wait_ms(wait4cmd); |
AkinoriHashimoto | 0:4d904885c9b8 | 134 | return; |
AkinoriHashimoto | 0:4d904885c9b8 | 135 | } |
AkinoriHashimoto | 0:4d904885c9b8 | 136 | |
AkinoriHashimoto | 0:4d904885c9b8 | 137 | void AQM1602::setDispFlag(bool disp, bool cursor, bool blink) |
AkinoriHashimoto | 0:4d904885c9b8 | 138 | { |
AkinoriHashimoto | 0:4d904885c9b8 | 139 | // set On/Off. b3=1, b2:Disp, b1:Cursor, b0:blink. |
AkinoriHashimoto | 0:4d904885c9b8 | 140 | char tmp= 0x08; |
AkinoriHashimoto | 0:4d904885c9b8 | 141 | if(disp) |
AkinoriHashimoto | 0:4d904885c9b8 | 142 | tmp += 0x04; |
AkinoriHashimoto | 0:4d904885c9b8 | 143 | if(cursor) |
AkinoriHashimoto | 0:4d904885c9b8 | 144 | tmp += 0x02; |
AkinoriHashimoto | 0:4d904885c9b8 | 145 | if(blink) |
AkinoriHashimoto | 0:4d904885c9b8 | 146 | tmp += 0x01; |
AkinoriHashimoto | 0:4d904885c9b8 | 147 | this->cmd(tmp); |
AkinoriHashimoto | 0:4d904885c9b8 | 148 | this->cmd(0x01); //Clear Disp. |
AkinoriHashimoto | 0:4d904885c9b8 | 149 | wait_ms(wait4cmd); |
AkinoriHashimoto | 0:4d904885c9b8 | 150 | return; |
AkinoriHashimoto | 0:4d904885c9b8 | 151 | } |
AkinoriHashimoto | 0:4d904885c9b8 | 152 | |
AkinoriHashimoto | 0:4d904885c9b8 | 153 | // ******************** FUNCTION SET ********************** |
AkinoriHashimoto | 0:4d904885c9b8 | 154 | // IS func-set -> 0b 001L NH0I |
AkinoriHashimoto | 0:4d904885c9b8 | 155 | // L: Interface data Length. 1:8bit-bus, 0:4bit. |
AkinoriHashimoto | 0:4d904885c9b8 | 156 | // N: Display line Number. 1: 2 lines, 0: 1 line. |
AkinoriHashimoto | 0:4d904885c9b8 | 157 | // H: Double Hight font. if H=1 and N=1, 5x16 dots. |
AkinoriHashimoto | 0:4d904885c9b8 | 158 | // 0: Normal (5x8 dots). |
AkinoriHashimoto | 0:4d904885c9b8 | 159 | // I: Normal / Extentsion Instruction. 1: Ext Instruction, 0: Norm. |
AkinoriHashimoto | 0:4d904885c9b8 | 160 | void AQM1602::setIS() |
AkinoriHashimoto | 0:4d904885c9b8 | 161 | { |
AkinoriHashimoto | 0:4d904885c9b8 | 162 | this->cmd(0x39); |
AkinoriHashimoto | 0:4d904885c9b8 | 163 | wait_ms(wait4cmd); |
AkinoriHashimoto | 0:4d904885c9b8 | 164 | return; |
AkinoriHashimoto | 0:4d904885c9b8 | 165 | } |
AkinoriHashimoto | 0:4d904885c9b8 | 166 | void AQM1602::clearIS() |
AkinoriHashimoto | 0:4d904885c9b8 | 167 | { |
AkinoriHashimoto | 0:4d904885c9b8 | 168 | this->cmd(0x38); |
AkinoriHashimoto | 0:4d904885c9b8 | 169 | wait_ms(wait4cmd); |
AkinoriHashimoto | 0:4d904885c9b8 | 170 | return; |
AkinoriHashimoto | 0:4d904885c9b8 | 171 | } |
AkinoriHashimoto | 0:4d904885c9b8 | 172 | |
AkinoriHashimoto | 0:4d904885c9b8 | 173 | // EOF |