BusOut
Example 1
A LED light bar is connected from p11
to p20
of a mbed,
The program moves a light bar from the 1st position to the 10th position.
#include "mbed.h" #define WAIT_SECOND 0.1 // LSB MSB BusOut Bar(p20, p19, p18, p17, p16, p15, p14, p13, p12, p11); DigitalOut Led(LED1); int main() { Led = 0; while(1) { // Shift from LSB to MSB for (int i = 0; i < 10; i++) { Led = !Led; Bar = 1 << i; wait(WAIT_SECOND); } } }
Example 2
Let's try to make the light bar bound back from the edges.
#include "mbed.h" #define WAIT_SECOND 0.1 // LSB MSB BusOut Bar(p20, p19, p18, p17, p16, p15, p14, p13, p12, p11); DigitalOut Led(LED1); int main() { Led = 0; while(1) { // Shift from LSB to MSB for (int i = 0; i < 10; i++) { Led = !Led; Bar = 1 << i; wait(WAIT_SECOND); } // Shift from MSB to LSB for (int i = 0; i < 10; i++) { Led = !Led; Bar = 0x0200 >> i; wait(WAIT_SECOND); } } }
However, the light bar stops at the both edges for an extra time each. Let change the index in the for
loop to start from 1 instead of 0.
#include "mbed.h" #define WAIT_SECOND 0.1 // LSB MSB BusOut Bar(p20, p19, p18, p17, p16, p15, p14, p13, p12, p11); DigitalOut Led(LED1); int main() { Led = 0; while(1) { // Shift from LSB to MSB for (int i = 1; i < 10; i++) { Led = !Led; Bar = 1 << i; wait(WAIT_SECOND); } // Shift from MSB to LSB for (int i = 1; i < 10; i++) { Led = !Led; Bar = 0x0200 >> i; wait(WAIT_SECOND); } } }
However, during the first start, the LSB pin (p20) is not switched on. Let's fix this:
#include "mbed.h" #define WAIT_SECOND 0.1 // LSB MSB BusOut Bar(p20, p19, p18, p17, p16, p15, p14, p13, p12, p11); DigitalOut Led(LED1); int main() { Led = 0; Bar = 1; wait(WAIT_SECOND); // Start from LSB first while(1) { // Shift from LSB to MSB for (int i = 1; i < 10; i++) { Led = !Led; Bar = 1 << i; wait(WAIT_SECOND); } // Shift from MSB to LSB for (int i = 1; i < 10; i++) { Led = !Led; Bar = 0x0200 >> i; wait(WAIT_SECOND); } } }
Example 3
Let's modify the program in Example 3 to have the so-called Cyclon or Knight Rider effect
#include "mbed.h" #define WAIT_SECOND 0.1 // LSB MSB BusOut Bar(p20, p19, p18, p17, p16, p15, p14, p13, p12, p11); DigitalOut Led(LED1); int main() { Led = 0; Bar = 3; wait(WAIT_SECOND); // Start from LSB first while(1) { // Shift from LSB to MSB for (int i = 1; i < 10; i++) { Led = !Led; Bar = 3 << i; wait(WAIT_SECOND); } // Shift from MSB to LSB for (int i = 1; i < 10; i++) { Led = !Led; Bar = 0x0300 >> i; wait(WAIT_SECOND); } } }
4 comments on BusOut:
Please log in to post comments.
Nice program, you could also preset a list of patterns in an array and 'dump' each array element to the bus in sequence. Note: since you use a single resistor the brightness will vary with the number of leds you have 'on' at the same time. Better use a resistor for each output.