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

Dependents:   i2cleddisp_sample WeatherPlatform_20110408 WeatherPlatform WeatherStation

Committer:
okini3939
Date:
Thu Oct 21 11:51:14 2010 +0000
Revision:
0:eae10b76cd72

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:eae10b76cd72 1 /*
okini3939 0:eae10b76cd72 2 * mbed library for I2C LED Display
okini3939 0:eae10b76cd72 3 * Copyright (c) 2010 Hiroshi Suga
okini3939 0:eae10b76cd72 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 0:eae10b76cd72 5 *
okini3939 0:eae10b76cd72 6 * This product includes:
okini3939 0:eae10b76cd72 7 * mbed TextLCD Library, for a 4-bit LCD based on HD44780
okini3939 0:eae10b76cd72 8 * Copyright (c) 2007-2010, sford
okini3939 0:eae10b76cd72 9 */
okini3939 0:eae10b76cd72 10
okini3939 0:eae10b76cd72 11 #include "mbed.h"
okini3939 0:eae10b76cd72 12 #include "I2CLEDDisp.h"
okini3939 0:eae10b76cd72 13
okini3939 0:eae10b76cd72 14
okini3939 0:eae10b76cd72 15 int I2CLEDDisp::_putc (int value) {
okini3939 0:eae10b76cd72 16
okini3939 0:eae10b76cd72 17 if (value == '\n') {
okini3939 0:eae10b76cd72 18 locate(0, 0);
okini3939 0:eae10b76cd72 19
okini3939 0:eae10b76cd72 20 } else {
okini3939 0:eae10b76cd72 21
okini3939 0:eae10b76cd72 22 disp_out(value, address(x, y));
okini3939 0:eae10b76cd72 23 x ++;
okini3939 0:eae10b76cd72 24 if (x >= cols()) {
okini3939 0:eae10b76cd72 25 x = 0;
okini3939 0:eae10b76cd72 26 }
okini3939 0:eae10b76cd72 27
okini3939 0:eae10b76cd72 28 if (ctrl & LEDDISP_CONTROL_ATTRIB && (ctrl & 0x03) != LEDDISP_CONTROL_AB) {
okini3939 0:eae10b76cd72 29 disp_out(0x80 | disp_in(address(x, y)), address(x, y));
okini3939 0:eae10b76cd72 30 }
okini3939 0:eae10b76cd72 31
okini3939 0:eae10b76cd72 32 }
okini3939 0:eae10b76cd72 33
okini3939 0:eae10b76cd72 34 return value;
okini3939 0:eae10b76cd72 35 }
okini3939 0:eae10b76cd72 36
okini3939 0:eae10b76cd72 37 int I2CLEDDisp::_getc() {
okini3939 0:eae10b76cd72 38 int i;
okini3939 0:eae10b76cd72 39
okini3939 0:eae10b76cd72 40 i = disp_in(x);
okini3939 0:eae10b76cd72 41 x ++;
okini3939 0:eae10b76cd72 42 if (x >= cols()) {
okini3939 0:eae10b76cd72 43 x = 0;
okini3939 0:eae10b76cd72 44 }
okini3939 0:eae10b76cd72 45 return i;
okini3939 0:eae10b76cd72 46 }
okini3939 0:eae10b76cd72 47
okini3939 0:eae10b76cd72 48
okini3939 0:eae10b76cd72 49 I2CLEDDisp::I2CLEDDisp (PinName p_sda, PinName p_scl, int p_i2caddr, I2CLEDDispType p_type, I2CLEDDispControl p_ctrl) : i2c(p_sda, p_scl) {
okini3939 0:eae10b76cd72 50 init(p_i2caddr, p_type, p_ctrl);
okini3939 0:eae10b76cd72 51 }
okini3939 0:eae10b76cd72 52
okini3939 0:eae10b76cd72 53 I2CLEDDisp::I2CLEDDisp (I2C& p_i2c, int p_i2caddr, I2CLEDDispType p_type, I2CLEDDispControl p_ctrl) : i2c(p_i2c) {
okini3939 0:eae10b76cd72 54 init(p_i2caddr, p_type, p_ctrl);
okini3939 0:eae10b76cd72 55 }
okini3939 0:eae10b76cd72 56
okini3939 0:eae10b76cd72 57 void I2CLEDDisp::init (int p_i2caddr, I2CLEDDispType p_type, I2CLEDDispControl p_ctrl) {
okini3939 0:eae10b76cd72 58
okini3939 0:eae10b76cd72 59 i2caddr = p_i2caddr;
okini3939 0:eae10b76cd72 60 type = p_type;
okini3939 0:eae10b76cd72 61 ctrl = p_ctrl;
okini3939 0:eae10b76cd72 62
okini3939 0:eae10b76cd72 63 cls();
okini3939 0:eae10b76cd72 64 }
okini3939 0:eae10b76cd72 65
okini3939 0:eae10b76cd72 66 void I2CLEDDisp::cls() {
okini3939 0:eae10b76cd72 67 int i;
okini3939 0:eae10b76cd72 68
okini3939 0:eae10b76cd72 69 for (i = 0; i < type; i ++) {
okini3939 0:eae10b76cd72 70 disp_out(LEDDISP_CONTROL_CLEAR, i << 4);
okini3939 0:eae10b76cd72 71 disp_out(ctrl, i << 4);
okini3939 0:eae10b76cd72 72 }
okini3939 0:eae10b76cd72 73 locate(0, 0);
okini3939 0:eae10b76cd72 74 }
okini3939 0:eae10b76cd72 75
okini3939 0:eae10b76cd72 76 void I2CLEDDisp::locate(int col, int row) {
okini3939 0:eae10b76cd72 77 if (ctrl & LEDDISP_CONTROL_ATTRIB && (ctrl & 0x03) != LEDDISP_CONTROL_AB) {
okini3939 0:eae10b76cd72 78 disp_out(~0x80 & disp_in(address(x, y)), address(x, y));
okini3939 0:eae10b76cd72 79 x = col;
okini3939 0:eae10b76cd72 80 y = row;
okini3939 0:eae10b76cd72 81 disp_out(0x80 | disp_in(address(x, y)), address(x, y));
okini3939 0:eae10b76cd72 82 } else {
okini3939 0:eae10b76cd72 83 x = col;
okini3939 0:eae10b76cd72 84 y = row;
okini3939 0:eae10b76cd72 85 }
okini3939 0:eae10b76cd72 86 }
okini3939 0:eae10b76cd72 87
okini3939 0:eae10b76cd72 88 int I2CLEDDisp::address(int col, int row) {
okini3939 0:eae10b76cd72 89 return ((col & 0x0c) << 2) | 0x04 | (~col & 0x03);
okini3939 0:eae10b76cd72 90 }
okini3939 0:eae10b76cd72 91
okini3939 0:eae10b76cd72 92 int I2CLEDDisp::cols() {
okini3939 0:eae10b76cd72 93 return 4 * type;
okini3939 0:eae10b76cd72 94 }
okini3939 0:eae10b76cd72 95
okini3939 0:eae10b76cd72 96 int I2CLEDDisp::rows() {
okini3939 0:eae10b76cd72 97 return 1;
okini3939 0:eae10b76cd72 98 }
okini3939 0:eae10b76cd72 99
okini3939 0:eae10b76cd72 100 void I2CLEDDisp::disp_cfg (I2CLEDDispConfig cfg) {
okini3939 0:eae10b76cd72 101 int i;
okini3939 0:eae10b76cd72 102
okini3939 0:eae10b76cd72 103 for (i = 0; i < type; i ++) {
okini3939 0:eae10b76cd72 104 i2c.start();
okini3939 0:eae10b76cd72 105 i2c.write(i2caddr + (i << 1));
okini3939 0:eae10b76cd72 106 i2c.write(LEDDISPCFG_ENABLE | (cfg & 0x71));
okini3939 0:eae10b76cd72 107 i2c.stop();
okini3939 0:eae10b76cd72 108 }
okini3939 0:eae10b76cd72 109 }
okini3939 0:eae10b76cd72 110
okini3939 0:eae10b76cd72 111 void I2CLEDDisp::disp_out (int dat, int addr) {
okini3939 0:eae10b76cd72 112 i2c.start();
okini3939 0:eae10b76cd72 113 i2c.write(i2caddr | (addr >> 3));
okini3939 0:eae10b76cd72 114 i2c.write(addr & 0x07);
okini3939 0:eae10b76cd72 115 i2c.write(dat);
okini3939 0:eae10b76cd72 116 i2c.stop();
okini3939 0:eae10b76cd72 117 }
okini3939 0:eae10b76cd72 118
okini3939 0:eae10b76cd72 119 int I2CLEDDisp::disp_in (int rs) {
okini3939 0:eae10b76cd72 120 int i;
okini3939 0:eae10b76cd72 121
okini3939 0:eae10b76cd72 122 i2c.start();
okini3939 0:eae10b76cd72 123 i2c.write(i2caddr | (addr >> 3));
okini3939 0:eae10b76cd72 124 i2c.write(addr & 0x07);
okini3939 0:eae10b76cd72 125
okini3939 0:eae10b76cd72 126 i2c.start();
okini3939 0:eae10b76cd72 127 i2c.write(i2caddr | (addr >> 3) | 0x01);
okini3939 0:eae10b76cd72 128 i = i2c.read(0);
okini3939 0:eae10b76cd72 129 i2c.stop();
okini3939 0:eae10b76cd72 130
okini3939 0:eae10b76cd72 131 return i;
okini3939 0:eae10b76cd72 132 }
okini3939 0:eae10b76cd72 133