Nicolas Gonzalez gil
/
tetrisrepuesto
interrupciones matriz
main.cpp@0:e1f0a37abd92, 2018-10-18 (annotated)
- Committer:
- Nicolas_11
- Date:
- Thu Oct 18 13:14:45 2018 +0000
- Revision:
- 0:e1f0a37abd92
interrupciones
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Nicolas_11 | 0:e1f0a37abd92 | 1 | #include "mbed.h" |
Nicolas_11 | 0:e1f0a37abd92 | 2 | SPI deviceM(PB_15, PB_14, PB_13); |
Nicolas_11 | 0:e1f0a37abd92 | 3 | DigitalOut ssel (PB_12); |
Nicolas_11 | 0:e1f0a37abd92 | 4 | Serial a(USBTX,USBRX); |
Nicolas_11 | 0:e1f0a37abd92 | 5 | InterruptIn button(USER_BUTTON); |
Nicolas_11 | 0:e1f0a37abd92 | 6 | InterruptIn button2(PA_13); |
Nicolas_11 | 0:e1f0a37abd92 | 7 | #define uint8_t unsigned char |
Nicolas_11 | 0:e1f0a37abd92 | 8 | int Tipofig=0; |
Nicolas_11 | 0:e1f0a37abd92 | 9 | int vcol; |
Nicolas_11 | 0:e1f0a37abd92 | 10 | float Vel=0.3; |
Nicolas_11 | 0:e1f0a37abd92 | 11 | int grado=0; |
Nicolas_11 | 0:e1f0a37abd92 | 12 | int in,out; |
Nicolas_11 | 0:e1f0a37abd92 | 13 | int lim; |
Nicolas_11 | 0:e1f0a37abd92 | 14 | int lim2; |
Nicolas_11 | 0:e1f0a37abd92 | 15 | int m; |
Nicolas_11 | 0:e1f0a37abd92 | 16 | int hhh; |
Nicolas_11 | 0:e1f0a37abd92 | 17 | int col; |
Nicolas_11 | 0:e1f0a37abd92 | 18 | uint8_t Matr[9]={0,0,0,0,0,0,0,0,0}; |
Nicolas_11 | 0:e1f0a37abd92 | 19 | uint8_t F_t[3]={0b11100000,0b01000000,0}; |
Nicolas_11 | 0:e1f0a37abd92 | 20 | uint8_t F_s[3]={0b11000000,0b01100000,0}; |
Nicolas_11 | 0:e1f0a37abd92 | 21 | uint8_t F_c[3]={0b11000000,0b11000000,0}; |
Nicolas_11 | 0:e1f0a37abd92 | 22 | uint8_t F_l[3]={0b11000000,0b10000000,0b10000000}; |
Nicolas_11 | 0:e1f0a37abd92 | 23 | uint8_t F_I[3]={0b10000000,0b10000000,0b10000000}; |
Nicolas_11 | 0:e1f0a37abd92 | 24 | int poscol; |
Nicolas_11 | 0:e1f0a37abd92 | 25 | |
Nicolas_11 | 0:e1f0a37abd92 | 26 | void sendSPI(uint8_t d1, uint8_t d2) |
Nicolas_11 | 0:e1f0a37abd92 | 27 | { |
Nicolas_11 | 0:e1f0a37abd92 | 28 | deviceM.unlock(); |
Nicolas_11 | 0:e1f0a37abd92 | 29 | ssel=0; |
Nicolas_11 | 0:e1f0a37abd92 | 30 | deviceM.write(d1); |
Nicolas_11 | 0:e1f0a37abd92 | 31 | deviceM.write(d2); |
Nicolas_11 | 0:e1f0a37abd92 | 32 | ssel=1; |
Nicolas_11 | 0:e1f0a37abd92 | 33 | deviceM.lock(); |
Nicolas_11 | 0:e1f0a37abd92 | 34 | } |
Nicolas_11 | 0:e1f0a37abd92 | 35 | |
Nicolas_11 | 0:e1f0a37abd92 | 36 | void borrar() |
Nicolas_11 | 0:e1f0a37abd92 | 37 | { |
Nicolas_11 | 0:e1f0a37abd92 | 38 | for(int i;i<=8;i++) { |
Nicolas_11 | 0:e1f0a37abd92 | 39 | sendSPI(i,0); |
Nicolas_11 | 0:e1f0a37abd92 | 40 | } |
Nicolas_11 | 0:e1f0a37abd92 | 41 | } |
Nicolas_11 | 0:e1f0a37abd92 | 42 | |
Nicolas_11 | 0:e1f0a37abd92 | 43 | void inicializar(){ |
Nicolas_11 | 0:e1f0a37abd92 | 44 | |
Nicolas_11 | 0:e1f0a37abd92 | 45 | a.baud(9600); |
Nicolas_11 | 0:e1f0a37abd92 | 46 | sendSPI(0x0c,1); |
Nicolas_11 | 0:e1f0a37abd92 | 47 | sendSPI(0x09,0); |
Nicolas_11 | 0:e1f0a37abd92 | 48 | sendSPI(0x0A,0x01); |
Nicolas_11 | 0:e1f0a37abd92 | 49 | sendSPI(0x0F,1); |
Nicolas_11 | 0:e1f0a37abd92 | 50 | wait (0.5); |
Nicolas_11 | 0:e1f0a37abd92 | 51 | sendSPI(0x0F,0); |
Nicolas_11 | 0:e1f0a37abd92 | 52 | wait(0.5); |
Nicolas_11 | 0:e1f0a37abd92 | 53 | sendSPI(0xB,0x7); |
Nicolas_11 | 0:e1f0a37abd92 | 54 | borrar(); |
Nicolas_11 | 0:e1f0a37abd92 | 55 | } |
Nicolas_11 | 0:e1f0a37abd92 | 56 | |
Nicolas_11 | 0:e1f0a37abd92 | 57 | void Rx_interrupt(); |
Nicolas_11 | 0:e1f0a37abd92 | 58 | |
Nicolas_11 | 0:e1f0a37abd92 | 59 | void pressed() |
Nicolas_11 | 0:e1f0a37abd92 | 60 | { |
Nicolas_11 | 0:e1f0a37abd92 | 61 | lim2--; |
Nicolas_11 | 0:e1f0a37abd92 | 62 | if(lim2<2){ |
Nicolas_11 | 0:e1f0a37abd92 | 63 | lim2=1; |
Nicolas_11 | 0:e1f0a37abd92 | 64 | } |
Nicolas_11 | 0:e1f0a37abd92 | 65 | lim2=(hhh)-lim2; |
Nicolas_11 | 0:e1f0a37abd92 | 66 | a.printf("valor %d\n",lim2); |
Nicolas_11 | 0:e1f0a37abd92 | 67 | return; |
Nicolas_11 | 0:e1f0a37abd92 | 68 | } |
Nicolas_11 | 0:e1f0a37abd92 | 69 | void pressed2() |
Nicolas_11 | 0:e1f0a37abd92 | 70 | { |
Nicolas_11 | 0:e1f0a37abd92 | 71 | lim2++; |
Nicolas_11 | 0:e1f0a37abd92 | 72 | if(lim2>=8){ |
Nicolas_11 | 0:e1f0a37abd92 | 73 | lim2=8; |
Nicolas_11 | 0:e1f0a37abd92 | 74 | } |
Nicolas_11 | 0:e1f0a37abd92 | 75 | a.printf("valor2 %d\n",lim2); |
Nicolas_11 | 0:e1f0a37abd92 | 76 | return; |
Nicolas_11 | 0:e1f0a37abd92 | 77 | } |
Nicolas_11 | 0:e1f0a37abd92 | 78 | |
Nicolas_11 | 0:e1f0a37abd92 | 79 | void scan(uint8_t *sc,uint8_t *fli,uint8_t tras) |
Nicolas_11 | 0:e1f0a37abd92 | 80 | { |
Nicolas_11 | 0:e1f0a37abd92 | 81 | int i; |
Nicolas_11 | 0:e1f0a37abd92 | 82 | int f; |
Nicolas_11 | 0:e1f0a37abd92 | 83 | uint8_t t; |
Nicolas_11 | 0:e1f0a37abd92 | 84 | for(i=1;i<=8;i++) |
Nicolas_11 | 0:e1f0a37abd92 | 85 | { |
Nicolas_11 | 0:e1f0a37abd92 | 86 | t=*(fli)>>(tras-1); |
Nicolas_11 | 0:e1f0a37abd92 | 87 | if(i>7){f=(*(sc+(8)))&(t);break;} |
Nicolas_11 | 0:e1f0a37abd92 | 88 | |
Nicolas_11 | 0:e1f0a37abd92 | 89 | else{f=(*(sc+(i+1)))&(t);} |
Nicolas_11 | 0:e1f0a37abd92 | 90 | |
Nicolas_11 | 0:e1f0a37abd92 | 91 | if(f>0){lim=i;break;} |
Nicolas_11 | 0:e1f0a37abd92 | 92 | else{lim=8;} |
Nicolas_11 | 0:e1f0a37abd92 | 93 | } |
Nicolas_11 | 0:e1f0a37abd92 | 94 | a.printf("\n stop de fila \n %d",i); |
Nicolas_11 | 0:e1f0a37abd92 | 95 | a.printf("\n limite \n %d",lim); |
Nicolas_11 | 0:e1f0a37abd92 | 96 | } |
Nicolas_11 | 0:e1f0a37abd92 | 97 | |
Nicolas_11 | 0:e1f0a37abd92 | 98 | void save(uint8_t *vC,uint8_t col) |
Nicolas_11 | 0:e1f0a37abd92 | 99 | { |
Nicolas_11 | 0:e1f0a37abd92 | 100 | hhh=col; |
Nicolas_11 | 0:e1f0a37abd92 | 101 | if((*(vC))==0b10000000 && (*(vC+1))==0b10000000&& (*(vC+2))==0b10000000 && col==7 ){col=7;} |
Nicolas_11 | 0:e1f0a37abd92 | 102 | if((*(vC))==0b10000000 && (*(vC+1))==0b10000000&& (*(vC+2))==0b10000000 && col==8 ){col=7;} |
Nicolas_11 | 0:e1f0a37abd92 | 103 | if((*(vC))==0b11000000 && (*(vC+1))==0b11000000 && col==8 ){col=8;} |
Nicolas_11 | 0:e1f0a37abd92 | 104 | if(col>=6){col=6;} |
Nicolas_11 | 0:e1f0a37abd92 | 105 | uint8_t dat [8]; |
Nicolas_11 | 0:e1f0a37abd92 | 106 | scan(Matr,vC,col); |
Nicolas_11 | 0:e1f0a37abd92 | 107 | int i; |
Nicolas_11 | 0:e1f0a37abd92 | 108 | int j=1; |
Nicolas_11 | 0:e1f0a37abd92 | 109 | int h=1; |
Nicolas_11 | 0:e1f0a37abd92 | 110 | lim2=col; |
Nicolas_11 | 0:e1f0a37abd92 | 111 | a.printf("\n limite led \n %d",lim); |
Nicolas_11 | 0:e1f0a37abd92 | 112 | |
Nicolas_11 | 0:e1f0a37abd92 | 113 | for(i=1;i<=lim;i++){ |
Nicolas_11 | 0:e1f0a37abd92 | 114 | |
Nicolas_11 | 0:e1f0a37abd92 | 115 | if(i>=1){ |
Nicolas_11 | 0:e1f0a37abd92 | 116 | |
Nicolas_11 | 0:e1f0a37abd92 | 117 | //button.fall(&pressed); |
Nicolas_11 | 0:e1f0a37abd92 | 118 | //button2.fall(&pressed2); |
Nicolas_11 | 0:e1f0a37abd92 | 119 | j=i-1; |
Nicolas_11 | 0:e1f0a37abd92 | 120 | h=i-2; |
Nicolas_11 | 0:e1f0a37abd92 | 121 | col=lim2; |
Nicolas_11 | 0:e1f0a37abd92 | 122 | dat[1]=((*(vC))>>col-1) ; |
Nicolas_11 | 0:e1f0a37abd92 | 123 | dat[2]=(*(vC+1)>>col-1) ; |
Nicolas_11 | 0:e1f0a37abd92 | 124 | dat[3]=(*(vC+2)>>col-1) ; |
Nicolas_11 | 0:e1f0a37abd92 | 125 | uint8_t e=~((0b11100000)>>col-1); |
Nicolas_11 | 0:e1f0a37abd92 | 126 | /* |
Nicolas_11 | 0:e1f0a37abd92 | 127 | if(i>=2){ |
Nicolas_11 | 0:e1f0a37abd92 | 128 | dat[1]=(((*(vC))>>col-1))<<(m) ; |
Nicolas_11 | 0:e1f0a37abd92 | 129 | dat[2]=((*(vC+1)>>col-1))<<(m) ; |
Nicolas_11 | 0:e1f0a37abd92 | 130 | dat[3]=((*(vC+2)>>col-1))<<(m); |
Nicolas_11 | 0:e1f0a37abd92 | 131 | a.printf("\n limit \n %d",m); |
Nicolas_11 | 0:e1f0a37abd92 | 132 | } |
Nicolas_11 | 0:e1f0a37abd92 | 133 | */ |
Nicolas_11 | 0:e1f0a37abd92 | 134 | Matr[i]=dat[1] | Matr[i]; |
Nicolas_11 | 0:e1f0a37abd92 | 135 | Matr[j]=((dat[2] | Matr[j])&(dat[2]|e)); |
Nicolas_11 | 0:e1f0a37abd92 | 136 | Matr[h]=((dat[3] | Matr[h])&(dat[3]|e)); |
Nicolas_11 | 0:e1f0a37abd92 | 137 | if(i>=3){Matr[i-3]=Matr[i-3]&e;} |
Nicolas_11 | 0:e1f0a37abd92 | 138 | |
Nicolas_11 | 0:e1f0a37abd92 | 139 | sendSPI(i,(Matr[i])); |
Nicolas_11 | 0:e1f0a37abd92 | 140 | sendSPI(j,(Matr[j])); |
Nicolas_11 | 0:e1f0a37abd92 | 141 | sendSPI(h,(Matr[h])); |
Nicolas_11 | 0:e1f0a37abd92 | 142 | sendSPI((i-3),(Matr[i-3])); |
Nicolas_11 | 0:e1f0a37abd92 | 143 | wait(Vel); |
Nicolas_11 | 0:e1f0a37abd92 | 144 | } |
Nicolas_11 | 0:e1f0a37abd92 | 145 | if(i>=8){break;} |
Nicolas_11 | 0:e1f0a37abd92 | 146 | } |
Nicolas_11 | 0:e1f0a37abd92 | 147 | } |
Nicolas_11 | 0:e1f0a37abd92 | 148 | |
Nicolas_11 | 0:e1f0a37abd92 | 149 | |
Nicolas_11 | 0:e1f0a37abd92 | 150 | |
Nicolas_11 | 0:e1f0a37abd92 | 151 | void giro(uint8_t *f,uint8_t col,uint8_t gi) |
Nicolas_11 | 0:e1f0a37abd92 | 152 | { |
Nicolas_11 | 0:e1f0a37abd92 | 153 | uint8_t a[3]={0,0,0}; |
Nicolas_11 | 0:e1f0a37abd92 | 154 | int i; |
Nicolas_11 | 0:e1f0a37abd92 | 155 | int j; |
Nicolas_11 | 0:e1f0a37abd92 | 156 | switch(gi){ |
Nicolas_11 | 0:e1f0a37abd92 | 157 | case 0:save(f,col);break; |
Nicolas_11 | 0:e1f0a37abd92 | 158 | case 1: |
Nicolas_11 | 0:e1f0a37abd92 | 159 | for(j=0;j<3;j++){ |
Nicolas_11 | 0:e1f0a37abd92 | 160 | for(i=0;i<3;i++){ |
Nicolas_11 | 0:e1f0a37abd92 | 161 | a[i]=((((*(f+j))<<2-i)&0b10000000)>>j)+a[i]; |
Nicolas_11 | 0:e1f0a37abd92 | 162 | } |
Nicolas_11 | 0:e1f0a37abd92 | 163 | } |
Nicolas_11 | 0:e1f0a37abd92 | 164 | save(a,col); |
Nicolas_11 | 0:e1f0a37abd92 | 165 | break; |
Nicolas_11 | 0:e1f0a37abd92 | 166 | case 2: |
Nicolas_11 | 0:e1f0a37abd92 | 167 | for(j=0;j<3;j++){ |
Nicolas_11 | 0:e1f0a37abd92 | 168 | for(i=0;i<3;i++){ |
Nicolas_11 | 0:e1f0a37abd92 | 169 | a[i]=((((*(f+(2-i)))>>2-j)&0b00100000)<<j)+a[i]; |
Nicolas_11 | 0:e1f0a37abd92 | 170 | } |
Nicolas_11 | 0:e1f0a37abd92 | 171 | } |
Nicolas_11 | 0:e1f0a37abd92 | 172 | save(a,col); |
Nicolas_11 | 0:e1f0a37abd92 | 173 | break; |
Nicolas_11 | 0:e1f0a37abd92 | 174 | case 3: |
Nicolas_11 | 0:e1f0a37abd92 | 175 | for(j=0;j<3;j++){ |
Nicolas_11 | 0:e1f0a37abd92 | 176 | for(i=0;i<3;i++){ |
Nicolas_11 | 0:e1f0a37abd92 | 177 | a[i]=((((*(f+j))>>2-i)&(0b00100000))<<j)+a[i]; |
Nicolas_11 | 0:e1f0a37abd92 | 178 | } |
Nicolas_11 | 0:e1f0a37abd92 | 179 | } |
Nicolas_11 | 0:e1f0a37abd92 | 180 | save(a,col); |
Nicolas_11 | 0:e1f0a37abd92 | 181 | break; |
Nicolas_11 | 0:e1f0a37abd92 | 182 | default: |
Nicolas_11 | 0:e1f0a37abd92 | 183 | break; |
Nicolas_11 | 0:e1f0a37abd92 | 184 | } |
Nicolas_11 | 0:e1f0a37abd92 | 185 | } |
Nicolas_11 | 0:e1f0a37abd92 | 186 | |
Nicolas_11 | 0:e1f0a37abd92 | 187 | int main() { |
Nicolas_11 | 0:e1f0a37abd92 | 188 | inicializar(); |
Nicolas_11 | 0:e1f0a37abd92 | 189 | button2.fall(&pressed; |
Nicolas_11 | 0:e1f0a37abd92 | 190 | button.fall(&pressed); |
Nicolas_11 | 0:e1f0a37abd92 | 191 | while(1){ |
Nicolas_11 | 0:e1f0a37abd92 | 192 | |
Nicolas_11 | 0:e1f0a37abd92 | 193 | in=a.getc(); |
Nicolas_11 | 0:e1f0a37abd92 | 194 | Tipofig=a.getc(); |
Nicolas_11 | 0:e1f0a37abd92 | 195 | vcol=a.getc(); |
Nicolas_11 | 0:e1f0a37abd92 | 196 | grado=a.getc(); |
Nicolas_11 | 0:e1f0a37abd92 | 197 | out=a.getc(); |
Nicolas_11 | 0:e1f0a37abd92 | 198 | if(in==60 && 1<=Tipofig<=5 && 0<vcol<=7 && 0<=grado<=3 && out==62){ |
Nicolas_11 | 0:e1f0a37abd92 | 199 | switch(Tipofig) |
Nicolas_11 | 0:e1f0a37abd92 | 200 | { |
Nicolas_11 | 0:e1f0a37abd92 | 201 | case 1:giro(F_t,vcol,grado); break; |
Nicolas_11 | 0:e1f0a37abd92 | 202 | case 2:giro(F_s,vcol,grado); break; |
Nicolas_11 | 0:e1f0a37abd92 | 203 | case 3:giro(F_c,vcol,grado); break; |
Nicolas_11 | 0:e1f0a37abd92 | 204 | case 4:giro(F_l,vcol,grado); break; |
Nicolas_11 | 0:e1f0a37abd92 | 205 | case 5:giro(F_I,vcol,grado); break; |
Nicolas_11 | 0:e1f0a37abd92 | 206 | default:break; |
Nicolas_11 | 0:e1f0a37abd92 | 207 | } |
Nicolas_11 | 0:e1f0a37abd92 | 208 | } |
Nicolas_11 | 0:e1f0a37abd92 | 209 | else{ |
Nicolas_11 | 0:e1f0a37abd92 | 210 | break; |
Nicolas_11 | 0:e1f0a37abd92 | 211 | } |
Nicolas_11 | 0:e1f0a37abd92 | 212 | } |
Nicolas_11 | 0:e1f0a37abd92 | 213 | |
Nicolas_11 | 0:e1f0a37abd92 | 214 | } |
Nicolas_11 | 0:e1f0a37abd92 | 215 |