616 lines
12 KiB
C
616 lines
12 KiB
C
#include "main.h"
|
|
#include "c.h"
|
|
#include "mpu6050.h"
|
|
|
|
uint8_t LD_true_1[10]={63, 6, 91, 79, 102, 109, 125, 7, 127, 111};
|
|
uint8_t LD_true_2[10]={63, 6, 155, 143, 166, 173, 189, 7, 191, 175};
|
|
uint8_t LD_1[10]={63,48, 155, 185, 180, 173, 175, 56, 191};
|
|
uint8_t LD_2[10]={63,48, 91, 121, 116, 109, 111, 56, 127, 125};
|
|
|
|
uint8_t sbuffer[6]={0,0,0,0,0,0};
|
|
|
|
struct ui
|
|
{
|
|
uint8_t DT[2];
|
|
uint8_t lattice[2][8][8];
|
|
|
|
};
|
|
|
|
struct ui dis=
|
|
{
|
|
0,0,
|
|
{
|
|
{
|
|
{1,1,1,1,1,1,1,1,},
|
|
{1,1,1,1,1,1,1,1,},
|
|
{1,1,1,1,1,1,1,1,},
|
|
{1,1,1,1,1,1,1,1,},
|
|
{1,1,1,1,1,1,1,1,},
|
|
{1,1,1,1,1,1,1,1,},
|
|
{1,1,1,1,1,1,1,1,},
|
|
{1,1,1,1,1,1,1,1,},
|
|
},
|
|
{
|
|
{0,0,0,0,0,0,0,0,},
|
|
{0,0,0,0,0,0,0,0,},
|
|
{0,0,0,0,0,0,0,0,},
|
|
{0,0,0,0,0,0,0,0,},
|
|
{0,0,0,0,0,0,0,0,},
|
|
{0,0,0,0,0,0,0,0,},
|
|
{0,0,0,0,0,0,0,0,},
|
|
{0,0,0,0,0,0,0,0,},
|
|
}
|
|
}
|
|
};
|
|
|
|
void send_buffer()
|
|
{
|
|
uint8_t a,b,c;
|
|
D(0);
|
|
CLK(0);
|
|
RCLK(0);
|
|
for(b=0;b<6;b++)
|
|
{
|
|
c=sbuffer[b];
|
|
for(a=0;a<8;a++)
|
|
{
|
|
if(c&0x80)
|
|
{
|
|
D(1);
|
|
}else
|
|
{
|
|
D(0);
|
|
}
|
|
CLK(1);
|
|
CLK(0);
|
|
c<<=1;
|
|
}
|
|
}
|
|
RCLK(1);
|
|
RCLK(0);
|
|
}
|
|
|
|
const uint16_t DEN[8]=//len
|
|
{
|
|
0x1000,
|
|
0x0020,
|
|
0x0010,
|
|
0x0200,
|
|
0x0004,
|
|
0x0400,
|
|
0x4000,
|
|
0x8000,
|
|
};
|
|
const uint16_t DEP[8]=
|
|
{
|
|
0x0008,
|
|
0x0040,
|
|
0x0002,
|
|
0x0080,
|
|
0x0800,
|
|
0x0001,
|
|
0x2000,
|
|
0x0100,
|
|
|
|
};
|
|
|
|
void dis_ui()
|
|
{
|
|
uint16_t temp=0,temp2=0;
|
|
|
|
|
|
|
|
|
|
for(uint8_t y=0;y<8;y++)
|
|
{
|
|
temp=0;
|
|
temp|=DEN[0]|DEN[1]|DEN[2]|DEN[3]|DEN[4]|DEN[5]|DEN[6]|DEN[7];
|
|
temp&=~DEN[y];
|
|
|
|
temp2=0;
|
|
temp2|=DEN[0]|DEN[1]|DEN[2]|DEN[3]|DEN[4]|DEN[5]|DEN[6]|DEN[7];
|
|
temp2&=~DEN[y];
|
|
|
|
for(uint8_t x=0;x<8;x++)
|
|
{
|
|
if(dis.lattice[1][y][x]==1)
|
|
{
|
|
temp|=DEP[x];
|
|
}
|
|
if(dis.lattice[0][y][x]==1)
|
|
{
|
|
temp2|=DEP[x];
|
|
}
|
|
}
|
|
if(y<1)//控制数字亮度 0-7
|
|
{
|
|
sbuffer[0]=dis.DT[1];
|
|
sbuffer[1]=dis.DT[0];
|
|
}else
|
|
{
|
|
sbuffer[0]=0;
|
|
sbuffer[1]=0;
|
|
}
|
|
sbuffer[4]=temp;
|
|
sbuffer[5]=temp>>8;
|
|
sbuffer[3]=temp2;
|
|
sbuffer[2]=temp2>>8;
|
|
send_buffer();
|
|
temp=0;
|
|
temp|=DEN[0]|DEN[1]|DEN[2]|DEN[3]|DEN[4]|DEN[5]|DEN[6]|DEN[7];
|
|
temp2=0;
|
|
temp2|=DEN[0]|DEN[1]|DEN[2]|DEN[3]|DEN[4]|DEN[5]|DEN[6]|DEN[7];
|
|
sbuffer[4]=temp;
|
|
sbuffer[5]=temp>>8;
|
|
sbuffer[3]=temp2;
|
|
sbuffer[2]=temp2>>8;
|
|
send_buffer();
|
|
}
|
|
|
|
}
|
|
|
|
|
|
uint8_t dir=0;
|
|
|
|
int rend_int(int MIN_VALUE, int MAX_VALUE) //可控范围的随机数生成
|
|
{
|
|
return rand() % (MAX_VALUE - MIN_VALUE + 1) + MIN_VALUE; //算法,最大值取余加上最小值就是范围内的数
|
|
}
|
|
|
|
uint8_t move(uint8_t map,int y,int x,uint8_t move_dir)
|
|
{
|
|
if(dis.lattice[map][y][x])
|
|
{
|
|
switch(move_dir)
|
|
{
|
|
case 1:
|
|
y+=1;
|
|
x+=1;
|
|
if((y>7)|(x>7)|(dis.lattice[map][y][x]))
|
|
{
|
|
return 1;
|
|
}else
|
|
{
|
|
dis.lattice[map][y][x]=1;
|
|
dis.lattice[map][y-1][x-1]=0;
|
|
return 0;
|
|
}
|
|
break;
|
|
case 2:
|
|
y+=1;
|
|
if((y>7)|(dis.lattice[map][y][x]))
|
|
{
|
|
return 1;
|
|
}else
|
|
{
|
|
dis.lattice[map][y][x]=1;
|
|
dis.lattice[map][y-1][x]=0;
|
|
return 0;
|
|
}
|
|
break;
|
|
case 3:
|
|
y+=1;
|
|
x-=1;
|
|
if((y>7)|(x<0)|(dis.lattice[map][y][x]))
|
|
{
|
|
return 1;
|
|
}else
|
|
{
|
|
dis.lattice[map][y][x]=1;
|
|
dis.lattice[map][y-1][x+1]=0;
|
|
return 0;
|
|
}
|
|
break;
|
|
case 4:
|
|
x-=1;
|
|
if((x<0)|(dis.lattice[map][y][x]))
|
|
{
|
|
return 1;
|
|
}else
|
|
{
|
|
dis.lattice[map][y][x]=1;
|
|
dis.lattice[map][y][x+1]=0;
|
|
return 0;
|
|
}
|
|
break;
|
|
case 5:
|
|
x-=1;
|
|
y-=1;
|
|
if((x<0)|(y<0)|(dis.lattice[map][y][x]))
|
|
{
|
|
return 1;
|
|
}else
|
|
{
|
|
dis.lattice[map][y][x]=1;
|
|
dis.lattice[map][y+1][x+1]=0;
|
|
return 0;
|
|
}
|
|
break;
|
|
case 6:
|
|
y-=1;
|
|
if((y<0)|(dis.lattice[map][y][x]))
|
|
{
|
|
return 1;
|
|
}else
|
|
{
|
|
dis.lattice[map][y][x]=1;
|
|
dis.lattice[map][y+1][x]=0;
|
|
return 0;
|
|
}
|
|
break;
|
|
case 7:
|
|
y-=1;
|
|
x+=1;
|
|
if((y<0)|(x>7)|(dis.lattice[map][y][x]))
|
|
{
|
|
return 1;
|
|
}else
|
|
{
|
|
dis.lattice[map][y][x]=1;
|
|
dis.lattice[map][y+1][x-1]=0;
|
|
return 0;
|
|
}
|
|
break;
|
|
case 8:
|
|
x+=1;
|
|
if((x>7)|(dis.lattice[map][y][x]))
|
|
{
|
|
return 1;
|
|
}else
|
|
{
|
|
dis.lattice[map][y][x]=1;
|
|
dis.lattice[map][y][x-1]=0;
|
|
return 0;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
void scan()
|
|
{
|
|
int temp_x,temp_y;
|
|
uint8_t temp_dir;
|
|
|
|
switch(dir)
|
|
{
|
|
case 0: //平躺状态 随机扩散
|
|
|
|
dis.DT[0]=0;
|
|
dis.DT[1]=0;
|
|
|
|
break;
|
|
case 1:
|
|
for(temp_y=7;temp_y>=0;temp_y--)
|
|
{
|
|
for(temp_x=7;temp_x>=0;temp_x--)
|
|
{
|
|
if(move(0,temp_y,temp_x,dir))
|
|
{
|
|
if(move(0,temp_y,temp_x,2))
|
|
{
|
|
move(0,temp_y,temp_x,8);
|
|
}
|
|
}
|
|
if(move(1,temp_y,temp_x,dir))
|
|
{
|
|
if(move(1,temp_y,temp_x,2))
|
|
{
|
|
move(1,temp_y,temp_x,8);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 2:
|
|
for(temp_y=7;temp_y>=0;temp_y--)
|
|
{
|
|
for(temp_x=7;temp_x>=0;temp_x--)
|
|
{
|
|
if(move(0,temp_y,temp_x,dir))
|
|
{
|
|
if(move(0,temp_y,temp_x,3))
|
|
{
|
|
move(0,temp_y,temp_x,1);
|
|
}
|
|
}
|
|
if(move(1,temp_y,temp_x,dir))
|
|
{
|
|
if(move(1,temp_y,temp_x,3))
|
|
{
|
|
move(1,temp_y,temp_x,1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 3:
|
|
for(temp_y=7;temp_y>=0;temp_y--)
|
|
{
|
|
for(temp_x=0;temp_x<8;temp_x++)
|
|
{
|
|
if(move(0,temp_y,temp_x,dir))
|
|
{
|
|
if(move(0,temp_y,temp_x,4))
|
|
{
|
|
move(0,temp_y,temp_x,2);
|
|
}
|
|
}
|
|
if(move(1,temp_y,temp_x,dir))
|
|
{
|
|
if(move(1,temp_y,temp_x,4))
|
|
{
|
|
move(1,temp_y,temp_x,2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 4:
|
|
for(temp_x=0;temp_x<8;temp_x++)
|
|
{
|
|
for(temp_y=0;temp_y<8;temp_y++)
|
|
{
|
|
if(move(0,temp_y,temp_x,dir))
|
|
{
|
|
if(move(0,temp_y,temp_x,5))
|
|
{
|
|
move(0,temp_y,temp_x,3);
|
|
}
|
|
}
|
|
if(move(1,temp_y,temp_x,dir))
|
|
{
|
|
if(move(1,temp_y,temp_x,5))
|
|
{
|
|
move(1,temp_y,temp_x,3);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 5:
|
|
for(temp_x=0;temp_x<8;temp_x++)
|
|
{
|
|
for(temp_y=0;temp_y<8;temp_y++)
|
|
{
|
|
if(move(0,temp_y,temp_x,dir))
|
|
{
|
|
if(move(0,temp_y,temp_x,6))
|
|
{
|
|
move(0,temp_y,temp_x,4);
|
|
}
|
|
}
|
|
if(move(1,temp_y,temp_x,dir))
|
|
{
|
|
if(move(1,temp_y,temp_x,6))
|
|
{
|
|
move(1,temp_y,temp_x,4);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 6:
|
|
for(temp_y=0;temp_y<8;temp_y++)
|
|
{
|
|
for(temp_x=0;temp_x<8;temp_x++)
|
|
{
|
|
if(move(0,temp_y,temp_x,dir))
|
|
{
|
|
if(move(0,temp_y,temp_x,7))
|
|
{
|
|
move(0,temp_y,temp_x,5);
|
|
}
|
|
}
|
|
if(move(1,temp_y,temp_x,dir))
|
|
{
|
|
if(move(1,temp_y,temp_x,7))
|
|
{
|
|
move(1,temp_y,temp_x,5);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 7:
|
|
for(temp_y=0;temp_y<8;temp_y++)
|
|
{
|
|
for(temp_x=7;temp_x>=0;temp_x--)
|
|
{
|
|
if(move(0,temp_y,temp_x,dir))
|
|
{
|
|
if(move(0,temp_y,temp_x,8))
|
|
{
|
|
move(0,temp_y,temp_x,6);
|
|
}
|
|
}
|
|
if(move(1,temp_y,temp_x,dir))
|
|
{
|
|
if(move(1,temp_y,temp_x,8))
|
|
{
|
|
move(1,temp_y,temp_x,6);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 8:
|
|
for(temp_x=7;temp_x>=0;temp_x--)
|
|
{
|
|
for(temp_y=0;temp_y<8;temp_y++)
|
|
{
|
|
if(move(0,temp_y,temp_x,dir))
|
|
{
|
|
if(move(0,temp_y,temp_x,1))
|
|
{
|
|
move(0,temp_y,temp_x,7);
|
|
}
|
|
}
|
|
if(move(1,temp_y,temp_x,dir))
|
|
{
|
|
if(move(1,temp_y,temp_x,1))
|
|
{
|
|
move(1,temp_y,temp_x,7);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
uint8_t read_map(uint8_t map)
|
|
{
|
|
uint8_t a=0;
|
|
for(uint8_t y=0;y<8;y++)
|
|
{
|
|
for(uint8_t x=0;x<8;x++)
|
|
{
|
|
if(dis.lattice[map][y][x])
|
|
{
|
|
a++;
|
|
}
|
|
}
|
|
}
|
|
return a;
|
|
}
|
|
|
|
void fuck()
|
|
{
|
|
uint8_t a=0;
|
|
uint32_t tike=1000,tike2=0;
|
|
uint16_t mup6050_flag=0;
|
|
int ax,ay,az,gx,gy,gz,ax_of=0,ay_of=0,az_of=0,gx_of=0,gy_of=0,gz_of=0;
|
|
int fax,fay,faz;
|
|
HAL_Delay(150);
|
|
mup6050_flag=MPU_Init();
|
|
if(mup6050_flag!=0)
|
|
{
|
|
//kill
|
|
while(1)
|
|
{
|
|
|
|
}
|
|
}
|
|
while(1)
|
|
{
|
|
MPU_Get_Accelerometer(&ax,&ay,&az);
|
|
//off set
|
|
|
|
ax=ax+ax_of;
|
|
ay=ay+ay_of;
|
|
az=az+az_of;
|
|
|
|
|
|
gx=gx+gx_of;
|
|
gy=gy+gy_of;
|
|
gz=gz+gz_of;
|
|
|
|
//to g
|
|
fax=((ax/16384.0)* 57.29577)/0.637;
|
|
fay=((ay/16384.0)* 57.29577)/0.637;
|
|
faz=((az/16384.0)* 57.29577)/0.637;
|
|
|
|
|
|
#define det 20
|
|
uint8_t temp1=0,temp2=0;
|
|
if((((fax>=(360-det))&(fax<=360))|((fax>=0)&(fax<=det)))&(((fay>=(360-det))&(fay<=360))|((fay>=0)&(fay<=det))))//平躺姿态
|
|
{
|
|
dir=0;
|
|
}else
|
|
{
|
|
/*
|
|
一个诡异的BUG
|
|
判断条件过多的时候会改变判断对象的值
|
|
所以分两步判断
|
|
*/
|
|
temp1=0;
|
|
temp2=0;
|
|
if((fax>0)&(fax<90))
|
|
{
|
|
temp1=1;
|
|
}
|
|
if((fax>275)&(fax<360))
|
|
{
|
|
temp2=1;
|
|
}
|
|
|
|
if((((fay>(360-det))&(fay<=0))|((fay>=0)&(fay<=det)))&temp1)
|
|
{
|
|
dir=1;
|
|
}
|
|
if(((fay>(45-det))&(fay<(45+det)))&temp1)
|
|
{
|
|
dir=8;
|
|
}
|
|
if((fay>(90-det))&(fay<(90+det)))
|
|
{
|
|
dir=7;
|
|
}
|
|
if(((fay>(45-det))&(fay<(45+det)))&temp2)
|
|
{
|
|
dir=6;
|
|
}
|
|
if((((fay>(360-det))&(fay<=0))|((fay>=0)&(fay<=det)))&temp2)
|
|
{
|
|
dir=5;
|
|
}
|
|
if(((fay>(315-det))&(fay<(315+det)))&temp2)
|
|
{
|
|
dir=4;
|
|
}
|
|
if((fay>(270-det))&(fay<(270+det)))
|
|
{
|
|
dir=3;
|
|
}
|
|
if(((fay>(315-det))&(fay<(315+det)))&temp1)
|
|
{
|
|
dir=2;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if(HAL_GetTick()>tike)
|
|
{
|
|
tike=HAL_GetTick()+1000;
|
|
if(dir==1||dir==2||dir==8)
|
|
{
|
|
if((dis.lattice[0][7][7]==1)&&dis.lattice[1][0][0]==0)
|
|
{
|
|
dis.lattice[0][7][7]=0;
|
|
dis.lattice[1][0][0]=1;
|
|
}
|
|
a=read_map(0);
|
|
dis.DT[0]=LD_true_1[a/10];
|
|
dis.DT[1]=LD_true_2[a%10];
|
|
}
|
|
if(dir==5||dir==4||dir==6)
|
|
{
|
|
if((dis.lattice[1][0][0]==1)&&dis.lattice[0][7][7]==0)
|
|
{
|
|
dis.lattice[1][0][0]=0;
|
|
dis.lattice[0][7][7]=1;
|
|
}
|
|
a=read_map(1);
|
|
dis.DT[1]=LD_1[a/10];
|
|
dis.DT[0]=LD_2[a%10];
|
|
}
|
|
}
|
|
|
|
if(HAL_GetTick()>tike2)
|
|
{
|
|
tike2=HAL_GetTick()+10;
|
|
|
|
scan();
|
|
}
|
|
|
|
dis_ui();
|
|
}
|
|
|
|
}
|
|
|