#define SET(reg, b, v) v ? reg|= _BV(b) : reg &= ~_BV(b)
uint8_t clk2=2;
uint8_t cs=0;
uint8_t din=4;
uint8_t clock=5;
uint8_t dt=6;
uint8_t sw=3;
volatile uint8_t j=5;
volatile uint8_t g=5;
volatile boolean k = false;
unsigned long timer = 0;
unsigned long t0 = 0;
boolean sxdxyn = true;
boolean onoff = true;
uint8_t a=5;
uint8_t b=4;
uint8_t c=3;
void write(uint8_t matrice, byte riga, byte data){
PORTD &= ~_BV(0);
uint8_t i = 1;
writeByte(riga); //seleziona matrice in cui vanno accesi
writeByte(data);
while(i<matrice) {
writeByte(0x00);
writeByte(0x00);
i++;
}
PORTD |= _BV(0);
}
void writeByte(byte data) {
byte v;
for(byte i=0;i<8;i++)
{
PORTD &= ~_BV(5);
// digitalWrite(din,data&0x80);
v=data&0x80;
v==0 ? PORTD &= ~_BV(4) : PORTD |= _BV(4);
data = data<<1;
PORTD |= _BV(5);
}
}
//per spostare la barretta di selezione
void sxdx () {
if(sxdxyn) {
if(digitalRead(dt) == HIGH && j<5) {
//if((PIND &= ~_BV(6))== HIGH && j<5) {
write(j, 0x8, 0x00);
j++;
write(j, 0x8, 0xff); //sposta a sx
}
//else if ((PIND &= ~_BV(6))==LOW && j>3) {
else if (digitalRead(dt)==LOW && j>3) {
write(j, 0x8, 0x00);
j--;
write(j, 0x8, 0xff); //sposta a dx
}
}
}
void controlloVittoria() {
if(j == b) {
spegni(b);
write(0xb, 0x02, 0b00111100);
write(0xb, 0x03, 0b00100100);
write(0xb, 0x04, 0b00100100); //0 nella matrice selezionata
write(0xb, 0x05, 0b00100100);
write(0xb, 0x06, 0b00111100);
delay(2000);
spegni(a);
spegni(b);
spegni(c);
write(0x5, 0x02, 0b01110101);
write(0x5, 0x03, 0b01010101);
write(0x5, 0x04, 0b01010010);
write(0x5, 0x05, 0b01010010);
write(0x5, 0x06, 0b01110010);
write(0x4, 0x02, 0b00100101);
write(0x4, 0x03, 0b00100101);
write(0x4, 0x04, 0b00100101); // you win
write(0x4, 0x05, 0b10100101);
write(0x4, 0x06, 0b01000111);
write(0x3, 0x02, 0b00101010);
write(0x3, 0x03, 0b00101010);
write(0x3, 0x04, 0b01101010);
write(0x3, 0x05, 0b10101010);
write(0x3, 0x06, 0b00101001);
write(0x2, 0x02, 0b00000001);
write(0x2, 0x03, 0b00000001);
write(0x2, 0x04, 0b00000001);
write(0x2, 0x05, 0b00000001);
write(0x2, 0x06, 0b00000001);
} else {
spegni(b);
write(0xb, 0x02, 0b01000100);
write(0xb, 0x03, 0b00101000);
write(0xb, 0x04, 0b00010000);
write(0xb, 0x05, 0b00101000);
write(0xb, 0x06, 0b01000100);
delay(2000);
spegni(a);
spegni(b);
spegni(c);
write(0x5, 0x02, 0b01110101);
write(0x5, 0x03, 0b01010101);
write(0x5, 0x04, 0b01010010);
write(0x5, 0x05, 0b01010010);
write(0x5, 0x06, 0b01110010);
write(0x4, 0x02, 0b00100101);
write(0x4, 0x03, 0b00100101);
write(0x4, 0x04, 0b00100101); // you lose
write(0x4, 0x05, 0b00100101);
write(0x4, 0x06, 0b01100111);
write(0x3, 0x02, 0b01110111);
write(0x3, 0x03, 0b00010101);
write(0x3, 0x04, 0b01110101);
write(0x3, 0x05, 0b01000101);
write(0x3, 0x06, 0b01110111);
write(0x2, 0x02, 0b00000111);
write(0x2, 0x03, 0b00000001);
write(0x2, 0x04, 0b00000111);
write(0x2, 0x05, 0b00000001);
write(0x2, 0x06, 0b00000111);
}
}
void yesno () {
if(sxdxyn!=true) {
if (digitalRead(dt) == HIGH && g == 3) {
write(g, 0x8, 0x00);
g = 5;
write(g, 0x8, 0xff);
} else if (digitalRead(dt) == LOW && g == 5) {
write(g, 0x8, 0x00);
g = 3;
write(g, 0x8, 0xff);
}
}
}
void btn () {
k = true;
}
void spegni(byte matrice) {
for(byte i=1;i<9;i++) {
write(matrice,i,0x00);
}
}
void mescolaCarte() {
for (int i = 0; i<15; i++) {
//timer viene assegnato un valore
//casuale dettato dal tempo
if (i%3==1) {
spegni(a);
a=(timer%10)+1;
if (!(a==b||a==c||a==a)) {accendiCarta(a);}
}
if (i%3==2) {
spegni(b);
b=(timer%10)+1;
if (!(a==b||b==c||b==b)) accendiCarta(b);
}
if (i%3==0) {
spegni(c);
c=(timer%10)+1;
if (!(c==b||a==c||c==c)) accendiCarta(c);
}
t0=timer;
}
}
void accendiCarta(uint8_t matrice) {
for(uint8_t f=2; f<=7; f++) {
write(matrice, f, 0b01111110);
}
}
uint8_t ordinaCarta() {
uint8_t i = 0;
//timer viene assegnato un valore
//casuale dettato dal tempo
while(i < 3) {
if(i == 0) {
a = (timer%3)+1;//restituisce 1 2 o 3 perchè dalla randomizzazione
//si riaccendono nella posizione predefinita in modo randomico
i++;
accendiCarta(a*13);
} else if (i == 1) {
b = (timer%3)+1;
if(b!=(a/13)) {
i++;
accendiCarta(b*13);
}
} else {
c = (timer%3)+1;
if((c!=(a/13))&&(c!=(b/13)) {
i++;
accendiCarta(c+13);
}
}
}return b;
}
void giocaAncora() {
while(k != true) {};
if(j == 5) {
onoff = true;
} else onoff = false;
}
void setup() {
DDRD |= _BV(5);
DDRD |= _BV(4);
DDRD |= _BV(0);
DDRD |= !_BV(2); //pinmode(2,input);
DDRD |= !_BV(6);
// pinMode(sw, INPUT_PULLUP);
DDRD |= !_BV(3);
PIND |= !_BV(3);
PORTD &= ~_BV(0); //digitalwrite(0,High)
PORTD &= ~_BV(5);
PORTD &= ~_BV(4);
SET(TCCR1B,CS12,1);
SET(TCCR1B,CS11,0);
SET(TCCR1B,CS10,1);
attachInterrupt(digitalPinToInterrupt(2),sxdx,FALLING);
attachInterrupt(digitalPinToInterrupt(2),yesno,FALLING);
attachInterrupt(digitalPinToInterrupt(3),btn,FALLING);
write(0x00,0x09, 0x00); //decode (always no decode)
write(0x00,0x0a, 0x03); //Brightness (0..15)
write(0x00,0x0b, 0x07); //Display digits (always 7, digit = column)
write(0x00,0x0c, 0x00); //Shutdown (0x01 Normal | 0x00 Shutdown)
write(0x00,0x0f, 0x00); //Display test (0x01 Test | 0x00 Normal)
}
void loop() {
while(onoff == true) {
write(0x6, 0x02, 0b01110111);
write(0x6, 0x03, 0b01010101);
write(0x6, 0x04, 0b00110111);
write(0x6, 0x05, 0b01010001);
write(0x6, 0x06, 0b01010001);
write(0x5, 0x02, 0b01110111);
write(0x5, 0x03, 0b00010001);
write(0x5, 0x04, 0b01110011);
write(0x5, 0x05, 0b01000001);
write(0x5, 0x06, 0b01110111);
write(0x4, 0x02, 0b11100111); // press start
write(0x4, 0x03, 0b00100001);
write(0x4, 0x04, 0b11100111);
write(0x4, 0x05, 0b10000100);
write(0x4, 0x06, 0b11100111);
write(0x3, 0x02, 0b11101110);
write(0x3, 0x03, 0b10100100);
write(0x3, 0x04, 0b11100100);
write(0x3, 0x05, 0b10100100);
write(0x3, 0x06, 0b10100100);
write(0x2, 0x02, 0b11101110);
write(0x2, 0x03, 0b01001010);
write(0x2, 0x04, 0b01000110);
write(0x2, 0x05, 0b01001010);
write(0x2, 0x06, 0b01001010);
while (k == true) {
for(int i = 2; i <= 6; i++) {
spegni(i);
}
write(0x5, 0x02, 0b01011100);
write(0x5, 0x03, 0b01000100);
write(0x5, 0x04, 0b01001100);
write(0x5, 0x05, 0b01000100);
write(0x5, 0x06, 0b01000100);
write(0x4, 0x02, 0b01101001);
write(0x4, 0x03, 0b10101001); // find 0
write(0x4, 0x04, 0b10101011);
write(0x4, 0x05, 0b10101101);
write(0x4, 0x06, 0b01101001);
write(0x3, 0x02, 0b00011100);
write(0x3, 0x03, 0b00010100);
write(0x3, 0x04, 0b00010100);
write(0x3, 0x05, 0b00010100);
write(0x3, 0x06, 0b00011100);
delay(3000);
for(int i = 3; i <= 5; i++) {
spegni(i);
}
write(0x5, 0x02, 0b01000100);
write(0x5, 0x03, 0b00101000);
write(0x5, 0x04, 0b00010000);
write(0x5, 0x05, 0b00101000);
write(0x5, 0x06, 0b01000100);
write(0x4, 0x02, 0b00111100);
write(0x4, 0x03, 0b00100100); // X 0 X
write(0x4, 0x04, 0b00100100);
write(0x4, 0x05, 0b00100100);
write(0x4, 0x06, 0b00111100);
write(0x3, 0x02, 0b00100010);
write(0x3, 0x03, 0b00010100);
write(0x3, 0x04, 0b00001000);
write(0x3, 0x05, 0b00010100);
write(0x3, 0x06, 0b00100010);
delay(3000);
for(int i = 3; i <= 5; i++) {
spegni(i);
}
write(0x5, 0x02, 0b01111110);
write(0x5, 0x03, 0b01111110);
write(0x5, 0x04, 0b01111110);
write(0x5, 0x05, 0b01111110);
write(0x5, 0x06, 0b01111110);
write(0x5, 0x07, 0b01111110);
write(0x4, 0x02, 0b00111100);
write(0x4, 0x03, 0b00111100);
write(0x4, 0x04, 0b00111100); // 3 quadrati rossi
write(0x4, 0x05, 0b00111100);
write(0x4, 0x06, 0b00111100);
write(0x3, 0x02, 0b00111110);
write(0x3, 0x03, 0b00111110);
write(0x3, 0x04, 0b00111110);
write(0x3, 0x05, 0b00111110);
write(0x3, 0x06, 0b00111110);
delay(2000);
j = 5;
mescolaCarte();
b = ordinaCarta();
k = false;
//viene usata la funzione sxdx epr spostare la barretta,
//viene modificato j
while(k == true) {
controlloVittoria();
}
j = 5;
delay(2000);
for(int i = 2; i <= 5; i++) {
spegni(i);
}
write(0x6, 0x02, 0b10111000);
write(0x6, 0x03, 0b10001000);
write(0x6, 0x04, 0b10001000);
write(0x6, 0x05, 0b10001000);
write(0x6, 0x06, 0b10111000);
write(0x5, 0x02, 0b01001011);
write(0x5, 0x03, 0b01001010);
write(0x5, 0x04, 0b01011010);
write(0x5, 0x05, 0b01101010);
write(0x5, 0x06, 0b01001011);
write(0x4, 0x02, 0b01010111); // continue
write(0x4, 0x03, 0b01010010);
write(0x4, 0x04, 0b11010010);
write(0x4, 0x05, 0b01010010);
write(0x4, 0x06, 0b01010010);
write(0x3, 0x02, 0b10101010);
write(0x3, 0x03, 0b10101010);
write(0x3, 0x04, 0b10101010);
write(0x3, 0x05, 0b10101011);
write(0x3, 0x06, 0b10111010);
write(0x2, 0x01, 0b00010000);
write(0x2, 0x02, 0b00101011);
write(0x2, 0x03, 0b00100000);
write(0x2, 0x04, 0b00010001);
write(0x2, 0x05, 0b00010000);
write(0x2, 0x06, 0b00000011);
write(0x2, 0x07, 0b00010000);
delay(2000);
for(int i = 2; i <= 6; i++) {
spegni(i);
}
sxdxyn = false;
k = false;
giocaAncora();
}
}