#include "LedControl.h"
#define NO_SHIFT 0
#define SHIFT_IN_NO 1
#define SHIFT_IN_YES 2
#define SHIFT_IN_NO_OUT 3
#define SHIFT_IN_YES_OUT 4
#define SHIFT_IN_NO_ROT 5
#define SHIFT_IN_YES_ROT 6
LedControl lc = LedControl(12,11,10,3);
unsigned long currentTime;
unsigned long refreshed = 0;
unsigned long refreshInterval = 50;
unsigned long shifted = 0;
unsigned long shiftInterval = 500;
char outputData[] = "ABCDEFGHIJ";
char outputPattern[10][8];
byte dataLength = 0;
byte displayCount = 0;
bool rotation = false;
byte buffers[3][8];
byte digits[10][8] = {
{
B00111000,
B01000100,
B01000100,
B01000100,
B01000100,
B01000100,
B01000100,
B00111000
},{
B00010000,
B00110000,
B00010000,
B00010000,
B00010000,
B00010000,
B00010000,
B00111000
},{
B00111000,
B01000100,
B00000100,
B00000100,
B00001000,
B00010000,
B00100000,
B01111100
},{
B00111000,
B01000100,
B00000100,
B00011000,
B00000100,
B00000100,
B01000100,
B00111000
},{
B00000100,
B00001100,
B00010100,
B00100100,
B01000100,
B01111100,
B00000100,
B00000100
},{
B01111100,
B01000000,
B01000000,
B01111000,
B00000100,
B00000100,
B01000100,
B00111000
},{
B00111000,
B01000100,
B01000000,
B01111000,
B01000100,
B01000100,
B01000100,
B00111000
},{
B01111100,
B00000100,
B00000100,
B00001000,
B00010000,
B00100000,
B00100000,
B00100000
},{
B00111000,
B01000100,
B01000100,
B00111000,
B01000100,
B01000100,
B01000100,
B00111000
},{
B00111000,
B01000100,
B01000100,
B01000100,
B00111100,
B00000100,
B01000100,
B00111000
}};
byte chars[52][8] = {
{
B00000000,
B00111100,
B01100110,
B01100110,
B01111110,
B01100110,
B01100110,
B01100110
},{
B00000000,
B01111100,
B01100110,
B01100110,
B01111100,
B01100110,
B01100110,
B01111100
},{
B00000000,
B00111100,
B01100110,
B01100000,
B01100000,
B01100000,
B01100110,
B00111100
},{
B00000000,
B01111100,
B01100110,
B01100110,
B01100110,
B01100110,
B01100110,
B01111100
},{
B00000000,
B01111110,
B01100000,
B01100000,
B01111100,
B01100000,
B01100000,
B01111110
},{
B00000000,
B01111110,
B01100000,
B01100000,
B01111100,
B01100000,
B01100000,
B01100000
},{
B00000000,
B00111100,
B01100110,
B01100000,
B01100000,
B01101110,
B01100110,
B00111100
},{
B00000000,
B01100110,
B01100110,
B01100110,
B01111110,
B01100110,
B01100110,
B01100110
},{
B00000000,
B00111100,
B00011000,
B00011000,
B00011000,
B00011000,
B00011000,
B00111100
},{
B00000000,
B00011110,
B00001100,
B00001100,
B00001100,
B01101100,
B01101100,
B00111000
},{
B00000000,
B01100110,
B01101100,
B01111000,
B01110000,
B01111000,
B01101100,
B01100110
},{
B00000000,
B01100000,
B01100000,
B01100000,
B01100000,
B01100000,
B01100000,
B01111110
},{
B00000000,
B01100011,
B01110111,
B01111111,
B01101011,
B01100011,
B01100011,
B01100011
},{
B00000000,
B01100011,
B01110011,
B01111011,
B01101111,
B01100111,
B01100011,
B01100011
},{
B00000000,
B00111100,
B01100110,
B01100110,
B01100110,
B01100110,
B01100110,
B00111100
},{
B00000000,
B01111100,
B01100110,
B01100110,
B01100110,
B01111100,
B01100000,
B01100000
},{
B00000000,
B00111100,
B01100110,
B01100110,
B01100110,
B01101110,
B00111100,
B00000110
},{
B00000000,
B01111100,
B01100110,
B01100110,
B01111100,
B01111000,
B01101100,
B01100110
},{
B00000000,
B00111100,
B01100110,
B01100000,
B00111100,
B00000110,
B01100110,
B00111100
},{
B00000000,
B01111110,
B01011010,
B00011000,
B00011000,
B00011000,
B00011000,
B00011000
},{
B00000000,
B01100110,
B01100110,
B01100110,
B01100110,
B01100110,
B01100110,
B00111110
},{
B00000000,
B01100110,
B01100110,
B01100110,
B01100110,
B01100110,
B00111100,
B00011000
},{
B00000000,
B01100011,
B01100011,
B01100011,
B01101011,
B01111111,
B01110111,
B01100011
},{
B00000000,
B01100011,
B01100011,
B00110110,
B00011100,
B00110110,
B01100011,
B01100011
},{
B00000000,
B01100110,
B01100110,
B01100110,
B00111100,
B00011000,
B00011000,
B00011000
},{
B00000000,
B01111110,
B00000110,
B00001100,
B00011000,
B00110000,
B01100000,
B01111110
},{
B00000000,
B00000000,
B00000000,
B00111100,
B00000110,
B00111110,
B01100110,
B00111110
},{
B00000000,
B01100000,
B01100000,
B01100000,
B01111100,
B01100110,
B01100110,
B01111100
},{
B00000000,
B00000000,
B00000000,
B00111100,
B01100110,
B01100000,
B01100110,
B00111100
},{
B00000000,
B00000110,
B00000110,
B00000110,
B00111110,
B01100110,
B01100110,
B00111110
},{
B00000000,
B00000000,
B00000000,
B00111100,
B01100110,
B01111110,
B01100000,
B00111100
},{
B00000000,
B00011100,
B00110110,
B00110000,
B00110000,
B01111100,
B00110000,
B00110000
},{
B00000000,
B00000000,
B00111110,
B01100110,
B01100110,
B00111110,
B00000110,
B00111100
},{
B00000000,
B01100000,
B01100000,
B01100000,
B01111100,
B01100110,
B01100110,
B01100110
},{
B00000000,
B00000000,
B00011000,
B00000000,
B00011000,
B00011000,
B00011000,
B00111100
},{
B00000000,
B00001100,
B00000000,
B00001100,
B00001100,
B01101100,
B01101100,
B00111000
},{
B00000000,
B01100000,
B01100000,
B01100110,
B01101100,
B01111000,
B01101100,
B01100110
},{
B00000000,
B00011000,
B00011000,
B00011000,
B00011000,
B00011000,
B00011000,
B00011000
},{
B00000000,
B00000000,
B00000000,
B01100011,
B01110111,
B01111111,
B01101011,
B01101011
},{
B00000000,
B00000000,
B00000000,
B01111100,
B01111110,
B01100110,
B01100110,
B01100110
},{
B00000000,
B00000000,
B00000000,
B00111100,
B01100110,
B01100110,
B01100110,
B00111100
},{
B00000000,
B00000000,
B01111100,
B01100110,
B01100110,
B01111100,
B01100000,
B01100000
},{
B00000000,
B00000000,
B00111100,
B01101100,
B01101100,
B00111100,
B00001101,
B00001111
},{
B00000000,
B00000000,
B00000000,
B01111100,
B01100110,
B01100110,
B01100000,
B01100000
},{
B00000000,
B00000000,
B00000000,
B00111110,
B01000000,
B00111100,
B00000010,
B01111100
},{
B00000000,
B00000000,
B00011000,
B00011000,
B01111110,
B00011000,
B00011000,
B00011000
},{
B00000000,
B00000000,
B00000000,
B01100110,
B01100110,
B01100110,
B01100110,
B00111110
},{
B00000000,
B00000000,
B00000000,
B00000000,
B01100110,
B01100110,
B00111100,
B00011000
},{
B00000000,
B00000000,
B00000000,
B01100011,
B01101011,
B01101011,
B01101011,
B00111110
},{
B00000000,
B00000000,
B00000000,
B01100110,
B00111100,
B00011000,
B00111100,
B01100110
},{
B00000000,
B00000000,
B00000000,
B01100110,
B01100110,
B00111110,
B00000110,
B00111100
},{
B00000000,
B00000000,
B00000000,
B00111100,
B00001100,
B00011000,
B00110000,
B00111100
}};
byte symbols[][8] = {
{
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000
},
{
B00000000,
B00011000,
B00111100,
B00111100,
B00011000,
B00011000,
B00000000,
B00011000
},{
B00000000,
B00111100,
B01100110,
B00000110,
B00011100,
B00011000,
B00000000,
B00011000
}};
void setup() {
ledSetup();
for (int i = 0; i < 3; i++) {
memcpy(&buffers[i], &symbols[0], sizeof(symbols[0]));
}
}
void loop() {
currentTime = millis();
if (dataLength == 0) {
dataToPattern();
}
buffersIn(SHIFT_IN_YES_ROT);
buffersOut();
}
void buffersIn(int mode) {
int i;
if ( (rotation != true) && (displayCount == 0 ) && (mode == NO_SHIFT || mode == SHIFT_IN_NO || mode == SHIFT_IN_NO_OUT || mode == SHIFT_IN_NO_ROT) ) {
for (i = 0; i < 3; i++) {
memcpy(&buffers[i], &outputPattern[i], sizeof(outputPattern[0]));
}
displayCount = i;
shifted = currentTime;
}
if ( (displayCount < dataLength) && (mode == SHIFT_IN_NO || mode == SHIFT_IN_YES || mode == SHIFT_IN_NO_OUT || mode == SHIFT_IN_YES_OUT || mode == SHIFT_IN_NO_ROT || mode == SHIFT_IN_YES_ROT) ) {
if (currentTime - shifted >= shiftInterval) {
memcpy(&buffers[0], &buffers[1], sizeof(outputPattern[0]));
memcpy(&buffers[1], &buffers[2], sizeof(outputPattern[0]));
memcpy(&buffers[2], outputPattern[displayCount], sizeof(outputPattern[0]));
displayCount++;
shifted = currentTime;
}
}
if ( (displayCount >= dataLength) && (displayCount < dataLength + 3) && (mode == SHIFT_IN_NO_OUT || mode == SHIFT_IN_YES_OUT) ) {
if (currentTime - shifted >= shiftInterval) {
memcpy(&buffers[0], &buffers[1], sizeof(outputPattern[0]));
memcpy(&buffers[1], &buffers[2], sizeof(outputPattern[0]));
memcpy(&buffers[2], symbols[0], sizeof(outputPattern[0]));
displayCount++;
shifted = currentTime;
}
}
if ( (displayCount >= dataLength) && (mode == SHIFT_IN_NO_ROT || mode == SHIFT_IN_YES_ROT) ) {
displayCount = 0;
rotation = true;
}
}
void dataToPattern() {
dataLength = strlen(outputData);
if (dataLength > 10) {
dataLength = 10;
}
int i, index;
for (int i = 0; i < dataLength; i++) {
if (outputData[i] >= '0' && outputData[i] <= '9') {
index = outputData[i] - '0';
memcpy(&outputPattern[i], &digits[index], sizeof(digits[0]));
} else if (outputData[i] >= 'A' && outputData[i] <= 'Z') {
index = outputData[i] - 'A';
memcpy(&outputPattern[i], &chars[index], sizeof(digits[0]));
} else if (outputData[i] >= 'a' && outputData[i] <= 'z') {
index = outputData[i] - 'a' + 26;
memcpy(&outputPattern[i], &chars[index], sizeof(digits[0]));
} else {
memcpy(&outputPattern[i], &symbols[0], sizeof(digits[0]));
}
}
}
void buffersOut() {
if (currentTime - refreshed >= refreshInterval ) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 8; j++) {
lc.setRow(i, j, buffers[i][j]);
}
}
refreshed = currentTime;
}
}
void ledSetup() {
lc.shutdown(0, false);
lc.shutdown(1, false);
lc.shutdown(2, false);
lc.setIntensity(0,2);
lc.setIntensity(1,2);
lc.setIntensity(2,2);
lc.clearDisplay(0);
lc.clearDisplay(1);
lc.clearDisplay(2);
}
여기 까지의 전체 소스입니다. 결과는 아래 동영상으로 확인하실 수 있습니다. SHIFT_IN_NO_ROT 모드로 호출했을 때, SHIFT_IN_YES_ROT 모드로 호출할 때의 결과가 차례대로 나옵니다.