#include "WProgram.h" void putByte(byte data); void maxSingle( byte reg, byte col); void maxAll (byte reg, byte col); void maxOne(byte maxNr, byte reg, byte col); void consumo_max(); void test(); void extra_time(); void jugador1(); void jugador2(); void especial_mode(); void setup (); void loop (); void off(void); int dataIn = 2; int load = 3; int clock = 4; int pul1 = 3; int pul2 = 2; int maxInUse = 1; //change this variable to set how many MAX7219's you'll use int e = 0; // just a variable int j = 0; int i = 0; int i1 = 0; int i2 = 0; int i3 = 0; int count=0; int pinArray[] = { 0x01, 0x02, 0x03, 0x04}; int val = 0; int jug1 = 0; int jug2 = 0; int jug1a = 0; int jug2a = 0; int jug1b = 0; int jug2b = 0; int jug1ab = 0; int jug2ab = 0; int p1 = 0; int p2 = 0; int p1a = 0; int p2a = 0; int mem1 = 0; int mem2 = 0; int mem3 = 0; int extra = 0; int especial_timer=0; int especial=0; int contador=0; // define max7219 registers byte max7219_reg_noop = 0x00; byte max7219_reg_digit0 = 0x01; byte max7219_reg_digit1 = 0x02; byte max7219_reg_digit2 = 0x03; byte max7219_reg_digit3 = 0x04; byte max7219_reg_digit4 = 0x05; byte max7219_reg_digit5 = 0x06; byte max7219_reg_digit6 = 0x08; byte max7219_reg_digit7 = 0x01; byte max7219_reg_decodeMode = 0x09; byte max7219_reg_intensity = 0x0a; byte max7219_reg_scanLimit = 0x0b; byte max7219_reg_shutdown = 0x0c; byte max7219_reg_displayTest = 0x0f; int valor[] = { 0xED,0x05,0x7C,0x5D,0x95,0xD9,0xF9,0x0D,0xFD,0xDD,0xEF}; int valor1[] = { 0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B}; void putByte(byte data) { byte i = 8; byte mask; while(i > 0) { mask = 0x01 << (i - 1); // get bitmask digitalWrite( clock, LOW); // tick if (data & mask){ // choose bit digitalWrite(dataIn, HIGH);// send 1 } else{ digitalWrite(dataIn, LOW); // send 0 } digitalWrite(clock, HIGH); // tock --i; // move to lesser bit } } void maxSingle( byte reg, byte col) { //maxSingle is the "easy" function to use for a //single max7219 digitalWrite(load, LOW); // begin putByte(reg); // specify register putByte(col); //((data & 0x01) * 256) + data >> 1); // put data digitalWrite(load, LOW); // and load da shit digitalWrite(load,HIGH); } void maxAll (byte reg, byte col) { // initialize all MAX7219's in the system int c = 0; digitalWrite(load, LOW); // begin for ( c =1; c<= maxInUse; c++) { putByte(reg); // specify register putByte(col); //((data & 0x01) * 256) + data >> 1); // put data } digitalWrite(load, LOW); digitalWrite(load,HIGH); } void maxOne(byte maxNr, byte reg, byte col) { //maxOne is for adressing different MAX7219's, whilele having a couple of them cascaded int c = 0; digitalWrite(load, LOW); // begin for ( c = maxInUse; c > maxNr; c--) { putByte(0); // means no operation putByte(0); // means no operation } putByte(reg); // specify register putByte(col); //((data & 0x01) * 256) + data >> 1); // put data for ( c =maxNr-1; c >= 1; c--) { putByte(0); // means no operation putByte(0); // means no operation } digitalWrite(load, LOW); // and load da shit digitalWrite(load,HIGH); } void consumo_max() { maxSingle(2,0xFF); maxSingle(3,0xFF); maxSingle(1,0xFF); maxSingle(4,0xFF); maxSingle(8,0xFF); maxSingle(5,0xFF); maxSingle(7,0xFF); maxSingle(6,0xFF); } void test() { delay(1000); i=i+1; if (i>=10) { i1=i1+1; if (i1>=10) i1=0; maxSingle(2,valor[i1]); maxSingle(3,valor[i1]); maxSingle(1,valor1[i1]); maxSingle(4,valor1[i1]); i=0; } maxSingle(8,valor[i]); maxSingle(5,valor[i]); maxSingle(7,valor1[i]); maxSingle(6,valor1[i]); } void extra_time() { // MODO TIE BREAK if ((p1>p2+1)&&(p1>7)) // final gana jugador1 { extra = 0; jug1=0; jug2=0; i=0; i1=0; jug1a=0; jug2a=0; p1=0; p2=0; i2=i2+1; maxSingle(4,valor1[i]); maxSingle(1,valor1[i1]); maxSingle(5,valor[jug1]); maxSingle(3,valor[jug1a]); maxSingle(8,valor[jug2]); maxSingle(2,valor[jug2a]); maxSingle(6,valor1[i2]); } if ((p2>p1+1)&&(p2>7)) // final gana jugador2 { extra = 0; jug1=0; jug2=0; i=0; i1=0; jug1a=0; jug2a=0; p1=0; p2=0; i3=i3+1; maxSingle(4,valor1[i]); maxSingle(1,valor1[i1]); maxSingle(5,valor[jug1]); maxSingle(3,valor[jug1a]); maxSingle(8,valor[jug2]); maxSingle(2,valor[jug2a]); maxSingle(7,valor1[i3]); } if ((i==6)&&(i1==6)&&(especial==0)) // habilitacion del tie break { extra = 1; if ((analogRead(pul1)<128)&&(mem1==0)) { mem1 = 1; jug1=jug1+1; if (jug1>=10) { jug1=0; jug1a=jug1a+1; if (jug1a>=10) jug1a=0; } p1=p1+1; maxSingle(3,valor[jug1a]); maxSingle(5,valor[jug1]); } if ((analogRead(pul2)<128)&&(mem2==0)) { mem2 = 1; jug2=jug2+1; if (jug2>=10) { jug2=0; jug2a=jug2a+1; if (jug2a>=10) jug2a=0; } p2=p2+1; maxSingle(2,valor[jug2a]); maxSingle(8,valor[jug2]); } } } void jugador1() { if ((analogRead(pul1)<128)&&(mem1==0)&&(extra==0)&&(especial==0)) // modo normal jugador1 { mem1 = 1; if (jug1==0) { jug1=15; maxSingle(3,valor[1]); maxSingle(5,valor[5]); } else if (jug1==15) { jug1=30; maxSingle(3,valor[3]); maxSingle(5,valor[0]); } else if (jug1==30) { jug1=40; maxSingle(3,valor[4]); maxSingle(5,valor[0]); } else if (jug1==40) { if (jug2==40) { jug1=41; maxSingle(3,valor[4]); maxSingle(5,valor[10]); } else if (jug2==41) { jug1=40; jug2=40; maxSingle(3,valor[4]); maxSingle(5,valor[0]); maxSingle(2,valor[4]); maxSingle(8,valor[0]); } else { jug1=0; jug2=0; if (i==9) i=0; else i=i+1; maxSingle(3,valor[0]); maxSingle(5,valor[0]); if (((i==6)&&(i1<4))||(i==7)) { i1=0; i=0; i2=i2+1; maxSingle(4,valor1[0]); maxSingle(1,valor1[0]); if (i2==10) { i2=0; maxSingle(6,valor1[i2]); } else maxSingle(6,valor1[i2]); } else maxSingle(4,valor1[i]); maxSingle(2,valor[0]); maxSingle(8,valor[0]); } } else if (jug1==41) { jug1=0; jug2=0; if (i==9) i=0; else i=i+1; maxSingle(3,valor[0]); maxSingle(5,valor[0]); if (((i==6)&&(i1<4))||(i==7)) { i1=0; i=0; i2=i2+1; maxSingle(4,valor1[0]); maxSingle(1,valor1[0]); if (i2==10) { i2=0; maxSingle(6,valor1[i2]); } else maxSingle(6,valor1[i2]); } else maxSingle(4,valor1[i]); maxSingle(2,valor[0]); maxSingle(8,valor[0]); } } else if (analogRead(pul1)>1020) { delay(10); mem1 = 0; } } void jugador2() { if ((analogRead(pul2)<128)&&(mem2==0)&&(extra==0)&&(especial==0)) // modo normal jugador2 { mem2 = 1; if (jug2==0) { jug2=15; maxSingle(2,valor[1]); maxSingle(8,valor[5]); } else if (jug2==15) { jug2=30; maxSingle(2,valor[3]); maxSingle(8,valor[0]); } else if (jug2==30) { jug2=40; maxSingle(2,valor[4]); maxSingle(8,valor[0]); } else if (jug2==40) { if (jug1==40) { jug2=41; maxSingle(2,valor[4]); maxSingle(8,valor[10]); } else if (jug1==41) { jug1=40; jug2=40; maxSingle(3,valor[4]); maxSingle(5,valor[0]); maxSingle(2,valor[4]); maxSingle(8,valor[0]); } else { jug2=0; jug1=0; if (i1==9) i1=0; else i1=i1+1; maxSingle(2,valor[0]); maxSingle(8,valor[0]); if (((i1==6)&&(i<4))||(i1==7)) { i1=0; i=0; i3=i3+1; maxSingle(1,valor1[0]); maxSingle(4,valor1[0]); if (i3==10) { i3=0; maxSingle(7,valor1[i3]); } else maxSingle(7,valor1[i3]); } else maxSingle(1,valor1[i1]); maxSingle(3,valor[0]); maxSingle(5,valor[0]); } } else if (jug2==41) { jug2=0; jug1=0; if (i1==9) i1=0; else i1=i1+1; maxSingle(3,valor[0]); maxSingle(5,valor[0]); if (((i1==6)&&(i<4))||(i1==7)) { i1=0; i=0; i3=i3+1; maxSingle(1,valor1[0]); maxSingle(4,valor1[0]); if (i3==10) { i3=0; maxSingle(7,valor1[i3]); } else maxSingle(7,valor1[i3]); } else maxSingle(1,valor1[i1]); maxSingle(2,valor[0]); maxSingle(8,valor[0]); } } else if (analogRead(pul2)>1020) { delay(10); mem2 = 0; } } void especial_mode() { // si pulsas los dos se inicia el contador if ((analogRead(pul2)<128)&&(analogRead(pul1)<128)&&(mem3==0)) { mem3=1; especial_timer = millis(); //Serial.println(especial_timer); } else if ((analogRead(pul2)<128)&&(analogRead(pul1)<128)&&(mem3==1)) { contador = millis() - especial_timer; Serial.println(contador); } else if ((((analogRead(pul2)>1020)||(analogRead(pul1)>1020)))&&(mem3==1)) mem3=0; // si contador excede de dos segundos se activa el modo if(contador > 2000) { maxSingle(2,valor[0]); maxSingle(8,valor[0]); maxSingle(1,valor1[0]); maxSingle(7,valor1[0]); maxSingle(4,valor1[0]); maxSingle(6,valor1[0]); maxSingle(3,valor[0]); maxSingle(5,valor[0]); //if (especial==0) especial=1; //else especial=0; if (especial==0) especial=1; else especial=0; especial_timer = 0; jug1 = 0; jug2 = 0; jug1a = 0; jug2a = 0; jug1b = 0; jug2b = 0; jug1ab = 0; jug2ab = 0; p1 = 0; p2 = 0; p1a = 0; p2a = 0; extra=0; contador=0; i=i1=i2=i3=0; } if ((p1a>p2a+1)&&(p1a>11)) // final gana jugador1 { jug1b=0; jug2b=0; jug1ab=0; jug2ab=0; p1a=0; p2a=0; i2=i2+1; if (i2==2) { i2=0; i3=0; i=i+1; if (i==10) i=0; } maxSingle(4,valor1[i2]); maxSingle(1,valor1[i3]); maxSingle(5,valor[jug1b]); maxSingle(3,valor[jug1ab]); maxSingle(8,valor[jug2b]); maxSingle(2,valor[jug2ab]); maxSingle(6,valor1[i]); } if ((p2a>p1a+1)&&(p2a>11)) // final gana jugador2 { jug1b=0; jug2b=0; jug1ab=0; jug2ab=0; p1a=0; p2a=0; i3=i3+1; if (i3==2) { i2=0; i3=0; i1=i1+1; if (i1==10) i1=0; } maxSingle(4,valor1[i2]); maxSingle(1,valor1[i3]); maxSingle(5,valor[jug1b]); maxSingle(3,valor[jug1ab]); maxSingle(8,valor[jug2b]); maxSingle(2,valor[jug2ab]); maxSingle(7,valor1[i1]); } if (especial==1) { extra = 1; if ((analogRead(pul1)<128)&&(mem1==0)) { mem1 = 1; jug1b=jug1b+1; if (jug1b>=10) { jug1b=0; jug1ab=jug1ab+1; if (jug1ab>=10) jug1ab=0; } p1a=p1a+1; maxSingle(3,valor[jug1ab]); maxSingle(5,valor[jug1b]); } if ((analogRead(pul2)<128)&&(mem2==0)) { mem2 = 1; jug2b=jug2b+1; if (jug2b>=10) { jug2b=0; jug2ab=jug2ab+1; if (jug2ab>=10) jug2ab=0; } p2a=p2a+1; maxSingle(2,valor[jug2ab]); maxSingle(8,valor[jug2b]); } } } void setup () { pinMode(dataIn, OUTPUT); pinMode(clock, OUTPUT); pinMode(load, OUTPUT); beginSerial(9600); digitalWrite(13, HIGH); //////////////////////////////////////////////initiation of the max 7219 maxAll(max7219_reg_scanLimit, 0x07); maxAll(max7219_reg_decodeMode, 0x00); // using an led matrix (not digits) maxAll(max7219_reg_shutdown, 0x01); // not in shutdown mode maxAll(max7219_reg_displayTest, 0x00); // no display test for (e=1; e<=8; e++) { // empty registers, turn all LEDs off maxAll(e,0); } maxAll(max7219_reg_intensity, 0x0f & 0x0f); // the first 0x0f is the value you can set // range: 0x00 to 0x0f maxSingle(2,valor[0]); maxSingle(8,valor[0]); maxSingle(1,valor1[0]); maxSingle(7,valor1[0]); maxSingle(4,valor1[0]); maxSingle(6,valor1[0]); maxSingle(3,valor[0]); maxSingle(5,valor[0]); } void loop () { //test(); //consumo_max(); especial_mode(); extra_time(); jugador1(); jugador2(); //Serial.println(millis()); } void off(void){ for (count=0;count<4;count++) { digitalWrite(pinArray[count], HIGH); } } int main(void) { init(); setup(); for (;;) loop(); return 0; }