I2C 接続の LCD AQM1602XA-RN-GBW 用のライブラリ. Library for LCD 1602XA-RN-GBW connected using I2C interface.

Dependents:   UIT2_MovingAv_Intr UIT2_VariableFIR UIT2_VowelSynthesizer UIT2_ALE_LeakyLMS ... more

AQM1602.cpp

Committer:
MikamiUitOpen
Date:
2015-07-06
Revision:
4:c943f05b7843
Parent:
3:414f98234c94
Child:
7:5375acc9a74a

File content as of revision 4:c943f05b7843:

//-------------------------------------------------------
//  Class for LCD, AQM1602XA-RN-GBW
//
//  2015/07/06, Copyright (c) 2015 MIKAMI, Naoki
//-------------------------------------------------------

#include "AQM1602.hpp"

namespace Mikami
{
    // Constructor
    Aqm1602::Aqm1602(PinName sda, PinName scl, uint32_t clock,
                     bool cursor, bool blink)
        : i2c_(sda, scl)
    {
        if (clock != 100000) i2c_.frequency(clock);

        wait_ms(40);
        connected_ = Clear();   // Clear display
        WriteCmd(0x39);         // To extended command
        if (!connected_)
        {
            fprintf(stderr, "\r\nLCD AQM1602 not connected\r\n");
            return;
        }

        WriteCmd(0x14); // Internal OSC frequency
        WriteCmd(0x70 | 0x00); // Contrast set
        WriteCmd(0x54 | 0x02); // Power/ICON/Contrast control
        WriteCmd(0x6C); // Follower control
        wait_ms(200);

        WriteCmd(0x38); // data length:8-bit, 2-line, 5×8 dots
        WriteCmd(0x0C | (cursor << 1) | blink);
    }

    // All clear
    bool Aqm1602::Clear()
    {
        bool ok = WriteCmd(0x01);
        wait_ms(50);
        return ok;
    }

    // Write string
    void Aqm1602::WriteString(const char str[])
    {
        for (int n=0; n<N_CHR; n++)
            if (str[n] == 0) break;
            else             WriteChar(str[n]);
    }

    // Write string from specified position
    void Aqm1602::WriteStringXY(const char str[],
                                 uint8_t x, uint8_t y)
    {
        SetXY(x, y);
        WriteString(str);
    }
    
    // Clear of specified line
    void Aqm1602::ClearLine(uint8_t line)
    {
        SetXY(0, line);
        for (int n=0; n<N_CHR; n++)
            WriteString(" ");
    }

    // Set contrast
    void Aqm1602::SetContrast(uint8_t c)
    {
        WriteCmd(0x39);
        WriteCmd(0x70 | (c & 0x0f));         // Lower 4 bits
        WriteCmd(0x5C | ((c >> 4) & 0x03));  // Higher 2 bits
        WriteCmd(0x38);
    }

    //---------------------------------------------------
    // Following functions: private

    // Send command and data
    bool Aqm1602::LcdTx(uint8_t cmdData, uint8_t data)
    {
        char tx[2] = { cmdData, data };
        int rt = i2c_.write(LCD_ADDRESS_, tx, 2);
        return (rt == 0) ? true : false;
    }
}