Parallel to I2C for Intelligent LED Display module PD2435~7 / PD3535~7 / PD4435~7 (OSRAM)

Dependents:   i2cleddisp_sample WeatherPlatform_20110408 WeatherPlatform WeatherStation

I2CLEDDisp.cpp

Committer:
okini3939
Date:
2010-10-21
Revision:
0:eae10b76cd72

File content as of revision 0:eae10b76cd72:

/*
 * mbed library for I2C LED Display
 * Copyright (c) 2010 Hiroshi Suga
 * Released under the MIT License: http://mbed.org/license/mit
 *
 * This product includes:
 * mbed TextLCD Library, for a 4-bit LCD based on HD44780
 * Copyright (c) 2007-2010, sford
 */

#include "mbed.h"
#include "I2CLEDDisp.h"


int I2CLEDDisp::_putc (int value) {

    if (value == '\n') {
		locate(0, 0);

    } else {

        disp_out(value, address(x, y));
        x ++;
        if (x >= cols()) {
            x = 0;
        }

		if (ctrl & LEDDISP_CONTROL_ATTRIB && (ctrl & 0x03) != LEDDISP_CONTROL_AB) {
	        disp_out(0x80 | disp_in(address(x, y)), address(x, y));
		}

    }

    return value;
}

int I2CLEDDisp::_getc() {
	int i;

	i = disp_in(x);
    x ++;
    if (x >= cols()) {
        x = 0;
    }
    return i;
}


I2CLEDDisp::I2CLEDDisp (PinName p_sda, PinName p_scl, int p_i2caddr, I2CLEDDispType p_type, I2CLEDDispControl p_ctrl) : i2c(p_sda, p_scl) {
    init(p_i2caddr, p_type, p_ctrl);
}

I2CLEDDisp::I2CLEDDisp (I2C& p_i2c, int p_i2caddr, I2CLEDDispType p_type, I2CLEDDispControl p_ctrl) : i2c(p_i2c) {
    init(p_i2caddr, p_type, p_ctrl);
}

void I2CLEDDisp::init (int p_i2caddr, I2CLEDDispType p_type, I2CLEDDispControl p_ctrl) {

	i2caddr = p_i2caddr;
    type = p_type;
    ctrl = p_ctrl;

    cls();
}

void I2CLEDDisp::cls() {
	int i;
	
	for (i = 0; i < type; i ++) {
	    disp_out(LEDDISP_CONTROL_CLEAR, i << 4);
	    disp_out(ctrl, i << 4);
	}
    locate(0, 0);
}

void I2CLEDDisp::locate(int col, int row) {
	if (ctrl & LEDDISP_CONTROL_ATTRIB && (ctrl & 0x03) != LEDDISP_CONTROL_AB) {
        disp_out(~0x80 & disp_in(address(x, y)), address(x, y));
	    x = col;
	    y = row;
        disp_out(0x80 | disp_in(address(x, y)), address(x, y));
	} else {
	    x = col;
	    y = row;
	}
}

int I2CLEDDisp::address(int col, int row) {
	return ((col & 0x0c) << 2) | 0x04 | (~col & 0x03);
}

int I2CLEDDisp::cols() {
	return 4 * type;
}

int I2CLEDDisp::rows() {
	return 1;
}

void I2CLEDDisp::disp_cfg (I2CLEDDispConfig cfg) {
	int i;
	
	for (i = 0; i < type; i ++) {
    	i2c.start();
    	i2c.write(i2caddr + (i << 1));
    	i2c.write(LEDDISPCFG_ENABLE | (cfg & 0x71));
    	i2c.stop();
	}
}

void I2CLEDDisp::disp_out (int dat, int addr) {
    i2c.start();
    i2c.write(i2caddr | (addr >> 3));
    i2c.write(addr & 0x07);
    i2c.write(dat);
    i2c.stop();
}

int I2CLEDDisp::disp_in (int rs) {
    int i;

    i2c.start();
    i2c.write(i2caddr | (addr >> 3));
    i2c.write(addr & 0x07);

    i2c.start();
    i2c.write(i2caddr | (addr >> 3) | 0x01);
    i = i2c.read(0);
    i2c.stop();

    return i;
}