Akizuki I2C 8x2 Character LCD AQM0802A driver class.

Dependents:   CatPot_Main_ver1 CatPot_Main_F NuFM401 CatPot_Main_ver2 ... more

Committer:
tetsuya256
Date:
Sat Sep 06 01:29:25 2014 +0000
Revision:
4:5cc8d4df601d
Parent:
0:2b187f29704e
Fix document.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tetsuya256 0:2b187f29704e 1 #include "AQM0802A.h"
tetsuya256 0:2b187f29704e 2
tetsuya256 0:2b187f29704e 3 AQM0802A::AQM0802A(PinName sda, PinName scl) {
tetsuya256 0:2b187f29704e 4 i2c = new I2C(sda, scl);
tetsuya256 0:2b187f29704e 5 i2c->frequency(I2C_FREQUENCY);
tetsuya256 0:2b187f29704e 6 lcd_init();
tetsuya256 0:2b187f29704e 7 }
tetsuya256 0:2b187f29704e 8
tetsuya256 0:2b187f29704e 9 AQM0802A::AQM0802A(I2C& i2c) {
tetsuya256 0:2b187f29704e 10 AQM0802A::i2c = &i2c;
tetsuya256 0:2b187f29704e 11 lcd_init();
tetsuya256 0:2b187f29704e 12 }
tetsuya256 0:2b187f29704e 13
tetsuya256 0:2b187f29704e 14 void AQM0802A::lcd_init() {
tetsuya256 0:2b187f29704e 15 static const char init_cmds[] = {
tetsuya256 0:2b187f29704e 16 0x38,
tetsuya256 0:2b187f29704e 17 0x39,
tetsuya256 0:2b187f29704e 18 0x04,
tetsuya256 0:2b187f29704e 19 0x14,
tetsuya256 0:2b187f29704e 20 0x70,
tetsuya256 0:2b187f29704e 21 0x5E,
tetsuya256 0:2b187f29704e 22 0x6C
tetsuya256 0:2b187f29704e 23 };
tetsuya256 0:2b187f29704e 24 wait_ms(40);
tetsuya256 0:2b187f29704e 25 for (int i = 0; i < sizeof(init_cmds); i++) {
tetsuya256 0:2b187f29704e 26 lcd_cmd(init_cmds[i]);
tetsuya256 0:2b187f29704e 27 }
tetsuya256 0:2b187f29704e 28 wait_ms(200);
tetsuya256 0:2b187f29704e 29 lcd_cmd(0x38);
tetsuya256 0:2b187f29704e 30 lcd_cmd(0x0C);
tetsuya256 0:2b187f29704e 31 cls();
tetsuya256 0:2b187f29704e 32 }
tetsuya256 0:2b187f29704e 33
tetsuya256 0:2b187f29704e 34 void AQM0802A::lcd_cmd(uint8_t dat) {
tetsuya256 0:2b187f29704e 35 char buf[] = { 0, dat };
tetsuya256 0:2b187f29704e 36 i2c->write(AQM0802A_ADDR, buf, sizeof(buf));
tetsuya256 0:2b187f29704e 37 wait_us(AQM0802A_CMD_WAIT);
tetsuya256 0:2b187f29704e 38 }
tetsuya256 0:2b187f29704e 39
tetsuya256 0:2b187f29704e 40 void AQM0802A::lcd_data(char dat) {
tetsuya256 0:2b187f29704e 41 char buf[] = { 0x40, dat };
tetsuya256 0:2b187f29704e 42 i2c->write(AQM0802A_ADDR, buf, sizeof(buf));
tetsuya256 0:2b187f29704e 43 wait_us(AQM0802A_CMD_WAIT);
tetsuya256 0:2b187f29704e 44 }
tetsuya256 0:2b187f29704e 45
tetsuya256 0:2b187f29704e 46 void AQM0802A::cls() {
tetsuya256 0:2b187f29704e 47 x = y = 0;
tetsuya256 0:2b187f29704e 48 lcd_cmd(0x01);
tetsuya256 0:2b187f29704e 49 wait_us(1080 - AQM0802A_CMD_WAIT);
tetsuya256 0:2b187f29704e 50 }
tetsuya256 0:2b187f29704e 51
tetsuya256 0:2b187f29704e 52 void AQM0802A::home() {
tetsuya256 0:2b187f29704e 53 x = y = 0;
tetsuya256 0:2b187f29704e 54 lcd_cmd(0x02);
tetsuya256 0:2b187f29704e 55 wait_us(1080 - AQM0802A_CMD_WAIT);
tetsuya256 0:2b187f29704e 56 }
tetsuya256 0:2b187f29704e 57
tetsuya256 0:2b187f29704e 58 void AQM0802A::setContrast(int contrast) {
tetsuya256 0:2b187f29704e 59 lcd_cmd(0x39);
tetsuya256 0:2b187f29704e 60 lcd_cmd(0x70 | ( contrast & 0xF)); // contrast Low
tetsuya256 0:2b187f29704e 61 lcd_cmd(0x5C | ((contrast >> 4) & 0x3)); // icon/booster/contrast High
tetsuya256 0:2b187f29704e 62 lcd_cmd(0x38);
tetsuya256 0:2b187f29704e 63 }
tetsuya256 0:2b187f29704e 64
tetsuya256 0:2b187f29704e 65 void AQM0802A::setCursor(int x, int y) {
tetsuya256 0:2b187f29704e 66 AQM0802A::x = x;
tetsuya256 0:2b187f29704e 67 AQM0802A::y = y;
tetsuya256 0:2b187f29704e 68 lcd_cmd(0x80 |
tetsuya256 0:2b187f29704e 69 ((y & (AQM0802A_MAX_ROWS - 1)) << 6) |
tetsuya256 0:2b187f29704e 70 (x & (AQM0802A_MAX_COLS - 1))
tetsuya256 0:2b187f29704e 71 );
tetsuya256 0:2b187f29704e 72 }
tetsuya256 0:2b187f29704e 73
tetsuya256 0:2b187f29704e 74 int AQM0802A::_putc(int value) {
tetsuya256 0:2b187f29704e 75 switch (value) {
tetsuya256 0:2b187f29704e 76 case '\b':
tetsuya256 0:2b187f29704e 77 if (x > 0) setCursor(--x, y);
tetsuya256 0:2b187f29704e 78 else if (y > 0) setCursor(AQM0802A_MAX_COLS - 1, --y);
tetsuya256 0:2b187f29704e 79 else setCursor(AQM0802A_MAX_COLS - 1, AQM0802A_MAX_ROWS - 1);
tetsuya256 0:2b187f29704e 80 break;
tetsuya256 0:2b187f29704e 81 case '\r':
tetsuya256 0:2b187f29704e 82 setCursor(0, y);
tetsuya256 0:2b187f29704e 83 break;
tetsuya256 0:2b187f29704e 84 default:
tetsuya256 0:2b187f29704e 85 if (value == '\n') {
tetsuya256 0:2b187f29704e 86 x = 0;
tetsuya256 0:2b187f29704e 87 } else {
tetsuya256 0:2b187f29704e 88 lcd_data(value);
tetsuya256 0:2b187f29704e 89 if (x < AQM0802A_MAX_COLS - 1) x++;
tetsuya256 0:2b187f29704e 90 else x = 0;
tetsuya256 0:2b187f29704e 91 }
tetsuya256 0:2b187f29704e 92 if (x == 0) {
tetsuya256 0:2b187f29704e 93 if (y < AQM0802A_MAX_ROWS - 1) y++;
tetsuya256 0:2b187f29704e 94 else y = 0;
tetsuya256 0:2b187f29704e 95 setCursor(0, y);
tetsuya256 0:2b187f29704e 96 }
tetsuya256 0:2b187f29704e 97 break;
tetsuya256 0:2b187f29704e 98 }
tetsuya256 0:2b187f29704e 99 return value;
tetsuya256 0:2b187f29704e 100 }