Program to demonstrate NXP semiconductor's PCA9955B chip working with the BBC micro:bit
Dependencies: PCA995xA microbit
Fork of PCA9955A_Hello by
This is a simple program that allows you to control each port on a PCA9955B connected over i2c to a BBC micro:bit using a simple USB serial communication program.
I've written it to work with the 2 digit SMD soldering kit I designed. Drop me an email at tb942@hotmail.co.uk for further info on that...
Diff: main.cpp
- Revision:
- 5:9f89d6e17ff7
- Parent:
- 3:a67c21ad4173
- Child:
- 6:7164a88905c1
--- a/main.cpp Thu Mar 19 10:50:03 2015 +0000 +++ b/main.cpp Tue Aug 14 18:31:16 2018 +0000 @@ -1,32 +1,63 @@ -#include "mbed.h" +#include "MicroBit.h" //dem libraries tho.... don't forget 'em! (MCU specific) #include "PCA9955A.h" -PCA9955A led_cntlr( p28, p27, 0x02 ); // SDA, SCL, Slave_address(option) -LedPwmOutCC led0( led_cntlr, L0 ); // Instance for LED0 pin -LedPwmOutCC led1( led_cntlr, L1 ); // Instance for LED1 pin -LedPwmOutCC led2( led_cntlr, L2 ); // Instance for LED2 pin +PCA9955A led_cntlr(I2C_SDA0, I2C_SCL0 , 0x3f<<1); //SDA, SCL, Slave_address(option) +MicroBitSerial pc(USBTX, USBRX); + +void lightIt(int, int); //function to turn on specific LEDs +void cutItA (); //function to turn off left hand LEDs +void cutItB (); //function to turn off right hand LEDs +void cutItC (); //function to turn off decimal point LEDs +int state[16]; int main() -{ - led0.current( 0.5 ); // LED0 pin current output setting to 50% - led1.current( 0.5 ); // LED1 pin current output setting to 50% - led2.current( 0.5 ); // LED2 pin current output setting to 50% +{ //Set the operate enable pin low (it's inverted) + led_cntlr.current( ALLPORTS, 1 ); //Set all outputs to max current + - while(1) { - - for ( float p = 1.0; p >= 0.0; p -= 0.01 ) { - led0 = p; // Set LED0 output PWM dutycycle as 'p' - wait( 0.01 ); - } - - for ( float p = 1.0; p >= 0.0; p -= 0.01 ) { - led1 = p; // Set LED1 output PWM dutycycle as 'p' - wait( 0.01 ); - } - - for ( float p = 1.0; p >= 0.0; p -= 0.01 ) { - led2 = p; // Set LED2 output PWM dutycycle as 'p' - wait( 0.01 ); + while(1){ + if (pc.readable()){ //If there's serial data available + char sc = pc.getc(); //Read it + int s = (int)sc; + if (s > 96) + s = s - 87; + else if (s > 47) + s = s - 48; + if (s < 16){ + state[s] = !state[s]; + int onoff = state[s]; + lightIt(s,onoff); + } + else if (s == 33){ + cutItA(); + cutItB(); + cutItC(); + for(int i = 0; i < 16; i++) + state[i] = 0; + } + pc.printf("%d",s); } } } + +void lightIt (int led, int o){ + led_cntlr.pwm(led,o); +} + +void cutItA () { //When called display reset LEDs on left hand side + for ( int i = 0; i < 7; i++ ){ + led_cntlr.pwm(i,0); + } +} + +void cutItB () { //When called display reset LEDs on right hand side + for ( int i = 7; i < 14; i++ ){ + led_cntlr.pwm(i,0); + } +} + +void cutItC () { //When called display reset LEDs on right hand side + for ( int i = 14; i < 16; i++ ){ + led_cntlr.pwm(i,0); + } +} \ No newline at end of file