Yosef Guevara Salamanca
/
TETS_PC
bien spi no se queda pegado
tetris_pc.cpp
- Committer:
- djinn77
- Date:
- 2018-10-17
- Revision:
- 29:ba0b251a0ed1
- Parent:
- 28:3f3f8fee4d85
File content as of revision 29:ba0b251a0ed1:
#include "mbed.h" #include "piezas.h" //#define DEBUG 1 Serial pc(USBTX,USBRX); SPI deviceM(PB_15, PB_14, PB_13); //SE DEFINE EL LED QUE ACTIVARA EL DISPOSITIVO DigitalOut ssel (PB_12); DigitalIn pulsador_izq(A5); //pulsador conector izquierdo DigitalIn pulsador_der(A4); //pulsador conector derecho DigitalIn p_giro(A3); //pulsador conector giro //Declaracion de funciones void inicializar(); void pulsador_der(); uint16_t* girar(uint16_t* pieza, int posicion); int memoria[8]={0}; int *pointer=0; void debuging(char*s,...){ #if DEBUG pc.printf(s); #endif } // FUNCION EL CUAL ENVIA EL DATO JUNTO CON LA DIRECCION DE LA COLUMNA CORRESPONDIENTE AL PRIMER DISPOSITIVO void sendSPI(uint8_t d1, uint8_t d2) { deviceM.unlock(); ssel=0; // SELECCIONA EL PRIMER DISPOSOTIVO deviceM.write(d1); // ESCRIBE EL ADDRESS deviceM.write(d2); // ESCRIBE EL DATA ssel=1; deviceM.lock(); }; // Toma el vector reorganizado , lo imprime y lo almacena void captura_matriz(uint16_t* imprimir,int posicion,int auxi, char figura, char giro, int izq, int der){ int i=0; // inicia el contador i en 0 int enable=1; while(enable){ //se encarga de desplazar los bits dentro del vector //pc.printf("\n1- conteo del corriemiento:\n %d",i); int j=1; // inicia el contador j en 1 while(pulsador_izq ==1 & pulsador_der==0 & p_giro == 0 && posicion<izq){ //pc.printf("\n >>>>>>>>>>>>FERNEY PRUEBA1 giro %d, posicion %d, izq %d, der %d\n ",giro, posicion,izq,der); posicion++; for(int ci=7; ci >=0; ci--){ pc.printf("\n hacia la izq:\n "); //pc.printf("\n >>>>>>>>>>>>FERNEY PRUEBA1 IZQ giro %d, posicion %d\n ",giro, posicion); imprimir[ci]=imprimir[ci-1]; if(ci==0){ imprimir[ci]=0; } } for(int m=1;m<=8;m++){ sendSPI(m, memoria[m-1]|(imprimir[m-1]>>i-1)); } wait(1.0); } while(pulsador_der ==1 & pulsador_izq ==0 & p_giro == 0 && posicion>der){ //pc.printf("\n hacia la der:\n "); //pc.printf("\n >>>>>>>>>>>>FERNEY PRUEBA1 DER giro %d, posicion %d, izq %d, der %d\n ",giro, posicion,izq,der); posicion--; for(int k=0; k <8; k++){ imprimir[k]=imprimir[k+1]; if(k==7){ imprimir[k]=0; } } for(int n=1;n<=8;n++){ sendSPI(n, memoria[n-1]|(imprimir[n-1]>>i-1)); } wait(1.0); } if(p_giro == 1 & pulsador_der ==0 & pulsador_izq ==0){ giro++; //pc.printf("\n >>>>>>>>>>>>FERNEY PRUEBA GIRO giro %d, posicion %d, izq %d, der %d\n ",giro, posicion,izq,der); if(giro ==4){ giro=0; } switch(figura){ //Este switch escoje la figura con que trabajaar case 0: // L if(giro == 0) imprimir= girar(PZA_L, posicion); izq=6, der = 0; auxi=7; if(giro == 1) imprimir= girar(PZA_LDN, posicion); izq=5, der = 0; auxi=7; if(giro == 2) imprimir= girar(PZA_LDO, posicion); izq=5, der = -1; auxi=7; if(giro == 3) imprimir=girar(PZA_LDD, posicion); izq=5, der = 0; auxi=8; break; case 1://T if(giro == 0) imprimir= girar(PZA_T, posicion); izq=5, der = 0; auxi=9; if(giro == 1) imprimir= girar(PZA_TN, posicion); izq=6, der = 0; auxi=8; if(giro == 2) imprimir= girar(PZA_TO, posicion); izq=5, der = 0; auxi=8; if(giro == 3) imprimir= girar(PZA_TD, posicion); izq=5, der = -1; auxi=8; break; case 2://I if(giro == 0 || giro == 2) imprimir= girar(PZA_I, posicion); izq=6, der = -1; auxi=8; if(giro == 1 || giro == 3) imprimir=girar(PZA_IR, posicion); izq=5, der = 0; auxi=9; break; case 3://Cuadrado if(giro == 0 || giro == 1 || giro == 2 || giro == 3) imprimir= girar(PZA_C, posicion); izq=6, der = 0; auxi=9; break; case 4: //Z if(giro == 0 || giro == 2) imprimir= girar(PZA_Z, posicion); izq=5, der = 0; auxi=9; if(giro == 1 || giro == 3) imprimir= girar(PZA_ZN, posicion); izq=6, der = 0; auxi=8; break; } } while(j<=8){ //se encarga de seleccionar que posicion del vector imprimira sendSPI(j, memoria[j-1]|(imprimir[j-1]>>i)); //Imprime el resultado de aplicar OR a la memoria y al desplamamiento de imprimir //wait(0.1); // Activar este wait para pruebas de desplazamiento y captura de los datos if(i==auxi-1 || (memoria[j-1]&(imprimir[j-1]>>i+1))!=0){ //Detiene el desplazamiento cuando los bits tocan fondo, enable=0;// desabilitador del ciclo while for(int k=0; k<8;k++){ // Almacena todos lo datos del vector en la posicion que corrimiento en la memoria memoria[k]= memoria[k]|(imprimir[k]>>i); pointer= &memoria[k]; pc.printf("\n pointer %d \n", *pointer); if(*pointer==511){ NVIC_SystemReset(); } } } j++; } wait(1.0); // espera para tomar el otro valor de lectura i++; } } void desplazar(uint16_t* datos, int posicion, int auxi, char figura, char giro, int izq, int der){ // tomar la figura y la desplaza segun la posicion ingresada inicialmente uint16_t desplazamiento[8]={0}; // Inicia un vector auxiliar con solo Ceros int j= 0; for(int i=posicion; i<(posicion+3);i++){ // Inicia un vector auxiliar con solo Ceros desplazamiento[i]=datos[j]; // Alamcena los nuevos datos tomados en el vector j++; } captura_matriz(desplazamiento,posicion,auxi,figura,giro,izq,der); //Envia el Vector desplazado la funcion de captura de matriz } void read(int posicion, char figura, char giro){ switch(figura){ //Este switch escoje la figura con que trabajaar case 0: // L if(giro == 0) desplazar(PZA_L,posicion,8,figura,giro,6,0); if(giro == 1) desplazar(PZA_LDN,posicion,8,figura,giro,5,0); if(giro == 2) desplazar(PZA_LDO,posicion,8,figura,giro,5,-1); if(giro == 3) desplazar(PZA_LDD,posicion,9,figura,giro,5,0); break; case 1://T if(giro == 0) desplazar(PZA_T,posicion,9,figura,giro,5,0); if(giro == 1) desplazar(PZA_TN,posicion,8,figura,giro,6,0); if(giro == 2) desplazar(PZA_TO,posicion,8,figura,giro,5,0); if(giro == 3) desplazar(PZA_TD,posicion,8,figura,giro,5,-1); break; case 2://I if(giro == 0 || giro == 2) desplazar(PZA_I,posicion,8,figura,giro,6,-1); if(giro == 1 || giro == 3) desplazar(PZA_IR,posicion,9,figura,giro,5,0); break; case 3://Cuadrado if(giro == 0 || giro == 1 || giro == 2 || giro == 3) desplazar(PZA_C,posicion,9,figura,giro,6,0); break; case 4: //Z if(giro == 0 || giro == 2) desplazar(PZA_Z,posicion,9,figura,giro,5,0); if(giro == 1 || giro == 3) desplazar(PZA_ZN,posicion,8,figura,giro,6,0); break; default: figura=0; giro=0; desplazar(VACIO,posicion,9,figura,giro,6,0); break; } } void captura_datos(){ pc.baud(38400); //Inicializa la velocidad de comunicacion char inicio=0; int posicion= 0; char figura= 0; char giro= 0; char final=0; debuging("\n Ingrese el inicio del comando. "); inicio=pc.getc(); debuging("\n Ingrese la Figura. "); figura=pc.getc(); debuging("\n Seleccione el giro. "); giro=pc.getc(); debuging("\n Seleccione la posicion. "); posicion=pc.getc(); debuging("\n Ingrese el final del comando. "); final=pc.getc(); if(inicio!= '<' || final != '>'){ debuging("\n Error en el comando."); }else{ read(posicion,figura,giro); } } void inicializar(){ //INICIALIZA LA MATRIZ sendSPI(0x0c,1); sendSPI(0x0b,7); sendSPI(0x09,0); sendSPI(0x0A,0x00); //SELECCIONA LA LUMINOSIDAD DE LA MATRIZ int i; for (i=0;i<2;i++){ sendSPI(0x0F,1); wait (0.5); sendSPI(0x0f,0); wait (0.5); } for (int j= 1; j<=8;j++){ // limpia la pantalla al encenderce o reiniarcea asi //no quedan leds encendidos cuando se ejecute el programa nuevamente sendSPI(j, 0x00); //pone cada columna y vecto en blanco al inicializar } } int main() { inicializar(); // Inicializa el programa para establecer los modos de trabajo liminosidad while(1){ captura_datos(); // Inicia la lectura de la informacion } } uint16_t* girar(uint16_t* pieza, int posicion){ uint16_t desplazamiento[8]={0}; int l= 0; for(int o=posicion; o<(posicion+3);o++){ // Inicia un vector auxiliar con solo Ceros desplazamiento[o]=pieza[l]; // Alamcena los nuevos datos tomados en el vector l++; } return desplazamiento; }