Akizuki I2C 8x2 Character LCD AQM0802A driver class for LPC1768
Fork of AQM0802A by
AQM0802A.cpp@0:2b187f29704e, 2014-09-04 (annotated)
- Committer:
- tetsuya256
- Date:
- Thu Sep 04 05:22:22 2014 +0000
- Revision:
- 0:2b187f29704e
- Child:
- 5:92e827dc6b1f
First commit.
Who changed what in which revision?
User | Revision | Line number | New 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 | } |