Código simplificado, grados, funciona detencion filas, columna completo, puede recoger 4 fuguras en caracteres.
Fork of moggo_2 by
moggo
El siguiente programa emula las funciones basicas de un tetris:
Inicialmente creamos un vector, este vector contiene las partes de las figuras, es facil identificar que cada figura esta compuesta de 6 posibles piezas, estas son:
0: * 1: 2: * 3: 0* 4: 0 5: 0
Por ejemplo para generar una pieza tomamos las partes necesarias de nuestro vector despues las enviamos a una subrutina que las guardara en el orden correcto para ser usadas:
ej: El cuadrado
se envian los datos: 5,1,1
0
Esta es la informacion que se almacenara en el vector temporal.
las piezas se forman tomando el posible espacio usado el cual se define maximo en una matriz de 3x4, inicialmente se penso como una matriz de 3x3 pero se presenta un inconveniente al desplazar la figura sin tener en cuenta el espacio sobre ella, por tal motivo siempre se tendran figuras del tipo: Figuras:
0 | 0 | 0 | 0 | 0 |
- | 0 | * | 0 | 0 |
- | * | * | * * | * * |
- * | * * * | * | * * | * * | 0 1 2 3 4
Una vez definidas las figuras tenemos un seleccionador de casos, funciona segun corresponda:
void dibujar(char type_fig,char grados,char columna) { borrar(); switch (type_fig){ Se envia el vector que contiene la figura a la funcion copiar matriz.
case 1: cop_mat(5,1,1,FIG_ALL,columna); break; 1: cuadro, para esta figura todos los grados son iguales;
case 2: if(grados==1 || grados==3) cop_mat(0,0,0,FIG_ALL,columna); if(grados==2 || grados==4) cop_mat(5,5,2,FIG_ALL,columna); 2: I, Ele, para esta figura grado1=grado3 y grado2=grado4 ; break;
case 3: if(grados==1) cop_mat(0,0,1,FIG_ALL,columna); 3: L, para esta figura todos los grados son diferentes; if(grados==2) cop_mat(5,2,0,FIG_ALL,columna); if(grados==3) cop_mat(1,0,0,FIG_ALL,columna); if(grados==4) cop_mat(5,0,2,FIG_ALL,columna); break; 2: I;
case 4: if(grados==1) cop_mat(5,2,0,FIG_ALL,columna); 4: T, para esta figura todos los grados son diferentes; if(grados==2) cop_mat(3,1,3,FIG_ALL,columna); if(grados==3) cop_mat(5,3,2,FIG_ALL,columna); if(grados==4) cop_mat(0,1,0,FIG_ALL,columna); break;
case 5: if(grados==1 || grados==3) cop_mat(5,4,1,FIG_ALL,columna); 5: S, para esta figura grado1=grado3 y grado2=grado4 ; if(grados==2 || grados==4) cop_mat(0,1,3,FIG_ALL,columna); break;
Listado de cambios 12:09:18
Se vuelve a la antigua impresion para reestudiar el codigo debido a errores presentados en la impresión: ********** void imp_mat(uint8_t *temp){ uint8_t i=0; buscar_fil(); for (i=0;i<fila;i++){ Realiza la impresion de la matriz. mat_tmp[0]=mat_act[i]+mat_tmp[0]; mat_tmp[1]=mat_act[i+1]+mat_tmp[1]; mat_tmp[2]=mat_act[i+2]+mat_tmp[2]; command.printf("\n pos 0:=%d",mat_tmp[0]); command.printf("\n pos i:=%d",mat_act[i]); command.printf("\n pos 2:=%d",mat_tmp[1]); command.printf("\n pos i+1:=%d",mat_act[i+1]); command.printf("\n pos 1:=%d",mat_tmp[2]); command.printf("\n pos i+2:=%d",mat_act[i+2]); sendSPI(i-1,0); sendSPI(i,mat_tmp[0]); sendSPI(i+1,mat_tmp[1]); sendSPI(i+2,mat_tmp[2]); buscar_col(); wait_ms(VEL); } }
void imp_mat(uint8_t *temp){ uint8_t i=0; buscar_fil(); for (i=0;i<fila;i++){ Realiza la impresion de la matriz. sendSPI(i-1,0); sendSPI(i,*(temp+0)); sendSPI(i+1,*(temp+1)); sendSPI(i+2,*(temp+2)); wait_ms(VEL); }
Cambiamos en la impresion el +2 del i ************ se añade el condicionador de fila: else{ fila++; if(fila>7) fila=7; }
se añade el condicionador de la funcion buscar_col: if(i+1==fila) buscar_col();
Se genera una forma diferente para el barrido adicional por culmna vacia:
else{ fila++; if(fila>7) fila=7; }
por:
else{
cont;
}
Donde cont, es un contador global, la prueba genera un bucle que interrumpe la impresion, al parecer en el caso cont=0. ***********
Cambios en el buscador de columna y el main, se deja este back-up:
************ ************
- include "mbed.h"
- include "moggo.h" agrega la libreria que contiene las figuras.
SPI deviceM(PB_15, PB_14, PB_13); DigitalOut ssel (PB_12); SPI deviceM(PB_5, PB_4, PB_3); define el Clock, Dato salida (miso) y Dato de entrada (mosi). DigitalOut ssel (PB_9); Chip Select para el controlador. Serial command(USBTX,USBRX); habilitar la comunicacion serial a traves del puerto usb.
- define VEL 250 Velocidad de actualizacion de dato en el controlador.
uint8_t mat_act[11]={0,0,0,0,0,0,0,0,0,0,0}; Matriz para mostrar en pantalla. uint8_t mat_tmp[8]={0,0,0,0,0,0,0,0}; Matriz temporal para arrojar las fichas. uint8_t fila=0,cont=0;
void sendSPI(uint8_t d1, uint8_t d2) { deviceM.unlock(); ssel=0; deviceM.write(d1); deviceM.write(d2); ssel=1; deviceM.lock(); }
void test() test { sendSPI(0x09,0); no decodificacion sendSPI(0x0A,0x0); intensidad sendSPI(0x0B,0x07); usa 7 leds sendSPI(0x0C,1); no apaga sendSPI(0x0F,0); operacion normal }
void cop_mat(uint8_t a,uint8_t b,uint8_t c,uint8_t* fig,uint8_t columna) { mat_tmp[0]= *(fig+a)>>columna-1; Realiza una copia de la matriz actual fila por fila. mat_tmp[1]= *(fig+b)>>columna-1; mat_tmp[2]= *(fig+c)>>columna-1; }
void borrar() borrar toda la matriz; { int i; for(i=0;i<=8;i++) { sendSPI(0x0+i,0x00); } };
void buscar_fil(){ for (uint8_t i=0;i<8;i++){ Realiza la impresion de la matriz. if(mat_act[i]==0) fila=i; if(mat_act[i]!=0){ fila=i-1; cambio de 2 a 1 i=8; } } command.printf("\n buscar fila \n %d",fila); command.printf("\n ******* \n "); };
void buscar_col(){ uint8_t y=0; y= mat_act[cont] & mat_tmp[2]; cambiamos a cont el conteo para hacer un barrido desde 0. if(y != 0){ fila=0; } else{ fila++; if(fila>7) fila=7; mat_tmp[2]=mat_tmp[2]+mat_act[cont]; se realiza la suma de vectores para imprimir la nueva matriz. } command.printf("\n fila cambiada en columna: y=%d",y); };
void guardar_mat(){ wait_ms(VEL); mat_act[fila-2]=mat_tmp[0]; mat_act[fila-1]=mat_tmp[1]; pasa de 0 a -1 mat_act[fila]=mat_tmp[2]; pasa de +1 a 0 };
void imp_mat(uint8_t *temp){ se genera la variable global cont. buscar_fil(); for (cont=0;cont<=fila;cont++){ condicionador de funcion, se descarta por una funcion smart. sendSPI(cont-1,0); sendSPI(cont-1,*(temp+0)); sendSPI(cont,*(temp+1)); sendSPI(cont+1,*(temp+2)); pasa de i+2 a i+1 wait_ms(VEL); } }
void dibujar(char type_fig,char grados,char columna) { borrar(); switch (type_fig){ Se envia el vector que contiene la figura a la funcion copiar matriz. case 1: cop_mat(5,1,1,FIG_ALL,columna); break; 1: cuadro;
case 2: if(grados==1 || grados==3) cop_mat(0,0,0,FIG_ALL,columna); if(grados==2 || grados==4) cop_mat(5,5,2,FIG_ALL,columna); 2: I; break;
case 3: if(grados==1) cop_mat(0,0,1,FIG_ALL,columna); 3: L; if(grados==2) cop_mat(5,2,0,FIG_ALL,columna); if(grados==3) cop_mat(1,0,0,FIG_ALL,columna); if(grados==4) cop_mat(5,0,2,FIG_ALL,columna); break; 2: I;
case 4: if(grados==1) cop_mat(5,2,0,FIG_ALL,columna); 4: T; if(grados==2) cop_mat(3,1,3,FIG_ALL,columna); if(grados==3) cop_mat(5,3,2,FIG_ALL,columna); if(grados==4) cop_mat(0,1,0,FIG_ALL,columna); break;
case 5: if(grados==1 || grados==3) cop_mat(5,4,1,FIG_ALL,columna); 5: S; if(grados==2 || grados==4) cop_mat(0,1,3,FIG_ALL,columna); break; } }
int main() { char tipo_fig=1,ncolumna=1,grados=1,lee1=0,lee2=0; enviar ficha y columna test(); borrar(); while(1){ lee1=command.getc(); recive '<' para iniciar la linea de comandos. tipo_fig=command.getc(); grados=command.getc(); ncolumna=command.getc(); lee2=command.getc(); recive '>' para terminar la linea de comandos. if(lee1==0x3c && lee2==0x3e) solo imprime una figura si viene bajo el parametro '<(t_fig) (Grados) (Col)>'. { dibujar(tipo_fig,grados,ncolumna); imp_mat(mat_tmp); guardar_mat(); } } }
********** ************
Cambios generados en la impresion, back-up de imp_mat:
void imp_mat(uint8_t *temp){ se genera la variable global cont. buscar_fil(); for (cont=0;cont<=fila;cont++){ mat_tmp1[0]=(mat_tmp[0]+ mat_act[cont-2]); mat_tmp1[1]=(mat_tmp[1]+ mat_act[cont-1]); mat_tmp1[2]=(mat_tmp[2]+ mat_act[cont]); condicionador de funcion, se descarta por una funcion smart. sendSPI(cont-3,0); sendSPI(cont-2,mat_tmp1[0]); sendSPI(cont-1,mat_tmp1[1]); sendSPI(cont,mat_tmp1[2]); pasa de i+2 a i+1 wait_ms(VEL); } }
*************** *************** Conexión nucleo a la matriz con el max 7219
El max 7912 cuenta con 5 pines que se conectaran al nucleo de la siguiente manera:
MAX NUCLEO
VCC --> Pin 5v o 3v
GND --> Pin GND
DataIn --> PB15
CS --> PB12
Clock --> PB14
************** ************** Captura de datos:
Para realizar la captura de datos se llevan a cabo las indicaciones dadas, estas son:
1-) Para iniciar y finalizar cada pieza utilizaremos los siguientes caracteres "< para iniciar" "> para cerrar" 2-) En medio de los caracteres "<" y ">" se indicara el numero de pieza, grados y columna en la que se desea enviar cada figura. 4-) Se debe tener en cuenta que es posible enviar 2 o mas piezas en una linea de comandos y se debe reconocer cada pieza y enviarlas independientemente, esto se logro de la siguiente manera:
- Se creo un arreglo for que llena un vector que contendra la información de los caracteres enviados
- Se creo otro arreglo for que lee los primeros 5 caracteres, es decir leera "< 01 01 01 >" que en el programa sera la figura cuadro, con 0 grados en la primera columna, para lograr realizar captura cada 5 caracteres realizamos un ciclo for que aumenta de a 5 unidades cada que captura 5 caracteres, es decir cada figura ocupara 5 espacios de memoria.