Program to demonstrate NXP semiconductor's PCA9955B chip working with the BBC micro:bit

Dependencies:   PCA995xA microbit

Fork of PCA9955A_Hello by InetrfaceProducts NXP

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...

Files at this revision

API Documentation at this revision

Comitter:
tb942
Date:
Tue Aug 14 18:31:16 2018 +0000
Parent:
4:fa025bb69dab
Child:
6:7164a88905c1
Commit message:

Changed in this revision

PCA995xA.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show diff for this revision Revisions of this file
microbit.lib Show annotated file Show diff for this revision Revisions of this file
--- a/PCA995xA.lib	Thu Mar 19 10:50:03 2015 +0000
+++ b/PCA995xA.lib	Tue Aug 14 18:31:16 2018 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/nxp_ip/code/PCA995xA/#cb07190e05e7
+https://os.mbed.com/users/tb942/code/PCA995xA/#56a45c690801
--- 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
--- a/mbed.bld	Thu Mar 19 10:50:03 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/9ad691361fac
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/microbit.lib	Tue Aug 14 18:31:16 2018 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/tb942/code/microbit/#1c4eb744a764