Yosef Guevara Salamanca
/
TETS_PC
bien spi no se queda pegado
Embed:
(wiki syntax)
Show/hide line numbers
tetris_pc.cpp
00001 #include "mbed.h" 00002 #include "piezas.h" 00003 //#define DEBUG 1 00004 00005 00006 Serial pc(USBTX,USBRX); 00007 SPI deviceM(PB_15, PB_14, PB_13); //SE DEFINE EL LED QUE ACTIVARA EL DISPOSITIVO 00008 DigitalOut ssel (PB_12); 00009 DigitalIn pulsador_izq(A5); //pulsador conector izquierdo 00010 DigitalIn pulsador_der(A4); //pulsador conector derecho 00011 DigitalIn p_giro(A3); //pulsador conector giro 00012 00013 //Declaracion de funciones 00014 void inicializar(); 00015 void pulsador_der(); 00016 00017 uint16_t* girar(uint16_t* pieza, int posicion); 00018 int memoria[8]={0}; 00019 int *pointer=0; 00020 void debuging(char*s,...){ 00021 00022 #if DEBUG 00023 pc.printf(s); 00024 #endif 00025 00026 } 00027 00028 // FUNCION EL CUAL ENVIA EL DATO JUNTO CON LA DIRECCION DE LA COLUMNA CORRESPONDIENTE AL PRIMER DISPOSITIVO 00029 void sendSPI(uint8_t d1, uint8_t d2) 00030 { 00031 deviceM.unlock(); 00032 ssel=0; // SELECCIONA EL PRIMER DISPOSOTIVO 00033 deviceM.write(d1); // ESCRIBE EL ADDRESS 00034 deviceM.write(d2); // ESCRIBE EL DATA 00035 ssel=1; 00036 deviceM.lock(); 00037 }; 00038 00039 // Toma el vector reorganizado , lo imprime y lo almacena 00040 void captura_matriz(uint16_t* imprimir,int posicion,int auxi, char figura, char giro, int izq, int der){ 00041 int i=0; // inicia el contador i en 0 00042 int enable=1; 00043 00044 while(enable){ //se encarga de desplazar los bits dentro del vector 00045 //pc.printf("\n1- conteo del corriemiento:\n %d",i); 00046 00047 int j=1; // inicia el contador j en 1 00048 00049 while(pulsador_izq ==1 & pulsador_der==0 & p_giro == 0 && posicion<izq){ 00050 //pc.printf("\n >>>>>>>>>>>>FERNEY PRUEBA1 giro %d, posicion %d, izq %d, der %d\n ",giro, posicion,izq,der); 00051 posicion++; 00052 for(int ci=7; ci >=0; ci--){ 00053 pc.printf("\n hacia la izq:\n "); 00054 //pc.printf("\n >>>>>>>>>>>>FERNEY PRUEBA1 IZQ giro %d, posicion %d\n ",giro, posicion); 00055 imprimir[ci]=imprimir[ci-1]; 00056 if(ci==0){ 00057 imprimir[ci]=0; 00058 00059 } 00060 } 00061 for(int m=1;m<=8;m++){ 00062 sendSPI(m, memoria[m-1]|(imprimir[m-1]>>i-1)); 00063 } 00064 wait(1.0); 00065 00066 } 00067 00068 while(pulsador_der ==1 & pulsador_izq ==0 & p_giro == 0 && posicion>der){ 00069 //pc.printf("\n hacia la der:\n "); 00070 //pc.printf("\n >>>>>>>>>>>>FERNEY PRUEBA1 DER giro %d, posicion %d, izq %d, der %d\n ",giro, posicion,izq,der); 00071 posicion--; 00072 for(int k=0; k <8; k++){ 00073 00074 imprimir[k]=imprimir[k+1]; 00075 if(k==7){ 00076 imprimir[k]=0; 00077 00078 } 00079 } 00080 for(int n=1;n<=8;n++){ 00081 sendSPI(n, memoria[n-1]|(imprimir[n-1]>>i-1)); 00082 } 00083 wait(1.0); 00084 00085 } 00086 if(p_giro == 1 & pulsador_der ==0 & pulsador_izq ==0){ 00087 giro++; 00088 //pc.printf("\n >>>>>>>>>>>>FERNEY PRUEBA GIRO giro %d, posicion %d, izq %d, der %d\n ",giro, posicion,izq,der); 00089 if(giro ==4){ 00090 giro=0; 00091 } 00092 switch(figura){ //Este switch escoje la figura con que trabajaar 00093 case 0: // L 00094 if(giro == 0) 00095 imprimir= girar(PZA_L, posicion); 00096 izq=6, der = 0; 00097 auxi=7; 00098 if(giro == 1) 00099 imprimir= girar(PZA_LDN, posicion); 00100 izq=5, der = 0; 00101 auxi=7; 00102 if(giro == 2) 00103 imprimir= girar(PZA_LDO, posicion); 00104 izq=5, der = -1; 00105 auxi=7; 00106 if(giro == 3) 00107 imprimir=girar(PZA_LDD, posicion); 00108 izq=5, der = 0; 00109 auxi=8; 00110 break; 00111 case 1://T 00112 if(giro == 0) 00113 imprimir= girar(PZA_T, posicion); 00114 izq=5, der = 0; 00115 auxi=9; 00116 if(giro == 1) 00117 imprimir= girar(PZA_TN, posicion); 00118 izq=6, der = 0; 00119 auxi=8; 00120 if(giro == 2) 00121 imprimir= girar(PZA_TO, posicion); 00122 izq=5, der = 0; 00123 auxi=8; 00124 if(giro == 3) 00125 imprimir= girar(PZA_TD, posicion); 00126 izq=5, der = -1; 00127 auxi=8; 00128 break; 00129 case 2://I 00130 if(giro == 0 || giro == 2) 00131 imprimir= girar(PZA_I, posicion); 00132 izq=6, der = -1; 00133 auxi=8; 00134 if(giro == 1 || giro == 3) 00135 imprimir=girar(PZA_IR, posicion); 00136 izq=5, der = 0; 00137 auxi=9; 00138 break; 00139 case 3://Cuadrado 00140 if(giro == 0 || giro == 1 || giro == 2 || giro == 3) 00141 imprimir= girar(PZA_C, posicion); 00142 izq=6, der = 0; 00143 auxi=9; 00144 break; 00145 case 4: //Z 00146 if(giro == 0 || giro == 2) 00147 imprimir= girar(PZA_Z, posicion); 00148 izq=5, der = 0; 00149 auxi=9; 00150 if(giro == 1 || giro == 3) 00151 imprimir= girar(PZA_ZN, posicion); 00152 izq=6, der = 0; 00153 auxi=8; 00154 break; 00155 00156 } 00157 00158 00159 00160 } 00161 00162 while(j<=8){ //se encarga de seleccionar que posicion del vector imprimira 00163 00164 sendSPI(j, memoria[j-1]|(imprimir[j-1]>>i)); //Imprime el resultado de aplicar OR a la memoria y al desplamamiento de imprimir 00165 //wait(0.1); // Activar este wait para pruebas de desplazamiento y captura de los datos 00166 00167 if(i==auxi-1 || (memoria[j-1]&(imprimir[j-1]>>i+1))!=0){ //Detiene el desplazamiento cuando los bits tocan fondo, 00168 enable=0;// desabilitador del ciclo while 00169 00170 for(int k=0; k<8;k++){ // Almacena todos lo datos del vector en la posicion que corrimiento en la memoria 00171 memoria[k]= memoria[k]|(imprimir[k]>>i); 00172 pointer= &memoria[k]; 00173 pc.printf("\n pointer %d \n", *pointer); 00174 if(*pointer==511){ 00175 NVIC_SystemReset(); 00176 } 00177 00178 } 00179 00180 } 00181 j++; 00182 } 00183 wait(1.0); // espera para tomar el otro valor de lectura 00184 i++; 00185 } 00186 00187 } 00188 00189 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 00190 00191 uint16_t desplazamiento[8]={0}; // Inicia un vector auxiliar con solo Ceros 00192 int j= 0; 00193 00194 for(int i=posicion; i<(posicion+3);i++){ // Inicia un vector auxiliar con solo Ceros 00195 desplazamiento[i]=datos[j]; // Alamcena los nuevos datos tomados en el vector 00196 j++; 00197 } 00198 captura_matriz(desplazamiento,posicion,auxi,figura,giro,izq,der); //Envia el Vector desplazado la funcion de captura de matriz 00199 } 00200 00201 void read(int posicion, char figura, char giro){ 00202 00203 switch(figura){ //Este switch escoje la figura con que trabajaar 00204 case 0: // L 00205 if(giro == 0) 00206 desplazar(PZA_L,posicion,8,figura,giro,6,0); 00207 if(giro == 1) 00208 desplazar(PZA_LDN,posicion,8,figura,giro,5,0); 00209 if(giro == 2) 00210 desplazar(PZA_LDO,posicion,8,figura,giro,5,-1); 00211 if(giro == 3) 00212 desplazar(PZA_LDD,posicion,9,figura,giro,5,0); 00213 break; 00214 case 1://T 00215 if(giro == 0) 00216 desplazar(PZA_T,posicion,9,figura,giro,5,0); 00217 if(giro == 1) 00218 desplazar(PZA_TN,posicion,8,figura,giro,6,0); 00219 if(giro == 2) 00220 desplazar(PZA_TO,posicion,8,figura,giro,5,0); 00221 if(giro == 3) 00222 desplazar(PZA_TD,posicion,8,figura,giro,5,-1); 00223 break; 00224 case 2://I 00225 if(giro == 0 || giro == 2) 00226 desplazar(PZA_I,posicion,8,figura,giro,6,-1); 00227 if(giro == 1 || giro == 3) 00228 desplazar(PZA_IR,posicion,9,figura,giro,5,0); 00229 break; 00230 case 3://Cuadrado 00231 if(giro == 0 || giro == 1 || giro == 2 || giro == 3) 00232 desplazar(PZA_C,posicion,9,figura,giro,6,0); 00233 break; 00234 case 4: //Z 00235 if(giro == 0 || giro == 2) 00236 desplazar(PZA_Z,posicion,9,figura,giro,5,0); 00237 if(giro == 1 || giro == 3) 00238 desplazar(PZA_ZN,posicion,8,figura,giro,6,0); 00239 break; 00240 default: 00241 figura=0; 00242 giro=0; 00243 desplazar(VACIO,posicion,9,figura,giro,6,0); 00244 break; 00245 } 00246 } 00247 00248 void captura_datos(){ 00249 00250 pc.baud(38400); //Inicializa la velocidad de comunicacion 00251 char inicio=0; 00252 int posicion= 0; 00253 char figura= 0; 00254 char giro= 0; 00255 char final=0; 00256 00257 debuging("\n Ingrese el inicio del comando. "); 00258 inicio=pc.getc(); 00259 debuging("\n Ingrese la Figura. "); 00260 figura=pc.getc(); 00261 debuging("\n Seleccione el giro. "); 00262 giro=pc.getc(); 00263 debuging("\n Seleccione la posicion. "); 00264 posicion=pc.getc(); 00265 debuging("\n Ingrese el final del comando. "); 00266 final=pc.getc(); 00267 00268 if(inicio!= '<' || final != '>'){ 00269 00270 debuging("\n Error en el comando."); 00271 00272 }else{ 00273 00274 read(posicion,figura,giro); 00275 00276 } 00277 00278 00279 00280 } 00281 00282 void inicializar(){ //INICIALIZA LA MATRIZ 00283 00284 sendSPI(0x0c,1); 00285 sendSPI(0x0b,7); 00286 sendSPI(0x09,0); 00287 sendSPI(0x0A,0x00); //SELECCIONA LA LUMINOSIDAD DE LA MATRIZ 00288 int i; 00289 for (i=0;i<2;i++){ 00290 sendSPI(0x0F,1); 00291 wait (0.5); 00292 sendSPI(0x0f,0); 00293 wait (0.5); 00294 } 00295 00296 for (int j= 1; j<=8;j++){ // limpia la pantalla al encenderce o reiniarcea asi 00297 //no quedan leds encendidos cuando se ejecute el programa nuevamente 00298 00299 sendSPI(j, 0x00); //pone cada columna y vecto en blanco al inicializar 00300 } 00301 } 00302 00303 00304 int main() { 00305 inicializar(); // Inicializa el programa para establecer los modos de trabajo liminosidad 00306 while(1){ 00307 captura_datos(); // Inicia la lectura de la informacion 00308 } 00309 00310 } 00311 00312 uint16_t* girar(uint16_t* pieza, int posicion){ 00313 uint16_t desplazamiento[8]={0}; 00314 int l= 0; 00315 for(int o=posicion; o<(posicion+3);o++){ // Inicia un vector auxiliar con solo Ceros 00316 desplazamiento[o]=pieza[l]; // Alamcena los nuevos datos tomados en el vector 00317 l++; 00318 } 00319 00320 return desplazamiento; 00321 }
Generated on Thu Jul 14 2022 14:51:31 by 1.7.2