#include "SPI.h"//测试用,写的很屎
const int CSPIN = 3;
const int InterruptPin = 2;
int DataPending[2][16];
int DISPSTATUS = 0x00;
const int IMAGE[2][8][16] PROGMEM = {
{ { B00000000, B00000000, B00000110, B00110000, B00000000, B00000000, B00000000, B10000000, B00000000, B00000000, B00000001, B00000000, B00000000, B00000000, B00001100, B01100000 },
{ B00000000, B00000000, B00001111, B01111000, B00000000, B00000000, B00000000, B11000000, B00000000, B00000000, B00000011, B00000000, B00000000, B00000000, B00011110, B11110000 },
{ B00000000, B00000000, B00001111, B11111000, B00000000, B00000000, B00000000, B01100000, B00000000, B00000000, B00000110, B00000000, B00000000, B00000000, B00011111, B11110000 },
{ B00000000, B00000000, B00001111, B11111000, B00000000, B00000000, B00000000, B00110000, B00000001, B10000000, B00001100, B00000000, B00000000, B00000000, B00011111, B11110000 },
{ B00000000, B00000000, B00000111, B11110000, B00000000, B00000000, B00000000, B00011100, B00000011, B11000000, B00111000, B00000000, B00000000, B00000000, B00001111, B11100000 },
{ B00000000, B00000000, B00000111, B11110000, B00000000, B00000000, B00000000, B00000111, B10000111, B11100001, B11100000, B00000000, B00000000, B00000000, B00001111, B11100000 },
{ B00000000, B00000000, B00000011, B11100000, B00000000, B00000000, B00000000, B00000001, B11111110, B01111111, B10000000, B00000000, B00000000, B00000000, B00000111, B11000000 },
{ B00000000, B00000000, B00000001, B11000000, B00000000, B00000000, B00000000, B00000000, B00111000, B00011100, B00000000, B00000000, B00000000, B00000000, B00000011, B10000000 } },
{ { B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000 },
{ B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000 },
{ B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000 },
{ B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000 },
{ B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000 },
{ B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000 },
{ B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000 },
{ B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000 } }
};
int IMAGEBUFFER[8][16];
int EMOCNT = 2 - 1;
void setup() {
// put your setup code here, to run once:
pinMode(CSPIN, OUTPUT);
pinMode(InterruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(InterruptPin), SWITCHEMO, RISING);
SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
for (int INIi = 1; INIi >= 0; INIi--) {
for (int INIj = 15; INIj >= 0; INIj--) {
DataPending[INIi][INIj] = 0x00;
}
}
SetIntensity(0x08);
SetDECODE();
}
void loop() {
// put your main code here, to run repeatedly:
switch (DISPSTATUS) {
case 0x00:
DISPEMOX(0);
delay(100);
break;
case 0x01:
DISPEMOX(1);
delay(100);
break;
}
}
void SendDATA() {
digitalWrite(CSPIN, LOW);
for (int SDi = 15; SDi >=0; SDi--) {
SPI.transfer(DataPending[0][SDi]); //transfer Reg
SPI.transfer(DataPending[1][SDi]); //transfer DATA
}
digitalWrite(CSPIN, HIGH);
}
void SetIntensity(int Intens[]) { //set Intensity
for (int Row = 8; Row >= 1; Row--) {
for (int CNTR1 = 15; CNTR1 >= 0; CNTR1--) {
DataPending[0][CNTR1] = Row; //set test as no
DataPending[1][CNTR1] = 0x00;
}
SendDATA();
delay(200);
}
for (int CNTR1 = 15; CNTR1 >= 0; CNTR1--) {
DataPending[0][CNTR1] = 0x0a; //set all buffer as intensity data
DataPending[1][CNTR1] = Intens;
}
SendDATA();
}
void SetDECODE() { //set Decodemode as no decode
for (int CNTR1 = 15; CNTR1 >= 0; CNTR1--) {
DataPending[0][CNTR1] = 0x09; //set all buffer as intensity data
DataPending[1][CNTR1] = 0x00;
}
SendDATA();
for (int CNTR1 = 15; CNTR1 >= 0; CNTR1--) {
DataPending[0][CNTR1] = 0x0B; //set scan 0~7
DataPending[1][CNTR1] = 0x07;
}
SendDATA();
for (int CNTR1 = 15; CNTR1 >= 0; CNTR1--) {
DataPending[0][CNTR1] = 0x0C; //set shutdown as no
DataPending[1][CNTR1] = 0x01;
}
SendDATA();
for (int CNTR1 = 15; CNTR1 >= 0; CNTR1--) {
DataPending[0][CNTR1] = 0x0F; //set test as no
DataPending[1][CNTR1] = 0x00;
}
SendDATA();
for (int Row = 8; Row >= 1; Row--) {
for (int CNTR1 = 15; CNTR1 >= 0; CNTR1--) {
DataPending[0][CNTR1] = Row; //set test as no
DataPending[1][CNTR1] = 0xFF;
}
SendDATA();
delay(100);
for (int CNTR1 = 15; CNTR1 >= 0; CNTR1--) {
DataPending[0][CNTR1] = Row; //set test as no
DataPending[1][CNTR1] = 0x00;
}
SendDATA();
}
}
void SWITCHEMO() {
if (DISPSTATUS == EMOCNT) {
DISPSTATUS = 0;
} else {
DISPSTATUS = DISPSTATUS + 1;
}
}
void DISPEMOX(int XX) {
for (int CNTR2 = 7; CNTR2 >= 0; CNTR2--) {
for (int CNTR3 = 15; CNTR3 >= 0; CNTR3--) {
IMAGEBUFFER[CNTR2][CNTR3]=pgm_read_byte(&IMAGE[XX][CNTR2][CNTR3]);
}
}
for (int CNTR2 = 7; CNTR2 >= 0; CNTR2--) {
for (int CNTR3 = 15; CNTR3 >= 0; CNTR3--) {
DataPending[0][CNTR3] = CNTR2+1; //set all buffer as Line CNTR
DataPending[1][CNTR3] = 0x00; //set all buffer as Line CNTR
}
SendDATA();
delay(100);
for (int CNTR3 = 15; CNTR3 >= 0; CNTR3--) {
DataPending[0][CNTR3] = CNTR2+1; //set all buffer as Line CNTR
DataPending[1][CNTR3] = IMAGEBUFFER[CNTR2][CNTR3]; //set all buffer as Line CNTR
}
SendDATA();
}
}