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

Dependencies:   mbed

Committer:
JoKer
Date:
Wed Aug 20 09:26:42 2014 +0000
Revision:
4:d2f8ddb423e2
Parent:
3:9376bf1f1bbd
Child:
5:aa0424f31fa1
Cleaned docs and code some more.

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 4:d2f8ddb423e2 4
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 2:3935d2ed40cd 17 1023,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, /*Frame 0*/
JoKer 2:3935d2ed40cd 18 0,0,0, 1023,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, /*Frame 1*/
JoKer 2:3935d2ed40cd 19 0,0,0, 0,0,0, 1023,0,0, 0,0,0, 0,0,0, 0,0,0, /*Frame 2*/
JoKer 2:3935d2ed40cd 20 0,0,0, 0,0,0, 0,0,0, 1023,0,0, 0,0,0, 0,0,0, /*Frame 3*/
JoKer 2:3935d2ed40cd 21 0,0,0, 0,0,0, 0,0,0, 0,0,0, 1023,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 2:3935d2ed40cd 23 0,0,0, 0,0,0, 0,0,0, 0,0,0, 1023,0,0, 0,0,0, /*Frame 6*/
JoKer 2:3935d2ed40cd 24 0,0,0, 0,0,0, 0,0,0, 1023,0,0, 0,0,0, 0,0,0, /*Frame 7*/
JoKer 2:3935d2ed40cd 25 0,0,0, 0,0,0, 1023,0,0, 0,0,0, 0,0,0, 0,0,0, /*Frame 8*/
JoKer 2:3935d2ed40cd 26 0,0,0, 1023,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 4:d2f8ddb423e2 30 Serial PC(PTA2, PTA1);//So I can use Serial as output to terminal and input
JoKer 0:f76850de7b57 31
JoKer 4:d2f8ddb423e2 32 //================== HARDWARE CONNECTIONS =========================================
JoKer 4:d2f8ddb423e2 33 //NB!!! I have only tested this on the FRDM KL25Z and h/w connection as detailed below
JoKer 0:f76850de7b57 34 //Instanced of DigitalOut for control SB signals
JoKer 0:f76850de7b57 35 DigitalOut latch(PTC16);//010=latch
JoKer 0:f76850de7b57 36 DigitalOut enable(PTA13);//0= enabled
JoKer 0:f76850de7b57 37 DigitalOut reset(PTC12);
JoKer 0:f76850de7b57 38 //Instance of the SPI contoller for SB data
JoKer 0:f76850de7b57 39 SPI spi(PTD2,NC,PTD1);//PDT2 = MOSI=DATA. PDT1=CLK
JoKer 4:d2f8ddb423e2 40 //=================== END OF HARDWARE CONNECTIONS =================================
JoKer 0:f76850de7b57 41
JoKer 0:f76850de7b57 42 int main() {
JoKer 0:f76850de7b57 43
JoKer 0:f76850de7b57 44 //Instanciate a ticker object to handle framerate updates for the SB display
JoKer 0:f76850de7b57 45 Ticker t;
JoKer 0:f76850de7b57 46
JoKer 0:f76850de7b57 47 //Instanciate a string of 5 sb modules and tell the driver object where the control/data pins are
JoKer 4:d2f8ddb423e2 48 shiftBriteDisplay sbDisplay(latch, enable, reset, spi,6);
JoKer 0:f76850de7b57 49
JoKer 0:f76850de7b57 50 //Example calls to method f() of shiftBriteDisplay class
JoKer 0:f76850de7b57 51 //in this case, 6 of these statements wold be required to build one frame
JoKer 2:3935d2ed40cd 52 //HOW TO BUILD A FRAME IF YOU ARE NOT USING THE MOVIE CLASS
JoKer 2:3935d2ed40cd 53 sbDisplay.setLed(0,0XFF0000);//Red
JoKer 0:f76850de7b57 54 sbDisplay.setLed(1,0X00FF00);//Green
JoKer 0:f76850de7b57 55 sbDisplay.setLed(2,0X0000FF);//Blue
JoKer 0:f76850de7b57 56 sbDisplay.setLed(3,0XFFFF00);//Yellow
JoKer 0:f76850de7b57 57 sbDisplay.setLed(4,0X00FFFF); //Cyan?
JoKer 2:3935d2ed40cd 58 sbDisplay.setLed(5,0XFF00FF); // Purple
JoKer 0:f76850de7b57 59
JoKer 2:3935d2ed40cd 60 //HOW TO ADJUST THE CURRENT CONTROLLERS USED FOR DOT CORRECTION
JoKer 0:f76850de7b57 61 sbDisplay.setCurrentCorr(0,0,0);//suggested default value cor current control regs. Values g&b=100, r=120
JoKer 0:f76850de7b57 62 sbDisplay.displayFrame();//force an update
JoKer 0:f76850de7b57 63 wait(2);
JoKer 0:f76850de7b57 64 sbDisplay.setCurrentCorr(127,127,127);//This should be MAX
JoKer 0:f76850de7b57 65 wait(2);
JoKer 3:9376bf1f1bbd 66 //sbDisplay.setCurrentCorr(0x78,0x64,0x64);//sb suggested default
JoKer 3:9376bf1f1bbd 67 sbDisplay.setCurrentCorr(0,0,0);//Dim
JoKer 3:9376bf1f1bbd 68
JoKer 3:9376bf1f1bbd 69 wait(2);
JoKer 3:9376bf1f1bbd 70 PC.printf("INVERTED\r\n");
JoKer 3:9376bf1f1bbd 71 sbDisplay.invert();
JoKer 3:9376bf1f1bbd 72 sbDisplay.displayFrame();
JoKer 3:9376bf1f1bbd 73 wait(2);
JoKer 3:9376bf1f1bbd 74 PC.printf("FLIP\r\n");
JoKer 3:9376bf1f1bbd 75 sbDisplay.flip();
JoKer 3:9376bf1f1bbd 76 sbDisplay.displayFrame();
JoKer 0:f76850de7b57 77 wait(2);
JoKer 3:9376bf1f1bbd 78 sbDisplay.setLed(0,0XFF0000);//Red
JoKer 3:9376bf1f1bbd 79 sbDisplay.setLed(1,0X000500);//Green
JoKer 3:9376bf1f1bbd 80 sbDisplay.setLed(2,0X000005);//Blue
JoKer 3:9376bf1f1bbd 81 sbDisplay.setLed(3,0X050500);//Yellow
JoKer 3:9376bf1f1bbd 82 sbDisplay.setLed(4,0X000505); //Cyan?
JoKer 3:9376bf1f1bbd 83 sbDisplay.setLed(5,0X050005); // Purple
JoKer 3:9376bf1f1bbd 84 sbDisplay.displayFrame(); //get it on the LEDS
JoKer 3:9376bf1f1bbd 85
JoKer 3:9376bf1f1bbd 86 PC.printf("RotateL");
JoKer 3:9376bf1f1bbd 87 unsigned int loop;
JoKer 3:9376bf1f1bbd 88 for (loop=0; loop != 100; loop++){
JoKer 3:9376bf1f1bbd 89 sbDisplay.rotateLeft();
JoKer 3:9376bf1f1bbd 90 sbDisplay.displayFrame();
JoKer 3:9376bf1f1bbd 91 wait(0.1);
JoKer 3:9376bf1f1bbd 92 }
JoKer 3:9376bf1f1bbd 93 PC.printf("RotateR");
JoKer 3:9376bf1f1bbd 94 //unsigned int loop;
JoKer 3:9376bf1f1bbd 95 for (loop=0; loop != 100; loop++){
JoKer 3:9376bf1f1bbd 96 sbDisplay.rotateRight();
JoKer 3:9376bf1f1bbd 97 sbDisplay.displayFrame();
JoKer 3:9376bf1f1bbd 98 wait(0.1);
JoKer 3:9376bf1f1bbd 99 }
JoKer 3:9376bf1f1bbd 100 for(loop=0; loop !=6; loop++){
JoKer 3:9376bf1f1bbd 101 sbDisplay.shiftRight();
JoKer 3:9376bf1f1bbd 102 sbDisplay.displayFrame();
JoKer 3:9376bf1f1bbd 103 wait(0.2);
JoKer 3:9376bf1f1bbd 104 }
JoKer 2:3935d2ed40cd 105
JoKer 2:3935d2ed40cd 106
JoKer 2:3935d2ed40cd 107 sbDisplay.setLed(0,0X0F0000);//Red
JoKer 2:3935d2ed40cd 108 sbDisplay.setLed(1,0X000F00);//Green
JoKer 2:3935d2ed40cd 109 sbDisplay.setLed(2,0X00000F);//Blue
JoKer 2:3935d2ed40cd 110 sbDisplay.setLed(3,0X0F0F00);//Yellow
JoKer 2:3935d2ed40cd 111 sbDisplay.setLed(4,0X000F0F); //Cyan?
JoKer 2:3935d2ed40cd 112 sbDisplay.setLed(5,0X0F000F); // Purple
JoKer 2:3935d2ed40cd 113 sbDisplay.displayFrame(); //get it on the LEDS
JoKer 2:3935d2ed40cd 114 wait(0.5);
JoKer 2:3935d2ed40cd 115 sbDisplay.setCurrentCorr(0,0,0);//Dim
JoKer 2:3935d2ed40cd 116
JoKer 2:3935d2ed40cd 117 sbDisplay.displayFrame(); //get it on the LEDS
JoKer 4:d2f8ddb423e2 118
JoKer 4:d2f8ddb423e2 119 //Alternative to calling displayFrame() yourself, setup the framerate and update the display using Ticker e.g.
JoKer 2:3935d2ed40cd 120 //t.attach_us(&sbDisplay,&shiftBriteDisplay::displayFrame,41666);//call updateFrame 24 times per second (every 41666uS)
JoKer 4:d2f8ddb423e2 121 //or t.attach(&sbDisplay,&shiftBriteDisplay::displayFrame,0.5);// or only every 0.5s for testing
JoKer 2:3935d2ed40cd 122
JoKer 2:3935d2ed40cd 123
JoKer 4:d2f8ddb423e2 124 /*
JoKer 4:d2f8ddb423e2 125 EXPANDING THE FUNCTIONALITY OF shiftBriteDisplay class; USING THE MOVIE CLASS
JoKer 4:d2f8ddb423e2 126 I know, i know, 'MOVIE' is a HUGE stretch but it sounds good right?!?! :)
JoKer 4:d2f8ddb423e2 127 */
JoKer 4:d2f8ddb423e2 128 //Note, it uses the previously declared sbDisplay object. It is passed as a reference.
JoKer 4:d2f8ddb423e2 129 movie myMovie(aMovie,sbDisplay,sizeof(aMovie));
JoKer 4:d2f8ddb423e2 130 myMovie.setRepeat(1);
JoKer 4:d2f8ddb423e2 131 t.attach(&myMovie,&movie::play,0.05);//Beware, if you go too fast here the FRDM will crash
JoKer 0:f76850de7b57 132
JoKer 4:d2f8ddb423e2 133
JoKer 4:d2f8ddb423e2 134
JoKer 4:d2f8ddb423e2 135 while(1){ // Nothing going on in the main loop as Ticker calls the appropriate member function
JoKer 0:f76850de7b57 136 }
JoKer 0:f76850de7b57 137 }
JoKer 4:d2f8ddb423e2 138
JoKer 4:d2f8ddb423e2 139
JoKer 4:d2f8ddb423e2 140 /*TODO -
JoKer 4:d2f8ddb423e2 141 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 142 from https://mbed.org/questions/1029/pcprintf-a-method/
JoKer 4:d2f8ddb423e2 143
JoKer 4:d2f8ddb423e2 144 */