Akizuki I2C 8x2 Character LCD AQM0802A driver class.

Dependents:   CatPot_Main_ver1 CatPot_Main_F NuFM401 CatPot_Main_ver2 ... more

AQM0802A.cpp

Committer:
tetsuya256
Date:
2014-09-06
Revision:
4:5cc8d4df601d
Parent:
0:2b187f29704e

File content as of revision 4:5cc8d4df601d:

#include "AQM0802A.h"

AQM0802A::AQM0802A(PinName sda, PinName scl) {
    i2c = new I2C(sda, scl);
    i2c->frequency(I2C_FREQUENCY);
    lcd_init();
}

AQM0802A::AQM0802A(I2C& i2c) {
    AQM0802A::i2c = &i2c;
    lcd_init();
}

void AQM0802A::lcd_init() {
    static const char init_cmds[] = {
        0x38,
        0x39,
        0x04,
        0x14,
        0x70,
        0x5E,
        0x6C
    };
    wait_ms(40);
    for (int i = 0; i < sizeof(init_cmds); i++) {
        lcd_cmd(init_cmds[i]);
    }
    wait_ms(200);
    lcd_cmd(0x38);
    lcd_cmd(0x0C);
    cls();
}

void AQM0802A::lcd_cmd(uint8_t dat) {
    char buf[] = { 0, dat };
    i2c->write(AQM0802A_ADDR, buf, sizeof(buf));
    wait_us(AQM0802A_CMD_WAIT);
}

void AQM0802A::lcd_data(char dat) {
    char buf[] = { 0x40, dat };
    i2c->write(AQM0802A_ADDR, buf, sizeof(buf));
    wait_us(AQM0802A_CMD_WAIT);
}

void AQM0802A::cls() {
    x = y = 0;
    lcd_cmd(0x01);
    wait_us(1080 - AQM0802A_CMD_WAIT);
}

void AQM0802A::home() {
    x = y = 0;
    lcd_cmd(0x02);
    wait_us(1080 - AQM0802A_CMD_WAIT);
}

void AQM0802A::setContrast(int contrast) {
    lcd_cmd(0x39);
    lcd_cmd(0x70 | ( contrast & 0xF));       // contrast Low
    lcd_cmd(0x5C | ((contrast >> 4) & 0x3)); // icon/booster/contrast High
    lcd_cmd(0x38);
}

void AQM0802A::setCursor(int x, int y) {
    AQM0802A::x = x;
    AQM0802A::y = y;
    lcd_cmd(0x80 |
        ((y & (AQM0802A_MAX_ROWS - 1)) << 6) |
         (x & (AQM0802A_MAX_COLS - 1))
    );
}

int AQM0802A::_putc(int value) {
    switch (value) {
        case '\b':
            if      (x > 0) setCursor(--x, y);
            else if (y > 0) setCursor(AQM0802A_MAX_COLS - 1, --y);
            else            setCursor(AQM0802A_MAX_COLS - 1, AQM0802A_MAX_ROWS - 1);
            break;
        case '\r':
            setCursor(0, y);
            break;
        default:
            if (value == '\n') {
                x = 0;
            } else {
                lcd_data(value);
                if (x < AQM0802A_MAX_COLS - 1) x++;
                else                           x = 0;
            }
            if (x == 0) {
                if (y < AQM0802A_MAX_ROWS - 1) y++;
                else                           y = 0;
                setCursor(0, y);
            }
            break;
    }
    return value;
}