flipdot/flipshifter/src/main.cpp

111 lines
2.5 KiB
C++
Raw Normal View History

2021-09-21 05:58:25 +00:00
#include <Arduino.h>
/*
D7 - Ser (data)
D5 - clock
D1 - _OE
D2 - latch
D3 - _clear
*/
#define PIN_DATA D7
#define PIN_CLK D5
#define PIN_OE D1 //active low
#define PIN_LATCH D2
#define PIN_CLEAR D4 //active low
#define NUMPANELS 1
uint16_t dataRow = 0;
uint8_t dataControl = 0;
uint8_t dataColumn[NUMPANELS*7]; //raw data for shift register, 7bytes per panel (last 6 bits arent used)
void sr_clear();
void shiftOutSlow(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val);
unsigned long loopmillis=0;
unsigned long last_update=0;
#define UPDATE_INTERVAL 1000
void setup() {
pinMode(PIN_DATA, OUTPUT);
pinMode(PIN_CLK, OUTPUT);
pinMode(PIN_OE, OUTPUT);
pinMode(PIN_LATCH, OUTPUT);
pinMode(PIN_CLEAR, OUTPUT);
digitalWrite(PIN_OE, HIGH);
digitalWrite(PIN_LATCH, LOW);
sr_clear();
Serial.begin(115200);
}
int countz=0;
void loop() {
loopmillis = millis();
if (loopmillis > last_update + UPDATE_INTERVAL)
{
dataControl=0;
#define CONTROL_LED 1
#define CONTROL_CLEAR 128 //active low
uint8_t selectedrow=0;
dataRow=2^selectedrow; //test select one row
if (countz%2==0) {
Serial.println("0");
}else{
dataControl=CONTROL_LED;
Serial.println("1");
}
//first shifted out bytes are farthest away in the line
shiftOutSlow(PIN_DATA, PIN_CLK, MSBFIRST, dataControl); //Control. Bit 1 is Qa
shiftOutSlow(PIN_DATA, PIN_CLK, MSBFIRST, dataControl); //Control. Bit 1 is Qa
shiftOutSlow(PIN_DATA, PIN_CLK, MSBFIRST, (uint8_t)(dataRow>>8)); //High Byte
shiftOutSlow(PIN_DATA, PIN_CLK, MSBFIRST, (uint8_t)dataRow); //Low Byte
digitalWrite(PIN_LATCH, HIGH); //Latch data
delayMicroseconds(1000);
digitalWrite(PIN_LATCH, LOW);
digitalWrite(PIN_OE, LOW); //activate output
last_update=loopmillis;
Serial.print("miau=");
Serial.println(countz);
countz++;
}
}
void sr_clear() {
digitalWrite(PIN_CLEAR, LOW);
delayMicroseconds(1000);
digitalWrite(PIN_CLEAR, HIGH);
}
void shiftOutSlow(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
{
uint8_t i;
for (i = 0; i < 8; i++) {
if (bitOrder == LSBFIRST)
digitalWrite(dataPin, !!(val & (1 << i)));
else
digitalWrite(dataPin, !!(val & (1 << (7 - i))));
delayMicroseconds(100);
digitalWrite(clockPin, HIGH);
delayMicroseconds(100);
digitalWrite(clockPin, LOW);
delayMicroseconds(100);
}
}