interrupciones matriz

Dependencies:   mbed

Committer:
Nicolas_11
Date:
Thu Oct 18 13:14:45 2018 +0000
Revision:
0:e1f0a37abd92
interrupciones

Who changed what in which revision?

UserRevisionLine numberNew 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