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

Dependents:   aqm1602 FCAS-M101V1

Committer:
AkinoriHashimoto
Date:
Fri Oct 02 06:13:12 2015 +0000
Revision:
0:4d904885c9b8
Child:
1:ac441b938a80
publish

Who changed what in which revision?

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