Dependents:   lpclcd

I2cLCD.cpp

Committer:
KatsushiOgawa
Date:
2012-05-29
Revision:
0:8a9ac3d4afdf

File content as of revision 0:8a9ac3d4afdf:

#include "I2cLCD.h"
#include "mbed.h"

#define    I2CLCD_ADDR    0x7C

#define RS_CMD        0x00
#define RS_DATA       0x40

#define FUNC_SET1    0x38
#define FUNC_SET2    0x39
#define INT_OSC      0x14

#define CNTR_DEF    0x20

unsigned char icon_data[]=
{
    0x00, 0x10,
    0x02, 0x10,
    0x04, 0x10,
    0x06, 0x10,
    
    0x07, 0x10,
    0x07, 0x08,
    0x09, 0x10,
    0x0B, 0x10,
    
    0x0D, 0x08,
    0x0D, 0x04,
    0x0D, 0x02,
    0x0D, 0x10,

    0x0F, 0x10,
};

I2cLCD::I2cLCD(PinName sda, PinName scl, PinName rp) :  _rs( rp ) , _i2c( sda , scl ){
    
    contrast = CNTR_DEF;
    icon = 0;
    
    wait(0.015);
    // reset LOW->HIGH
    _rs = 0;
    wait(0.01);
    _rs = 1;
    wait(0.05);
    
    writeCommand(FUNC_SET1);
    writeCommand(FUNC_SET2);
    writeCommand(INT_OSC);
    
    writeCommand(0x70 | (contrast & 0xF));
    writeCommand(0x5C | ((contrast >> 4) & 0x3));
    
    writeCommand(0x6C);
    wait(0.3);
    
    writeCommand(0x38); // function set
    writeCommand(0x0C); // Display On
    
    cls(); // Clear Display
    
}



void I2cLCD::character(int column, int row, int c) {
    int a = address(column, row);
    writeCommand(a);
    writeData(c);
}

void I2cLCD::cls() {
    writeCommand(0x01); // cls, and set cursor to 0
    wait(0.00164f);     // This command takes 1.64 ms
    locate(0, 0);
}

void I2cLCD::locate(int column, int row) {
    _column = column;
    _row = row;
}

int I2cLCD::_putc(int value) {
    if (value == '\n') {
        _column = 0;
        _row++;
        if (_row >= rows()) {
            _row = 0;
        }
    } else {
        character(_column, _row, value);
        _column++;
        if (_column >= columns()) {
            _column = 0;
            _row++;
            if (_row >= rows()) {
                _row = 0;
            }
        }
    }
    return value;
}

int I2cLCD::_getc() {
    return -1;
}

void I2cLCD::writeCommand( int cmd )
{
    char cmds[2];
    
    cmds[0] = RS_CMD;
    cmds[1] = cmd;
    
    _i2c.write(I2CLCD_ADDR, cmds, 2);
}

void I2cLCD::writeData( int data )
{
    char cmd[2];
    
    cmd[0] = RS_DATA;
    cmd[1] = data;
    
    _i2c.write(I2CLCD_ADDR, cmd, 2);
}

int I2cLCD::address(int column, int row) {

    return 0x80 + (row * 0x40) + column;
}

int I2cLCD::columns() {
    return 16;
}

int I2cLCD::rows() {
    return 2;
}

void I2cLCD::seticon(IconType type)
{
    icon |= type;
    puticon( icon );
}

void I2cLCD::clearicon(IconType type)
{
    icon &= ~type;
    puticon( icon );
}


void I2cLCD::puticon(int flg)
{
    static unsigned char icon_buff[16];
    unsigned char i;
    
    for(i=0;i<sizeof(icon_data)/2;i++)
    {
        if(flg & (0x1000>>i))
        {
            icon_buff[icon_data[i*2]] |= icon_data[i*2+1];
        }
        else
        {
            icon_buff[icon_data[i*2]] &= ~icon_data[i*2+1];
        }
    }

    for(i=0;i<16;i++){
        writeCommand(0x39);
        writeCommand(0x40+i);
        writeData(icon_buff[i]);
    }
}