PCA9635 16-bit I2C-bus LED driver

Dependents:   digitalThermometer Counter SimpleClock printNumber ... more

Committer:
d_worrall
Date:
Wed Jun 29 08:25:02 2011 +0000
Revision:
5:d8c2b5afde56
Parent:
4:056255549579
Child:
6:3f35bdfec837
version5

Who changed what in which revision?

UserRevisionLine numberNew 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 2:9ca6a4fbab5e 9 PCA9635::PCA9635(PinName sda, PinName scl) : m_i2c(sda, scl)
d_worrall 0:d9cc568daeaf 10 {
d_worrall 2:9ca6a4fbab5e 11 init(0x02);
d_worrall 0:d9cc568daeaf 12 }
d_worrall 0:d9cc568daeaf 13
d_worrall 0:d9cc568daeaf 14
d_worrall 0:d9cc568daeaf 15 //Driver Software Reset
d_worrall 0:d9cc568daeaf 16 void PCA9635::reset(void){
d_worrall 4:056255549579 17 cmd[0] = 0x06;
d_worrall 4:056255549579 18 int ack = m_i2c.write(m_addr, cmd, 1);
d_worrall 4:056255549579 19 if(!ack);
d_worrall 4:056255549579 20 else return;
d_worrall 4:056255549579 21 cmd[0] = 0xA5;
d_worrall 4:056255549579 22 cmd[1] = 0x5A;
d_worrall 4:056255549579 23 m_i2c.write(m_addr, cmd, 2);
d_worrall 0:d9cc568daeaf 24 }
d_worrall 0:d9cc568daeaf 25
d_worrall 2:9ca6a4fbab5e 26 void PCA9635::init(int address){
d_worrall 2:9ca6a4fbab5e 27 m_addr = address;
d_worrall 2:9ca6a4fbab5e 28
d_worrall 0:d9cc568daeaf 29 reset();
d_worrall 0:d9cc568daeaf 30
d_worrall 0:d9cc568daeaf 31 //Mode-1 Register:
d_worrall 0:d9cc568daeaf 32 cmd[0] = 0x00;
d_worrall 0:d9cc568daeaf 33 cmd[1] = 0x00;
d_worrall 2:9ca6a4fbab5e 34 m_i2c.write(address, cmd, 2);
d_worrall 0:d9cc568daeaf 35
d_worrall 0:d9cc568daeaf 36 //Mode-2 Register:
d_worrall 0:d9cc568daeaf 37 cmd[0] = 0x01;
d_worrall 0:d9cc568daeaf 38 cmd[1] = 0x22;
d_worrall 2:9ca6a4fbab5e 39 m_i2c.write(address, cmd, 2);
d_worrall 0:d9cc568daeaf 40
d_worrall 0:d9cc568daeaf 41 //LED Registers into PWM Control
d_worrall 0:d9cc568daeaf 42 for(char i=0x14; i<0x18; i++)
d_worrall 0:d9cc568daeaf 43 {
d_worrall 0:d9cc568daeaf 44 cmd[0] = i;
d_worrall 0:d9cc568daeaf 45 cmd[1] = 0xAA;
d_worrall 2:9ca6a4fbab5e 46 m_i2c.write(address, cmd, 2);
d_worrall 0:d9cc568daeaf 47 }
d_worrall 0:d9cc568daeaf 48 }
d_worrall 0:d9cc568daeaf 49
d_worrall 5:d8c2b5afde56 50 void PCA9635::setAddress(int address){
d_worrall 5:d8c2b5afde56 51 m_addr = address;
d_worrall 5:d8c2b5afde56 52 }
d_worrall 0:d9cc568daeaf 53
d_worrall 0:d9cc568daeaf 54 //Single LED On
d_worrall 0:d9cc568daeaf 55 void PCA9635::on(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] = 0xFF; //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 //Single LED Off
d_worrall 0:d9cc568daeaf 64 void PCA9635::off(char led)
d_worrall 0:d9cc568daeaf 65 {
d_worrall 0:d9cc568daeaf 66 cmd[0] = led + 2; //led position
d_worrall 0:d9cc568daeaf 67 cmd[1] = 0x00; //brightness value
d_worrall 0:d9cc568daeaf 68 m_i2c.write(m_addr, cmd, 2);
d_worrall 0:d9cc568daeaf 69 }
d_worrall 0:d9cc568daeaf 70
d_worrall 0:d9cc568daeaf 71
d_worrall 0:d9cc568daeaf 72 void PCA9635::bus(short leds)
d_worrall 0:d9cc568daeaf 73 {
d_worrall 0:d9cc568daeaf 74 short temp = leds; //check each bit of leds
d_worrall 0:d9cc568daeaf 75 bool stat = false; //check LSB of temp
d_worrall 0:d9cc568daeaf 76 for(int j=0; j<16; j++) {
d_worrall 0:d9cc568daeaf 77 stat = (bool)(temp & 0x0001);
d_worrall 0:d9cc568daeaf 78 if(stat == true){ //set output accordingly
d_worrall 0:d9cc568daeaf 79 on(j);
d_worrall 0:d9cc568daeaf 80 }
d_worrall 0:d9cc568daeaf 81 else {
d_worrall 0:d9cc568daeaf 82 off(j);
d_worrall 0:d9cc568daeaf 83 }
d_worrall 0:d9cc568daeaf 84 temp = (temp >> 1); //bitwise shift right by 1 to scan next bit
d_worrall 0:d9cc568daeaf 85 }
d_worrall 0:d9cc568daeaf 86 }
d_worrall 0:d9cc568daeaf 87
d_worrall 0:d9cc568daeaf 88 //Brightness control for single or all LEDs
d_worrall 0:d9cc568daeaf 89 void PCA9635::brightness(char led, char value)
d_worrall 0:d9cc568daeaf 90 {
d_worrall 0:d9cc568daeaf 91 if(led == ALL)
d_worrall 0:d9cc568daeaf 92 {
d_worrall 0:d9cc568daeaf 93 for(char allLeds=0x02; allLeds<0x12; allLeds++)
d_worrall 0:d9cc568daeaf 94 {
d_worrall 0:d9cc568daeaf 95 cmd[0] = allLeds;
d_worrall 0:d9cc568daeaf 96 cmd[1] = value;
d_worrall 0:d9cc568daeaf 97 m_i2c.write(m_addr, cmd, 2);
d_worrall 0:d9cc568daeaf 98 }
d_worrall 0:d9cc568daeaf 99 }
d_worrall 0:d9cc568daeaf 100 else
d_worrall 0:d9cc568daeaf 101 {
d_worrall 0:d9cc568daeaf 102 cmd[0] = led + 2;
d_worrall 0:d9cc568daeaf 103 cmd[1] = value;
d_worrall 0:d9cc568daeaf 104 m_i2c.write(m_addr, cmd, 2);
d_worrall 0:d9cc568daeaf 105 }
d_worrall 0:d9cc568daeaf 106 }
d_worrall 0:d9cc568daeaf 107
d_worrall 0:d9cc568daeaf 108
d_worrall 0:d9cc568daeaf 109
d_worrall 0:d9cc568daeaf 110
d_worrall 0:d9cc568daeaf 111
d_worrall 0:d9cc568daeaf 112