This example positions a lit LED in the I2C LED array using the rotary encoder

Dependencies:   mbed

Committer:
chris
Date:
Tue Mar 02 08:27:23 2010 +0000
Revision:
0:498b9b4a7bb9

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
chris 0:498b9b4a7bb9 1 /*
chris 0:498b9b4a7bb9 2 PCA9532
chris 0:498b9b4a7bb9 3 (c) 2009, cstyles
chris 0:498b9b4a7bb9 4 */
chris 0:498b9b4a7bb9 5
chris 0:498b9b4a7bb9 6 #include "PCA9532.h"
chris 0:498b9b4a7bb9 7 #include "mbed.h"
chris 0:498b9b4a7bb9 8
chris 0:498b9b4a7bb9 9 /*
chris 0:498b9b4a7bb9 10 Constructor, pin names for I2C and the I2C addrss of the device
chris 0:498b9b4a7bb9 11 */
chris 0:498b9b4a7bb9 12
chris 0:498b9b4a7bb9 13
chris 0:498b9b4a7bb9 14 PCA9532::PCA9532(PinName scl, PinName sda, int addr)
chris 0:498b9b4a7bb9 15 : _i2c(scl, sda) {
chris 0:498b9b4a7bb9 16
chris 0:498b9b4a7bb9 17 _addr = addr;
chris 0:498b9b4a7bb9 18
chris 0:498b9b4a7bb9 19 }
chris 0:498b9b4a7bb9 20
chris 0:498b9b4a7bb9 21
chris 0:498b9b4a7bb9 22
chris 0:498b9b4a7bb9 23
chris 0:498b9b4a7bb9 24
chris 0:498b9b4a7bb9 25 /*
chris 0:498b9b4a7bb9 26 force the LEDs on or off according to thier corresponding bits
chris 0:498b9b4a7bb9 27 in the vector
chris 0:498b9b4a7bb9 28 */
chris 0:498b9b4a7bb9 29
chris 0:498b9b4a7bb9 30 void PCA9532::write (int leds) {
chris 0:498b9b4a7bb9 31
chris 0:498b9b4a7bb9 32 // cycle through the array
chris 0:498b9b4a7bb9 33 for (int i=0; i < 16; i++) {
chris 0:498b9b4a7bb9 34
chris 0:498b9b4a7bb9 35 // if the ith bit is '1'
chris 0:498b9b4a7bb9 36 if (leds & (0x1 << i)) {
chris 0:498b9b4a7bb9 37 _rmw(i,PCA9532_MODE_SET);
chris 0:498b9b4a7bb9 38 }
chris 0:498b9b4a7bb9 39
chris 0:498b9b4a7bb9 40 else {
chris 0:498b9b4a7bb9 41 _rmw(i,PCA9532_MODE_CLEAR);
chris 0:498b9b4a7bb9 42 }
chris 0:498b9b4a7bb9 43 }
chris 0:498b9b4a7bb9 44 }
chris 0:498b9b4a7bb9 45
chris 0:498b9b4a7bb9 46
chris 0:498b9b4a7bb9 47
chris 0:498b9b4a7bb9 48 /*
chris 0:498b9b4a7bb9 49 this is one hot encoding for the LED array
chris 0:498b9b4a7bb9 50 any bit set will have it's corresponding LED switched on
chris 0:498b9b4a7bb9 51 */
chris 0:498b9b4a7bb9 52
chris 0:498b9b4a7bb9 53 void PCA9532::set (int leds) {
chris 0:498b9b4a7bb9 54 for (int i=0; i < 16; i++) {
chris 0:498b9b4a7bb9 55 if (leds & (0x1 << i)) {
chris 0:498b9b4a7bb9 56 _rmw(i,PCA9532_MODE_SET);
chris 0:498b9b4a7bb9 57 }
chris 0:498b9b4a7bb9 58 }
chris 0:498b9b4a7bb9 59 }
chris 0:498b9b4a7bb9 60
chris 0:498b9b4a7bb9 61
chris 0:498b9b4a7bb9 62 void PCA9532::clear (int leds) {
chris 0:498b9b4a7bb9 63 for (int i=0; i < 16; i++) {
chris 0:498b9b4a7bb9 64 if (leds & (0x1 << i)) {
chris 0:498b9b4a7bb9 65 _rmw(i,PCA9532_MODE_CLEAR);
chris 0:498b9b4a7bb9 66 }
chris 0:498b9b4a7bb9 67 }
chris 0:498b9b4a7bb9 68 }
chris 0:498b9b4a7bb9 69
chris 0:498b9b4a7bb9 70
chris 0:498b9b4a7bb9 71 void PCA9532::pwm0 (int leds) {
chris 0:498b9b4a7bb9 72 for (int i=0; i < 16; i++) {
chris 0:498b9b4a7bb9 73 if (leds & (0x1 << i)) {
chris 0:498b9b4a7bb9 74 _rmw(i,PCA9532_MODE_PWM0);
chris 0:498b9b4a7bb9 75 }
chris 0:498b9b4a7bb9 76 }
chris 0:498b9b4a7bb9 77 }
chris 0:498b9b4a7bb9 78
chris 0:498b9b4a7bb9 79
chris 0:498b9b4a7bb9 80 void PCA9532::pwm1 (int leds) {
chris 0:498b9b4a7bb9 81 for (int i=0; i < 16; i++) {
chris 0:498b9b4a7bb9 82 if (leds & (0x1 << i)) {
chris 0:498b9b4a7bb9 83 _rmw(i,PCA9532_MODE_PWM1);
chris 0:498b9b4a7bb9 84 }
chris 0:498b9b4a7bb9 85 }
chris 0:498b9b4a7bb9 86 }
chris 0:498b9b4a7bb9 87
chris 0:498b9b4a7bb9 88
chris 0:498b9b4a7bb9 89 void PCA9532::duty0 (float d) {
chris 0:498b9b4a7bb9 90
chris 0:498b9b4a7bb9 91 char duty = 0;
chris 0:498b9b4a7bb9 92
chris 0:498b9b4a7bb9 93 if (d > 1.0) { duty = 255; }
chris 0:498b9b4a7bb9 94 else if ( d < 0.0 ) { duty = 0; }
chris 0:498b9b4a7bb9 95 else { duty = 256 * d; }
chris 0:498b9b4a7bb9 96
chris 0:498b9b4a7bb9 97 _write(PCA9532_REG_PWM0,duty);
chris 0:498b9b4a7bb9 98
chris 0:498b9b4a7bb9 99 }
chris 0:498b9b4a7bb9 100
chris 0:498b9b4a7bb9 101
chris 0:498b9b4a7bb9 102 void PCA9532::duty1 (float d) {
chris 0:498b9b4a7bb9 103
chris 0:498b9b4a7bb9 104 char duty = 0;
chris 0:498b9b4a7bb9 105
chris 0:498b9b4a7bb9 106 if (d > 1.0) { duty = 255; }
chris 0:498b9b4a7bb9 107 else if ( d < 0.0 ) { duty = 0; }
chris 0:498b9b4a7bb9 108 else { duty = 256 * d; }
chris 0:498b9b4a7bb9 109
chris 0:498b9b4a7bb9 110 _write(PCA9532_REG_PWM1,duty);
chris 0:498b9b4a7bb9 111
chris 0:498b9b4a7bb9 112 }
chris 0:498b9b4a7bb9 113
chris 0:498b9b4a7bb9 114
chris 0:498b9b4a7bb9 115
chris 0:498b9b4a7bb9 116
chris 0:498b9b4a7bb9 117
chris 0:498b9b4a7bb9 118
chris 0:498b9b4a7bb9 119
chris 0:498b9b4a7bb9 120 /*
chris 0:498b9b4a7bb9 121 led is in the range 0-15
chris 0:498b9b4a7bb9 122 mode is inthe range 0-3
chris 0:498b9b4a7bb9 123 */
chris 0:498b9b4a7bb9 124
chris 0:498b9b4a7bb9 125 void PCA9532::_rmw(int led, int mode) {
chris 0:498b9b4a7bb9 126
chris 0:498b9b4a7bb9 127 int reg = 0;
chris 0:498b9b4a7bb9 128 int offset = (led % 4);
chris 0:498b9b4a7bb9 129
chris 0:498b9b4a7bb9 130 // makesure mode is within bounds
chris 0:498b9b4a7bb9 131 if ( (mode < 0) || (mode > 3) ) {
chris 0:498b9b4a7bb9 132 return;
chris 0:498b9b4a7bb9 133 }
chris 0:498b9b4a7bb9 134
chris 0:498b9b4a7bb9 135
chris 0:498b9b4a7bb9 136 // determine which register this is,
chris 0:498b9b4a7bb9 137 if (led < 4) {
chris 0:498b9b4a7bb9 138 reg = PCA9532_REG_LS0;}
chris 0:498b9b4a7bb9 139
chris 0:498b9b4a7bb9 140 else if ( (led > 3) && (led < 8) ) {
chris 0:498b9b4a7bb9 141 reg = PCA9532_REG_LS1;}
chris 0:498b9b4a7bb9 142
chris 0:498b9b4a7bb9 143 else if ( (led > 7) && (led < 12) ) {
chris 0:498b9b4a7bb9 144 reg = PCA9532_REG_LS2;}
chris 0:498b9b4a7bb9 145
chris 0:498b9b4a7bb9 146 else if ( (led > 11) && (led < 16) ) {
chris 0:498b9b4a7bb9 147 reg = PCA9532_REG_LS3;}
chris 0:498b9b4a7bb9 148
chris 0:498b9b4a7bb9 149 else { return; }
chris 0:498b9b4a7bb9 150
chris 0:498b9b4a7bb9 151 // read the current status of the register
chris 0:498b9b4a7bb9 152 char regval = _read(reg);
chris 0:498b9b4a7bb9 153
chris 0:498b9b4a7bb9 154 // clear the two bit slice at the calculated offset
chris 0:498b9b4a7bb9 155 regval &= ~(0x3 << (2 * offset));
chris 0:498b9b4a7bb9 156
chris 0:498b9b4a7bb9 157 // now OR in the mode, shifted by 2 8 offset
chris 0:498b9b4a7bb9 158 regval |= (mode << (2 * offset));
chris 0:498b9b4a7bb9 159
chris 0:498b9b4a7bb9 160 // write this back
chris 0:498b9b4a7bb9 161
chris 0:498b9b4a7bb9 162 _write(reg,regval);
chris 0:498b9b4a7bb9 163
chris 0:498b9b4a7bb9 164 return;
chris 0:498b9b4a7bb9 165 }
chris 0:498b9b4a7bb9 166
chris 0:498b9b4a7bb9 167
chris 0:498b9b4a7bb9 168 void PCA9532::_write(int reg, int data) {
chris 0:498b9b4a7bb9 169 char args[2];
chris 0:498b9b4a7bb9 170 args[0] = reg;
chris 0:498b9b4a7bb9 171 args[1] = data;
chris 0:498b9b4a7bb9 172 _i2c.write(_addr,args,2);
chris 0:498b9b4a7bb9 173 }
chris 0:498b9b4a7bb9 174
chris 0:498b9b4a7bb9 175
chris 0:498b9b4a7bb9 176 int PCA9532::_read(int reg) {
chris 0:498b9b4a7bb9 177 char args[2];
chris 0:498b9b4a7bb9 178 args[0] = reg;
chris 0:498b9b4a7bb9 179 _i2c.write(_addr,args,2);
chris 0:498b9b4a7bb9 180 return(args[1]);
chris 0:498b9b4a7bb9 181 }
chris 0:498b9b4a7bb9 182
chris 0:498b9b4a7bb9 183
chris 0:498b9b4a7bb9 184
chris 0:498b9b4a7bb9 185
chris 0:498b9b4a7bb9 186