Code
/******************************************************************************/
/* Files to Include */
/******************************************************************************/
#include <p18cxxx.h> /* C18 General Include File */
#include "system.h" /* System funct/params, like osc/peripheral config */
#include "user.h" /* User funct/params, such as InitApp */
#include <stdlib.h>
/******************************************************************************/
/* User Global Variable Declaration */
/******************************************************************************/
#define SCLK PORTCbits.RC0
#define SOUT PORTCbits.RC1
#define BLANK PORTCbits.RC6
#define XLAT PORTCbits.RC7
#define MAX_STEP 4095
#define POUR_TIME 5
unsigned int pwmbuffer[24]; // Brightness buffer
int b, c, i, j, k; // Loop variables
unsigned int d; // for delay function only
int fillLevel; // Counter variable for fill LEDs
/******************************************************************************/
/* Main Program */
/******************************************************************************/
void pourLEDs( char color, int step );
void followLEDs( char color, int step, int loop);
void fadeLEDs(char color, int step);
void flashLEDs(char color, unsigned int time, int brightness);
void fillLEDs( char color, int step );
void randomLED( int step );
void delay( unsigned int cycles );
void setLED(int lednum, int r, int g, int b);
void setPWM(int chan, int pwm);
void writeLED( void );
void clearAll( void );
void main(void)
{
ConfigureOscillator();
InitApp();
BLANK = 1;
XLAT = 0;
// Initialize pwmbuffer
clearAll();
// Process Loop
while(1)
{
// Fades into and out of color
fadeLEDs('r',5);
fadeLEDs('g',5);
fadeLEDs('b',5);
fadeLEDs('c',5);
fadeLEDs('y',5);
fadeLEDs('m',5);
fadeLEDs('w',5);
// Flashes color at brightness for length given as third variable
flashLEDs('r',4095,60000);
flashLEDs('r',4095,60000);
flashLEDs('r',4095,60000);
flashLEDs('r',4095,60000);
flashLEDs('g',4095,60000);
flashLEDs('g',4095,60000);
flashLEDs('g',4095,60000);
flashLEDs('g',4095,60000);
flashLEDs('b',4095,60000);
flashLEDs('b',4095,60000);
flashLEDs('b',4095,60000);
flashLEDs('b',4095,60000);
flashLEDs('w',4095,60000);
flashLEDs('w',4095,60000);
flashLEDs('w',4095,60000);
flashLEDs('w',4095,60000);
// Turns on LEDs in circle pattern
fillLEDs('r', 25);
// Turns on LEDs one at a time in circle pattern
followLEDs('r', 30, 1);
followLEDs('b', 30, 2);
followLEDs('c', 30, 3);
followLEDs('w', 30, 4);
// Color taking in counter variable
for(i = 0; i < 10; i++)
delay(10000);
pourLEDs('b', 2);
for(i = 0; i < 10; i++)
delay(10000);
pourLEDs('b', 3);
for(i = 0; i < 10; i++)
delay(10000);
pourLEDs('b', 4);
for(i = 0; i < 10; i++)
delay(10000);
pourLEDs('b', 5);
}
}
void pourLEDs( char color, int timer )
{
int scaledTime;
scaledTime = (MAX_STEP / POUR_TIME) * timer;
for (i = 0; i < 8; i++)
{
if (color == 'r')
setLED(i, scaledTime, 0, 0);
if (color == 'g')
setLED(i, 0, scaledTime, 0);
if (color == 'b')
setLED(i, 0, 0, scaledTime);
}
writeLED();
}
void followLEDs( char color, int step, int loop)
{
int firstLoop = 1;
while (loop >= 0 )
{
for (i = 0; i < 8; i++)
{
if (i == 0 && firstLoop)
for (j = 0; j < MAX_STEP; j++)
{
if (color == 'r')
setLED(i, j, 0, 0);
if (color == 'g')
setLED(i, 0, j, 0);
if (color == 'b')
setLED(i, 0, 0, j);
if (color == 'y')
setLED(i, j, j, 0);
if (color == 'c')
setLED(i, 0, j, j);
if (color == 'm')
setLED(i, j, 0, j);
if (color == 'w')
setLED(i, j, j, j);
writeLED();
j = j + step;
firstLoop = 0;
}
if (i > 0)
{
for (j = 0, k = MAX_STEP; j < MAX_STEP || k > 0; j++, k--)
{
if (color == 'r')
{
setLED(i, j, 0, 0);
setLED(i-1, k, 0, 0);
}
if (color == 'g')
{
setLED(i, 0, j, 0);
setLED(i-1, 0, k, 0);
}
if (color == 'b')
{
setLED(i, 0, 0, j);
setLED(i-1, 0, 0, k);
}
if (color == 'y')
{
setLED(i, j, j, 0);
setLED(i-1, k, k, 0);
}
if (color == 'c')
{
setLED(i, 0, j, j);
setLED(i-1, 0, k, k);
}
if (color == 'm')
{
setLED(i, j, 0, j);
setLED(i-1, k, 0, k);
}
if (color == 'w')
{
setLED(i, j, j, j);
setLED(i-1, k, k, k);
}
writeLED();
j = j + step;
k = k - step;
}
setLED(i-1, 0, 0, 0);
writeLED();
}
if (i == 7)
{
for (j = 0, k = MAX_STEP; j < MAX_STEP, k > 0; k++, j--)
{
if (color == 'r'){
if (loop > 0)
setLED(0, j, 0, 0);
setLED(i, k, 0, 0);
}
if (color == 'g'){
if (loop > 0)
setLED(0, 0, j, 0);
setLED(i, 0, k, 0);
}
if (color == 'b'){
if (loop > 0)
setLED(0, 0, 0, j);
setLED(i, 0, 0, k);
}
if (color == 'y'){
if (loop > 0)
setLED(0, j, j, 0);
setLED(i, k, k, 0);
}
if (color == 'c'){
if (loop > 0)
setLED(0, 0, j, j);
setLED(i, 0, k, k);
}
if (color == 'm'){
if (loop > 0)
setLED(0, j, 0, j);
setLED(i, k, 0, k);
}
if (color == 'w'){
if (loop > 0)
setLED(0, j, j, j);
setLED(i, k, k, k);
}
writeLED();
k = k - step;
}
setLED(i, 0, 0, 0);
writeLED();
}
}
loop--;
}
}
void fillLEDs( char color, int step )
{
for (i = 0; i < 8; i++)
for (j = 0; j < MAX_STEP; j++)
{
if (color == 'r')
setLED(i, j, 0, 0);
if (color == 'g')
setLED(i, 0, j, 0);
if (color == 'b')
setLED(i, 0, 0, j);
if (color == 'y')
setLED(i, j, j, 0);
if (color == 'c')
setLED(i, 0, j, j);
if (color == 'm')
setLED(i, j, 0, j);
if (color == 'w')
setLED(i, j, j, j);
writeLED();
j = j + step;
}
for (i = 0; i < 8; i++)
{
for (j = MAX_STEP; j > 0; j--)
{
if (color == 'r')
setLED(i, j, 0, 0);
if (color == 'g')
setLED(i, 0, j, 0);
if (color == 'b')
setLED(i, 0, 0, j);
if (color == 'y')
setLED(i, j, j, 0);
if (color == 'c')
setLED(i, 0, j, j);
if (color == 'm')
setLED(i, j, 0, j);
if (color == 'w')
setLED(i, j, j, j);
writeLED();
j = j - step;
}
setLED(i, 0, 0, 0);
writeLED();
}
}
void flashLEDs(char color, unsigned int time, int brt)
{
for (i = 0; i < 8; i++)
{
if (color == 'r')
setLED(i, brt, 0, 0);
if (color == 'g')
setLED(i, 0, brt, 0);
if (color == 'b')
setLED(i, 0, 0, brt);
if (color == 'c')
setLED(i, 0, brt, brt);
if (color == 'y')
setLED(i, brt, brt, 0);
if (color == 'm')
setLED(i, brt, 0, brt);
if (color == 'w')
setLED(i, brt, brt, brt);
}
writeLED();
// Delay function times 10
for(i = 0; i < 10; i++)
delay(time);
// Turn off all LEDs
clearAll();
for(i = 0; i < 10; i++)
delay(time);
}
void fadeLEDs(char color, int step)
{
for (i = 0; i < MAX_STEP; i++)
{
for (j = 0; j < 8; j++)
{
if (color == 'r')
setLED(j, i, 0, 0);
if (color == 'g')
setLED(j, 0, i, 0);
if (color == 'b')
setLED(j, 0, 0, i);
if (color == 'y')
setLED(j, i, i, 0);
if (color == 'c')
setLED(j, 0, i, i);
if (color == 'm')
setLED(j, i, 0, i);
if (color == 'w')
setLED(j, i, i, i);
}
writeLED();
i = i + step;
}
for (i = MAX_STEP; i > 0; i--)
{
for (j = 0; j < 8; j++)
{
if (color == 'r')
setLED(j, i, 0, 0);
if (color == 'g')
setLED(j, 0, i, 0);
if (color == 'b')
setLED(j, 0, 0, i);
if (color == 'y')
setLED(j, i, i, 0);
if (color == 'c')
setLED(j, 0, i, i);
if (color == 'm')
setLED(j, i, 0, i);
if (color == 'w')
setLED(j, i, i, i);
}
writeLED();
i = i - step;
}
}
void setLED(int lednum, int r, int g, int b)
{
setPWM(lednum*3, b);
setPWM(lednum*3+1, g);
setPWM(lednum*3+2, r);
}
void setPWM(int chan, int pwm)
{
if (pwm > MAX_STEP) pwm = 255;
if (chan > 24) return;
pwmbuffer[chan] = pwm;
}
void clearAll( void )
{
for (i = 0; i < 24; i++)
pwmbuffer[i] = 0;
writeLED();
}
void writeLED( void )
{
XLAT = 0;
for (c = 23; c >= 0; c--)
{
for (b = 11; b >= 0; b--)
{
SCLK = 0;
delay(2);
if ( pwmbuffer[c] & (1 << b) )
SOUT = 1;
else
SOUT = 0;
SCLK = 1;
}
}
SCLK = 0;
BLANK = 1;
XLAT = 1;
BLANK = 0;
XLAT = 0;
}
void delay( unsigned int cycles )
{
for (d = 0; d < cycles; d++);
}