Skip to content

Instantly share code, notes, and snippets.

@indrora
Created November 11, 2012 19:30
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save indrora/4055992 to your computer and use it in GitHub Desktop.
D3N9: Demscene tribute on ChipKIT UNO32
/*
D3N9: Old-Skool demoscene scroller for PIC32
*/
/* Kindly ripped from IOShield_OLED_Full_Demo */
#include <IOShieldOled.h>
#define OLED IOShieldOledClass
OLED oled;
// Message to display.
char greetz[] = "*** Sine-wave text display for MPIDE/Uno32 *** Written by @indrora *** Greetz go out to ... Quelab ... Digilent ... Microchip ... Arduino ... ben_zen ... #gaygeeks ... #c *** Don't forget to floss! " ;
// Max columns
#define COL_MAX IOShieldOled.colMax
// Number of chars out of the message we can display at any one time.
#define NUM_CHARS 16
// Macros.
#define MIDDLE_X (oled.colMax/2)
#define MIDDLE_Y (oled.rowMax/2)
// Times through the loop we've been
int ticks = 1;
// Floating-point version of the map function from Arduino
float mapf(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
void setup() {
// Init OLED.
oled.begin();
pinMode(2, INPUT); // forward/backward.
pinMode(7, INPUT); // play/pause
pinMode(8, INPUT); // Display text on HIGH
pinMode(35, INPUT);// display starfield on HIGH
}
void loop() {
// Clear the buffer, since we're drawing a frame.
oled.clearBuffer();
float phase = map(analogRead(A0), 0, 1023, 1,32);
if(digitalRead(8) == HIGH)
{
// Draw text scroller.
oled.setDrawMode(OLED::modeSet);
for(int ix=0;ix<NUM_CHARS;ix++)
{
float pos = min( ( ( MIDDLE_Y-4) + (sinf((float)(ticks+ix)/phase)*(float)(MIDDLE_Y)*0.75) ), 24 ) ;
// This is a glorious hack.
// c_char is ticks/phase + ix mod sizeof(greetz) -1
// c_char now rotates gracefully through the string, looping when it needs to.
char c_char = *(greetz + ((ticks/(int)phase) + ix) % sizeof(greetz)-1 );
oled.moveTo(8*ix,pos);
// putChar would, here, put it on the 4x16 grid. drawChar uses "graphic" characters.
oled.drawChar(c_char);
}
}
if(digitalRead(35) == HIGH)
{
// Draw the starfield behind.
oled.setDrawMode(OLED::modeXor);
for(int ix = 0;ix<24; ix++)
{
float x = mapf(ix,0,31 ,0,oled.colMax) ;
// Some fun math.
float y = mapf( sinf((cosf(2*ix)/24)*ticks), -1 , 1,0,oled.rowMax);
// This should mix things up a touch.
oled.moveTo( (int)(x*2) % (int)oled.colMax ,y );
oled.drawPixel();
}
}
// Now, what do we do /now/
int dir = digitalRead(2);
int go = digitalRead(7);
if(go != LOW)
{
if(dir != LOW)
ticks++;
else
ticks--;
}
delay(64);
// Pump the display.
oled.updateDisplay();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment