#include <SPI.h>
#define CS 22
#define ENABLE LOW
#define DISABLE HIGH
byte cara1[]={0x0, 0x78, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0xcc}; 
byte pacman[]={0x38, 0x7c, 0xfe, 0xf0, 0xf0, 0xfe, 0x7c, 0x38};
byte pacman1[]={0x78, 0xfc, 0xfe, 0x3e, 0x3e, 0xfe, 0xfc, 0x78};
byte pacman2[]={0xf0, 0xf8, 0xfc, 0x7c, 0x7c, 0xfc, 0xf8, 0xf0};
byte pacman3[]={0xe0, 0xf0, 0xf8, 0xf8, 0xf8, 0xf8, 0xf0, 0xe0};
byte pacman4[]={0xc0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xe0, 0xc0};
byte pacman5[]={0x80, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0x80};
byte fantasma[]={0x3c, 0x7e, 0xd7, 0xff, 0xc3, 0xff, 0xff, 0xdb};
 int desplazamiento = 0;
byte conf[]= {0x00,0x07,0x07,0x01};
SPISettings MySettings(200000, MSBFIRST, SPI_MODE0);
void setup(){
  pinMode(CS, OUTPUT);
  digitalWrite(CS,DISABLE);
  SPI.begin();
  SPI.beginTransaction(MySettings);
  //conf del max
  for(byte i=0x09; i<= 0x0c; i++){
   funcSPI(i,conf[i-9]);
     }
    //prueba displays
    funcSPI (0x0f,0x00);
    delay(1000);
    funcSPI(0x0f,0x00);
    
}
void shiftRight() {
  byte temp = fantasma[7];
  for (int i = 7; i > 0; i--) {
    fantasma[i] = fantasma[i - 1];
  }
  fantasma[0] = temp;
}
void funcSPI(byte dir, byte dat){
      digitalWrite(CS,ENABLE);
      SPI.transfer(dir);
      SPI.transfer(dat);
      digitalWrite(CS,DISABLE);
     
    }
 void shiftLeft() {
  byte temp = pacman[0];
  for (int i = 0; i < 7; i++) {
    pacman[i] = pacman[i + 1];
  }
  pacman[7] = temp;
}
   void encenderTodasLasLuces() {
  for (int columna = 1; columna <= 8; columna++) {
    funcSPI(columna, 0xFF);  // 0xFF representa todas las luces encendidas (valor hexadecimal)
  }
}
  void loop() {
  
  // Desplazar la imagen hacia la derecha
  for (int i = 0; i < 8; i++) {
    // Limpia la primera columna
    funcSPI(i, 0);
  }

  // Mostrar la imagen en la nueva posición (inicia con el fantasma)
  for (int i = 0; i < 8; i++) {
    funcSPI(i+1, fantasma[(i ) ]);
  }

  delay(1000);  // Espera un segundo antes de cambiar a Pac-Man

  // Limpia la matriz para mostrar a Pac-Man
  for (int i = 0; i < 8; i++) {
    funcSPI(i, 0);
  }

  // Mostrar a Pac-Man en la nueva posición
  for (int i = 0; i < 8; i++) {
    funcSPI(i+1, pacman[(i) ]);
  }

  delay(1000);  // Espera un segundo antes de la próxima iteración
  
  for (int i = 0; i < 8; i++) {
    funcSPI(i+1, pacman1[(i ) ]);
  }
  delay(1000);
   for (int i = 0; i < 8; i++) {
    funcSPI(i+1, pacman2[(i ) ]);
  }
  delay(1000);
   for (int i = 0; i < 8; i++) {
    funcSPI(i+1, pacman3[(i ) ]);
  }
  delay(1000);
   for (int i = 0; i < 8; i++) {
    funcSPI(i+1, pacman4[(i ) ]);
  }
  delay(1000);
   for (int i = 0; i < 8; i++) {
    funcSPI(i+1, pacman5[(i ) ]);
  }
  delay(1000);
 
  //shiftLeft();
 // Actualizar la pantalla con los nuevos datos
  for (int i = 0; i < 8; i++) {
    funcSPI(i + 1, pacman[i]);
  }
   delay(1000);  
}

 

void shiftUp() {
  for (int i = 0; i < 7; i++) {
    fantasma[i] = fantasma[i + 1];
  }
  // Define el nuevo valor para la fila inferior del fantasma (puedes usar cualquier valor deseado)
  fantasma[7] = 0x00; // En este caso, la fila inferior se apaga
}