PCA9635 16-bit I2C-bus LED driver
Dependents: digitalThermometer Counter SimpleClock printNumber ... more
PCA9635.cpp@0:d9cc568daeaf, 2011-06-28 (annotated)
- Committer:
- d_worrall
- Date:
- Tue Jun 28 10:03:49 2011 +0000
- Revision:
- 0:d9cc568daeaf
- Child:
- 2:9ca6a4fbab5e
version1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
d_worrall | 0:d9cc568daeaf | 1 | //NXP PCA9635 library |
d_worrall | 0:d9cc568daeaf | 2 | //mbed Team - 1st June 2011 |
d_worrall | 0:d9cc568daeaf | 3 | //Ioannis Kedros |
d_worrall | 0:d9cc568daeaf | 4 | //updated by Daniel Worrall - 28th June 2011 |
d_worrall | 0:d9cc568daeaf | 5 | |
d_worrall | 0:d9cc568daeaf | 6 | #include "mbed.h" |
d_worrall | 0:d9cc568daeaf | 7 | #include "PCA9635.h" |
d_worrall | 0:d9cc568daeaf | 8 | |
d_worrall | 0:d9cc568daeaf | 9 | |
d_worrall | 0:d9cc568daeaf | 10 | PCA9635::PCA9635(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr) |
d_worrall | 0:d9cc568daeaf | 11 | { |
d_worrall | 0:d9cc568daeaf | 12 | init(); |
d_worrall | 0:d9cc568daeaf | 13 | } |
d_worrall | 0:d9cc568daeaf | 14 | |
d_worrall | 0:d9cc568daeaf | 15 | |
d_worrall | 0:d9cc568daeaf | 16 | //Driver Software Reset |
d_worrall | 0:d9cc568daeaf | 17 | void PCA9635::reset(void){ |
d_worrall | 0:d9cc568daeaf | 18 | cmd[0] = 0x03; |
d_worrall | 0:d9cc568daeaf | 19 | m_i2c.write(m_addr, cmd, 1); |
d_worrall | 0:d9cc568daeaf | 20 | } |
d_worrall | 0:d9cc568daeaf | 21 | |
d_worrall | 0:d9cc568daeaf | 22 | void PCA9635::init(void){ |
d_worrall | 0:d9cc568daeaf | 23 | reset(); |
d_worrall | 0:d9cc568daeaf | 24 | |
d_worrall | 0:d9cc568daeaf | 25 | //Mode-1 Register: |
d_worrall | 0:d9cc568daeaf | 26 | cmd[0] = 0x00; |
d_worrall | 0:d9cc568daeaf | 27 | cmd[1] = 0x00; |
d_worrall | 0:d9cc568daeaf | 28 | m_i2c.write(m_addr, cmd, 2); |
d_worrall | 0:d9cc568daeaf | 29 | |
d_worrall | 0:d9cc568daeaf | 30 | //Mode-2 Register: |
d_worrall | 0:d9cc568daeaf | 31 | cmd[0] = 0x01; |
d_worrall | 0:d9cc568daeaf | 32 | cmd[1] = 0x22; |
d_worrall | 0:d9cc568daeaf | 33 | m_i2c.write(m_addr, cmd, 2); |
d_worrall | 0:d9cc568daeaf | 34 | |
d_worrall | 0:d9cc568daeaf | 35 | //LED Registers into PWM Control |
d_worrall | 0:d9cc568daeaf | 36 | for(char i=0x14; i<0x18; i++) |
d_worrall | 0:d9cc568daeaf | 37 | { |
d_worrall | 0:d9cc568daeaf | 38 | cmd[0] = i; |
d_worrall | 0:d9cc568daeaf | 39 | cmd[1] = 0xAA; |
d_worrall | 0:d9cc568daeaf | 40 | m_i2c.write(m_addr, cmd, 2); |
d_worrall | 0:d9cc568daeaf | 41 | } |
d_worrall | 0:d9cc568daeaf | 42 | } |
d_worrall | 0:d9cc568daeaf | 43 | |
d_worrall | 0:d9cc568daeaf | 44 | |
d_worrall | 0:d9cc568daeaf | 45 | //Single LED On |
d_worrall | 0:d9cc568daeaf | 46 | void PCA9635::on(char led) |
d_worrall | 0:d9cc568daeaf | 47 | { |
d_worrall | 0:d9cc568daeaf | 48 | cmd[0] = led + 2; //led position |
d_worrall | 0:d9cc568daeaf | 49 | cmd[1] = 0xFF; //brightness value |
d_worrall | 0:d9cc568daeaf | 50 | m_i2c.write(m_addr, cmd, 2); |
d_worrall | 0:d9cc568daeaf | 51 | } |
d_worrall | 0:d9cc568daeaf | 52 | |
d_worrall | 0:d9cc568daeaf | 53 | |
d_worrall | 0:d9cc568daeaf | 54 | //Single LED Off |
d_worrall | 0:d9cc568daeaf | 55 | void PCA9635::off(char led) |
d_worrall | 0:d9cc568daeaf | 56 | { |
d_worrall | 0:d9cc568daeaf | 57 | cmd[0] = led + 2; //led position |
d_worrall | 0:d9cc568daeaf | 58 | cmd[1] = 0x00; //brightness value |
d_worrall | 0:d9cc568daeaf | 59 | m_i2c.write(m_addr, cmd, 2); |
d_worrall | 0:d9cc568daeaf | 60 | } |
d_worrall | 0:d9cc568daeaf | 61 | |
d_worrall | 0:d9cc568daeaf | 62 | |
d_worrall | 0:d9cc568daeaf | 63 | void PCA9635::bus(short leds) |
d_worrall | 0:d9cc568daeaf | 64 | { |
d_worrall | 0:d9cc568daeaf | 65 | short temp = leds; //check each bit of leds |
d_worrall | 0:d9cc568daeaf | 66 | bool stat = false; //check LSB of temp |
d_worrall | 0:d9cc568daeaf | 67 | for(int j=0; j<16; j++) { |
d_worrall | 0:d9cc568daeaf | 68 | stat = (bool)(temp & 0x0001); |
d_worrall | 0:d9cc568daeaf | 69 | if(stat == true){ //set output accordingly |
d_worrall | 0:d9cc568daeaf | 70 | on(j); |
d_worrall | 0:d9cc568daeaf | 71 | } |
d_worrall | 0:d9cc568daeaf | 72 | else { |
d_worrall | 0:d9cc568daeaf | 73 | off(j); |
d_worrall | 0:d9cc568daeaf | 74 | } |
d_worrall | 0:d9cc568daeaf | 75 | temp = (temp >> 1); //bitwise shift right by 1 to scan next bit |
d_worrall | 0:d9cc568daeaf | 76 | } |
d_worrall | 0:d9cc568daeaf | 77 | } |
d_worrall | 0:d9cc568daeaf | 78 | |
d_worrall | 0:d9cc568daeaf | 79 | //Brightness control for single or all LEDs |
d_worrall | 0:d9cc568daeaf | 80 | void PCA9635::brightness(char led, char value) |
d_worrall | 0:d9cc568daeaf | 81 | { |
d_worrall | 0:d9cc568daeaf | 82 | if(led == ALL) |
d_worrall | 0:d9cc568daeaf | 83 | { |
d_worrall | 0:d9cc568daeaf | 84 | for(char allLeds=0x02; allLeds<0x12; allLeds++) |
d_worrall | 0:d9cc568daeaf | 85 | { |
d_worrall | 0:d9cc568daeaf | 86 | cmd[0] = allLeds; |
d_worrall | 0:d9cc568daeaf | 87 | cmd[1] = value; |
d_worrall | 0:d9cc568daeaf | 88 | m_i2c.write(m_addr, cmd, 2); |
d_worrall | 0:d9cc568daeaf | 89 | } |
d_worrall | 0:d9cc568daeaf | 90 | } |
d_worrall | 0:d9cc568daeaf | 91 | else |
d_worrall | 0:d9cc568daeaf | 92 | { |
d_worrall | 0:d9cc568daeaf | 93 | cmd[0] = led + 2; |
d_worrall | 0:d9cc568daeaf | 94 | cmd[1] = value; |
d_worrall | 0:d9cc568daeaf | 95 | m_i2c.write(m_addr, cmd, 2); |
d_worrall | 0:d9cc568daeaf | 96 | } |
d_worrall | 0:d9cc568daeaf | 97 | } |
d_worrall | 0:d9cc568daeaf | 98 | |
d_worrall | 0:d9cc568daeaf | 99 | |
d_worrall | 0:d9cc568daeaf | 100 | |
d_worrall | 0:d9cc568daeaf | 101 | |
d_worrall | 0:d9cc568daeaf | 102 | |
d_worrall | 0:d9cc568daeaf | 103 |