Parallel to I2C for Intelligent LED Display module PD2435~7 / PD3535~7 / PD4435~7 (OSRAM)
Dependents: i2cleddisp_sample WeatherPlatform_20110408 WeatherPlatform WeatherStation
I2CLEDDisp.cpp@0:eae10b76cd72, 2010-10-21 (annotated)
- Committer:
- okini3939
- Date:
- Thu Oct 21 11:51:14 2010 +0000
- Revision:
- 0:eae10b76cd72
Who changed what in which revision?
User | Revision | Line number | New 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 |