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

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