Files
Hourglass/stm32/MDK-ARM/device/c.c
T
kevin f17aff1ba0 init
Signed-off-by: kevin <kevin@lmve.net>
2024-11-12 23:05:49 +08:00

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();
}
}