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 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?

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 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