597 lines
15 KiB
Plaintext
597 lines
15 KiB
Plaintext
|
|
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);
|
|
}
|
|
}
|
|
|