dfi-led-matrix/eigener_ctrl/arduino_sketch/arduino_sketch.ino

137 lines
3.0 KiB
C++

#define CLK 2 //Connected to TPIC pin 13: SRCLK (aka Clock)
#define LATCH 3 //Connected to TPIC pin 12: RCLK (aka Latch/load/CS/SS...)
#define DOUT 4 //Connected to TPIC pin 3: SER (aka MOSI)
#define SEG_0 A0
#define SEG_1 A1
#define SEG_2 A2
#define SEG_3 A3
#define SEG_4 A4
#define SEG_5 A5
#define SEG_6 11
#define SEG_7 12
#define FET_COUNT 8
#define BYTE_PER_FET 6
volatile uint8_t data[FET_COUNT][BYTE_PER_FET];
long dataMillis = 0;
uint8_t dataDemoStep = 0;
void setup() {
Serial.begin(115200);
pinMode(CLK,OUTPUT);
pinMode(LATCH,OUTPUT);
pinMode(DOUT, OUTPUT);
pinMode(SEG_0, OUTPUT);
pinMode(SEG_1, OUTPUT);
pinMode(SEG_2, OUTPUT);
pinMode(SEG_3, OUTPUT);
pinMode(SEG_4, OUTPUT);
pinMode(SEG_5, OUTPUT);
pinMode(SEG_6, OUTPUT);
pinMode(SEG_7, OUTPUT);
initializeSRData(); //Prepares SR and clears data on serial line
}
void loop() {
if(millis() - dataMillis > 10) {
static uint8_t counterFet = 0;
static uint8_t counterDigit = 0;
static uint8_t counterBit = 0;
for(int fet=0; fet<FET_COUNT; fet++) {
for(int digit=0; digit<BYTE_PER_FET; digit++) {
if(fet == counterFet && digit == counterDigit) {
data[fet][digit] = _BV(counterBit);
} else {
data[fet][digit] = 0;
}
}
}
counterBit++;
if(counterBit > 7) {
counterBit = 0;
counterDigit++;
if(counterDigit > 5) {
counterFet++;
counterDigit = 0;
counterFet %= FET_COUNT;
}
}
dataMillis = millis();
}
refreshDisplay(); //Cycles through all displays and digits
}
void initializeSRData() {
digitalWrite(LATCH,HIGH); //Tells all SRs that uController is sending data
for(int digit = 0; digit < BYTE_PER_FET; digit++) {
shiftOut(DOUT, CLK, LSBFIRST,0);
}
digitalWrite(LATCH,LOW); //Tells all SRs that uController is done sending data
}
void clearDisplay(int dispID) {
initializeSRData();
refreshDisplay();
}
void refreshDisplay() {
for(int fet=0; fet<FET_COUNT; fet++) {
// switch fets
digitalWrite(SEG_0, LOW);
digitalWrite(SEG_1, LOW);
digitalWrite(SEG_2, LOW);
digitalWrite(SEG_3, LOW);
digitalWrite(SEG_4, LOW);
digitalWrite(SEG_5, LOW);
digitalWrite(SEG_6, LOW);
digitalWrite(SEG_7, LOW);
digitalWrite(LATCH, HIGH);
for(int digit = 0; digit < BYTE_PER_FET; digit++) {
shiftOut(DOUT, CLK, LSBFIRST, data[fet][digit]);
}
digitalWrite(LATCH, LOW);
// switch fets
digitalWrite(SEG_0, (fet == 0) ? HIGH : LOW);
digitalWrite(SEG_1, (fet == 1) ? HIGH : LOW);
digitalWrite(SEG_2, (fet == 2) ? HIGH : LOW);
digitalWrite(SEG_3, (fet == 3) ? HIGH : LOW);
digitalWrite(SEG_4, (fet == 4) ? HIGH : LOW);
digitalWrite(SEG_5, (fet == 5) ? HIGH : LOW);
digitalWrite(SEG_6, (fet == 6) ? HIGH : LOW);
digitalWrite(SEG_7, (fet == 7) ? HIGH : LOW);
delayMicroseconds(500);
//delay(1);
}
}