A few classes to interface one or more ShiftBrite module to the FRDM KL25Z.

Dependencies:   mbed

Committer:
JoKer
Date:
Thu Aug 21 04:04:49 2014 +0000
Revision:
5:aa0424f31fa1
Parent:
4:d2f8ddb423e2
Child:
6:75801b7a36a3
Improved shift method functions for shiftBrightDisplay class. Allows shifting in a colour.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JoKer 0:f76850de7b57 1 #include "mbed.h"
JoKer 0:f76850de7b57 2 #include "sbDriver.h"
JoKer 2:3935d2ed40cd 3 #include "movie.h"
JoKer 5:aa0424f31fa1 4 # define M_PI 3.14159265358979323846
JoKer 0:f76850de7b57 5
JoKer 4:d2f8ddb423e2 6 /* VARIOUS EXAMPLES OF HOW TO USE the shiftBriteDisplay class and the movie class follows below.
JoKer 4:d2f8ddb423e2 7 Please note, this is all 'beerware' code but I would appreciate a mention in your code headers
JoKer 4:d2f8ddb423e2 8 if you use some/all of my code/classes. My name is Johan Kritzinger and I go by 'JoKer' on MBED.
JoKer 4:d2f8ddb423e2 9 My C++ is not that hot (I'm an old PLM-51 and C programmer) but the only way to learn is to do.
JoKer 4:d2f8ddb423e2 10 Any questions, please feel free to ask.
JoKer 0:f76850de7b57 11 */
JoKer 0:f76850de7b57 12
JoKer 4:d2f8ddb423e2 13
JoKer 2:3935d2ed40cd 14 //6 leds example. Format it suitably for easy reading
JoKer 2:3935d2ed40cd 15 unsigned short int aMovie[] = {
JoKer 2:3935d2ed40cd 16 /* LED1 LED2 LED3 LED4 LED5 LED6 */
JoKer 5:aa0424f31fa1 17 10,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, /*Frame 0*/
JoKer 5:aa0424f31fa1 18 0,0,0, 100,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, /*Frame 1*/
JoKer 5:aa0424f31fa1 19 0,0,0, 0,0,0, 500,0,0, 0,0,0, 0,0,0, 0,0,0, /*Frame 2*/
JoKer 5:aa0424f31fa1 20 0,0,0, 0,0,0, 0,0,0, 750,0,0, 0,0,0, 0,0,0, /*Frame 3*/
JoKer 5:aa0424f31fa1 21 0,0,0, 0,0,0, 0,0,0, 0,0,0, 900,0,0, 0,0,0, /*Frame 4*/
JoKer 2:3935d2ed40cd 22 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 1023,0,0, /*Frame 5*/
JoKer 5:aa0424f31fa1 23 0,0,0, 0,0,0, 0,0,0, 0,0,0, 900,0,0, 0,0,0, /*Frame 6*/
JoKer 5:aa0424f31fa1 24 0,0,0, 0,0,0, 0,0,0, 750,0,0, 0,0,0, 0,0,0, /*Frame 7*/
JoKer 5:aa0424f31fa1 25 0,0,0, 0,0,0, 500,0,0, 0,0,0, 0,0,0, 0,0,0, /*Frame 8*/
JoKer 5:aa0424f31fa1 26 0,0,0, 100,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 /*Frame 9*/
JoKer 2:3935d2ed40cd 27 /*A simple 'cylon' scanner 'movie'*/
JoKer 2:3935d2ed40cd 28 };
JoKer 4:d2f8ddb423e2 29
JoKer 5:aa0424f31fa1 30
JoKer 4:d2f8ddb423e2 31 Serial PC(PTA2, PTA1);//So I can use Serial as output to terminal and input
JoKer 0:f76850de7b57 32
JoKer 4:d2f8ddb423e2 33 //================== HARDWARE CONNECTIONS =========================================
JoKer 4:d2f8ddb423e2 34 //NB!!! I have only tested this on the FRDM KL25Z and h/w connection as detailed below
JoKer 0:f76850de7b57 35 //Instanced of DigitalOut for control SB signals
JoKer 0:f76850de7b57 36 DigitalOut latch(PTC16);//010=latch
JoKer 0:f76850de7b57 37 DigitalOut enable(PTA13);//0= enabled
JoKer 0:f76850de7b57 38 DigitalOut reset(PTC12);
JoKer 0:f76850de7b57 39 //Instance of the SPI contoller for SB data
JoKer 0:f76850de7b57 40 SPI spi(PTD2,NC,PTD1);//PDT2 = MOSI=DATA. PDT1=CLK
JoKer 4:d2f8ddb423e2 41 //=================== END OF HARDWARE CONNECTIONS =================================
JoKer 0:f76850de7b57 42
JoKer 0:f76850de7b57 43 int main() {
JoKer 5:aa0424f31fa1 44
JoKer 0:f76850de7b57 45
JoKer 0:f76850de7b57 46 //Instanciate a ticker object to handle framerate updates for the SB display
JoKer 0:f76850de7b57 47 Ticker t;
JoKer 0:f76850de7b57 48
JoKer 0:f76850de7b57 49 //Instanciate a string of 5 sb modules and tell the driver object where the control/data pins are
JoKer 4:d2f8ddb423e2 50 shiftBriteDisplay sbDisplay(latch, enable, reset, spi,6);
JoKer 0:f76850de7b57 51
JoKer 5:aa0424f31fa1 52
JoKer 5:aa0424f31fa1 53 /*
JoKer 5:aa0424f31fa1 54
JoKer 0:f76850de7b57 55 //Example calls to method f() of shiftBriteDisplay class
JoKer 0:f76850de7b57 56 //in this case, 6 of these statements wold be required to build one frame
JoKer 2:3935d2ed40cd 57 //HOW TO BUILD A FRAME IF YOU ARE NOT USING THE MOVIE CLASS
JoKer 2:3935d2ed40cd 58 sbDisplay.setLed(0,0XFF0000);//Red
JoKer 0:f76850de7b57 59 sbDisplay.setLed(1,0X00FF00);//Green
JoKer 0:f76850de7b57 60 sbDisplay.setLed(2,0X0000FF);//Blue
JoKer 0:f76850de7b57 61 sbDisplay.setLed(3,0XFFFF00);//Yellow
JoKer 0:f76850de7b57 62 sbDisplay.setLed(4,0X00FFFF); //Cyan?
JoKer 2:3935d2ed40cd 63 sbDisplay.setLed(5,0XFF00FF); // Purple
JoKer 0:f76850de7b57 64
JoKer 2:3935d2ed40cd 65 //HOW TO ADJUST THE CURRENT CONTROLLERS USED FOR DOT CORRECTION
JoKer 0:f76850de7b57 66 sbDisplay.setCurrentCorr(0,0,0);//suggested default value cor current control regs. Values g&b=100, r=120
JoKer 0:f76850de7b57 67 sbDisplay.displayFrame();//force an update
JoKer 0:f76850de7b57 68 wait(2);
JoKer 0:f76850de7b57 69 sbDisplay.setCurrentCorr(127,127,127);//This should be MAX
JoKer 0:f76850de7b57 70 wait(2);
JoKer 3:9376bf1f1bbd 71 //sbDisplay.setCurrentCorr(0x78,0x64,0x64);//sb suggested default
JoKer 3:9376bf1f1bbd 72 sbDisplay.setCurrentCorr(0,0,0);//Dim
JoKer 3:9376bf1f1bbd 73
JoKer 3:9376bf1f1bbd 74 wait(2);
JoKer 3:9376bf1f1bbd 75 PC.printf("INVERTED\r\n");
JoKer 3:9376bf1f1bbd 76 sbDisplay.invert();
JoKer 3:9376bf1f1bbd 77 sbDisplay.displayFrame();
JoKer 3:9376bf1f1bbd 78 wait(2);
JoKer 3:9376bf1f1bbd 79 PC.printf("FLIP\r\n");
JoKer 3:9376bf1f1bbd 80 sbDisplay.flip();
JoKer 3:9376bf1f1bbd 81 sbDisplay.displayFrame();
JoKer 0:f76850de7b57 82 wait(2);
JoKer 3:9376bf1f1bbd 83 sbDisplay.setLed(0,0XFF0000);//Red
JoKer 3:9376bf1f1bbd 84 sbDisplay.setLed(1,0X000500);//Green
JoKer 3:9376bf1f1bbd 85 sbDisplay.setLed(2,0X000005);//Blue
JoKer 3:9376bf1f1bbd 86 sbDisplay.setLed(3,0X050500);//Yellow
JoKer 3:9376bf1f1bbd 87 sbDisplay.setLed(4,0X000505); //Cyan?
JoKer 3:9376bf1f1bbd 88 sbDisplay.setLed(5,0X050005); // Purple
JoKer 3:9376bf1f1bbd 89 sbDisplay.displayFrame(); //get it on the LEDS
JoKer 3:9376bf1f1bbd 90
JoKer 3:9376bf1f1bbd 91 PC.printf("RotateL");
JoKer 3:9376bf1f1bbd 92 unsigned int loop;
JoKer 3:9376bf1f1bbd 93 for (loop=0; loop != 100; loop++){
JoKer 3:9376bf1f1bbd 94 sbDisplay.rotateLeft();
JoKer 3:9376bf1f1bbd 95 sbDisplay.displayFrame();
JoKer 3:9376bf1f1bbd 96 wait(0.1);
JoKer 3:9376bf1f1bbd 97 }
JoKer 3:9376bf1f1bbd 98 PC.printf("RotateR");
JoKer 3:9376bf1f1bbd 99 //unsigned int loop;
JoKer 3:9376bf1f1bbd 100 for (loop=0; loop != 100; loop++){
JoKer 3:9376bf1f1bbd 101 sbDisplay.rotateRight();
JoKer 3:9376bf1f1bbd 102 sbDisplay.displayFrame();
JoKer 3:9376bf1f1bbd 103 wait(0.1);
JoKer 3:9376bf1f1bbd 104 }
JoKer 3:9376bf1f1bbd 105 for(loop=0; loop !=6; loop++){
JoKer 3:9376bf1f1bbd 106 sbDisplay.shiftRight();
JoKer 3:9376bf1f1bbd 107 sbDisplay.displayFrame();
JoKer 3:9376bf1f1bbd 108 wait(0.2);
JoKer 3:9376bf1f1bbd 109 }
JoKer 2:3935d2ed40cd 110
JoKer 2:3935d2ed40cd 111
JoKer 2:3935d2ed40cd 112 sbDisplay.setLed(0,0X0F0000);//Red
JoKer 2:3935d2ed40cd 113 sbDisplay.setLed(1,0X000F00);//Green
JoKer 2:3935d2ed40cd 114 sbDisplay.setLed(2,0X00000F);//Blue
JoKer 2:3935d2ed40cd 115 sbDisplay.setLed(3,0X0F0F00);//Yellow
JoKer 2:3935d2ed40cd 116 sbDisplay.setLed(4,0X000F0F); //Cyan?
JoKer 2:3935d2ed40cd 117 sbDisplay.setLed(5,0X0F000F); // Purple
JoKer 2:3935d2ed40cd 118 sbDisplay.displayFrame(); //get it on the LEDS
JoKer 2:3935d2ed40cd 119 wait(0.5);
JoKer 2:3935d2ed40cd 120 sbDisplay.setCurrentCorr(0,0,0);//Dim
JoKer 2:3935d2ed40cd 121
JoKer 2:3935d2ed40cd 122 sbDisplay.displayFrame(); //get it on the LEDS
JoKer 4:d2f8ddb423e2 123
JoKer 4:d2f8ddb423e2 124 //Alternative to calling displayFrame() yourself, setup the framerate and update the display using Ticker e.g.
JoKer 2:3935d2ed40cd 125 //t.attach_us(&sbDisplay,&shiftBriteDisplay::displayFrame,41666);//call updateFrame 24 times per second (every 41666uS)
JoKer 4:d2f8ddb423e2 126 //or t.attach(&sbDisplay,&shiftBriteDisplay::displayFrame,0.5);// or only every 0.5s for testing
JoKer 2:3935d2ed40cd 127
JoKer 2:3935d2ed40cd 128
JoKer 5:aa0424f31fa1 129 //
JoKer 5:aa0424f31fa1 130 //EXPANDING THE FUNCTIONALITY OF shiftBriteDisplay class; USING THE MOVIE CLASS
JoKer 5:aa0424f31fa1 131 //I know, i know, 'MOVIE' is a HUGE stretch but it sounds good right?!?! :)
JoKer 5:aa0424f31fa1 132 //
JoKer 4:d2f8ddb423e2 133 //Note, it uses the previously declared sbDisplay object. It is passed as a reference.
JoKer 4:d2f8ddb423e2 134 movie myMovie(aMovie,sbDisplay,sizeof(aMovie));
JoKer 4:d2f8ddb423e2 135 myMovie.setRepeat(1);
JoKer 5:aa0424f31fa1 136
JoKer 4:d2f8ddb423e2 137 t.attach(&myMovie,&movie::play,0.05);//Beware, if you go too fast here the FRDM will crash
JoKer 5:aa0424f31fa1 138 */
JoKer 4:d2f8ddb423e2 139
JoKer 5:aa0424f31fa1 140 double p;
JoKer 5:aa0424f31fa1 141 unsigned int j;
JoKer 5:aa0424f31fa1 142 for (j=0; j != sbDisplay.getModuleCount(); j++){
JoKer 5:aa0424f31fa1 143 sbDisplay.setLed(j,0,0,0);//set all led to black
JoKer 5:aa0424f31fa1 144 }
JoKer 5:aa0424f31fa1 145 sbDisplay.displayFrame();//get it on the leds
JoKer 5:aa0424f31fa1 146 sbDisplay.setCurrentCorr(0,0,0);//Dim down to 30%
JoKer 4:d2f8ddb423e2 147 while(1){ // Nothing going on in the main loop as Ticker calls the appropriate member function
JoKer 5:aa0424f31fa1 148 //Test modified shiftRight - simple colour chaser
JoKer 5:aa0424f31fa1 149 for(p=0; p <= (2.0*M_PI); p+=M_PI/((double)sbDisplay.getModuleCount()*2.0)){
JoKer 5:aa0424f31fa1 150 //cycle through 0-pi
JoKer 5:aa0424f31fa1 151 //sbDisplay.shiftRight((unsigned short int)(5000.0*(1+sin(p+0))),(unsigned short int)(5000.0*(1+sin(p+(2.0*M_PI)/3.0))),(unsigned short int)(5000.0*(1+sin(p+2.0*((2.0*M_PI)/3.0)))));
JoKer 5:aa0424f31fa1 152 sbDisplay.shiftRight((unsigned short int)(500.0*(1+sin(p))),(unsigned short int)(500.0*(1+sin(p+(120.0*(M_PI/180.0))))),(unsigned short int)(500.0*(1+sin(p+(240.0*(M_PI/180.0))))));
JoKer 5:aa0424f31fa1 153 sbDisplay.displayFrame();
JoKer 5:aa0424f31fa1 154 wait(1.0/((double)sbDisplay.getModuleCount()/2.0));
JoKer 5:aa0424f31fa1 155 }
JoKer 0:f76850de7b57 156 }
JoKer 0:f76850de7b57 157 }
JoKer 4:d2f8ddb423e2 158
JoKer 4:d2f8ddb423e2 159
JoKer 4:d2f8ddb423e2 160 /*TODO -
JoKer 4:d2f8ddb423e2 161 Inheritance is one of the great features of object oriented languages like C++. The stream methods are not included in serial to allow you to use them in other classes as well. They are for example also included in the TextLCD class and in my enhanced TextLCD class. All you need to do to make use of the powerful printf features is implement a putc() method in your own new class.
JoKer 4:d2f8ddb423e2 162 from https://mbed.org/questions/1029/pcprintf-a-method/
JoKer 4:d2f8ddb423e2 163
JoKer 4:d2f8ddb423e2 164 */