单片机模拟还原三阶魔方.docx_第1页
单片机模拟还原三阶魔方.docx_第2页
单片机模拟还原三阶魔方.docx_第3页
单片机模拟还原三阶魔方.docx_第4页
单片机模拟还原三阶魔方.docx_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

三阶魔方模拟还原n 暂时没有硬件平台,故在程序里建立魔方模型,通过程序还原它如图片所示:以绿色面为顶面(0面),底面为蓝色(5面),从上依次顺时针为 白-1、红-2、黄-3、橙色-4。将其六面以顶面为准平铺开,各面以从左到右从上到下顺序依次标记为0-8块,4为中心块。 旋转某一面时(如旋转0面),主要改变的有本面的9块颜色、各侧边颜色(Up0-2、Right0-2、Down0-2、Left0-2,这四数组依次存储各侧面的那三块的地址),当旋转时只是其值改变但地址保持不变。通过此数组和结构体建立旋转的模型。 还原算法不能完全依靠上面的模型(或者说是基于它而建立),此时需要建立一个有相对位置关系的数学模型,也就是我能通过它知道下一步应该如何转。此时建立了数组Color_D6来实现标准相对位置,它包含信息有各面相对实际旋转角度(0-n*90)、对应实际面、其颜色,location(低2位记录0-3 上右下左的顺时针4个位置,bit6-4记录那个相对标准面,最高位置1表示0、2、8、6四块,为0时表示低2位记录1、3、7、5四个位置)用于记录寻找的目标快所在位置,通过它来计算旋转。 算法分7段,程序只需要扫描一次六面的情况,后期处理不再需要获取各面信息。 基于STM32F103C8T6,程序22K,AVRmega16完全可以实现,程序算法很快,全程时间 reset CS RD WR RS PA0-PA7:DATA IO STM32 IO使用信息/-/#define TFT_RST PB6#define LCD_RST_UP GPIO_SetBits(GPIOB,GPIO_Pin_6)#define LCD_RST_DOWN GPIO_ResetBits(GPIOB,GPIO_Pin_6)/#define TFT_CS PB7 #define LCD_CS_UP GPIO_SetBits(GPIOB,GPIO_Pin_7);#define LCD_CS_DOWN GPIO_ResetBits(GPIOB,GPIO_Pin_7)/#define TFT_RD PB8 /那?3?1#define LCD_RD_DOWN GPIO_ResetBits(GPIOB,GPIO_Pin_8)#define LCD_RD_UP GPIO_SetBits(GPIOB,GPIO_Pin_8)/#define TFT_RS PB3 /那?3?1#define LCD_RS_UP GPIO_SetBits(GPIOB,GPIO_Pin_3)#define LCD_RS_DOWN GPIO_ResetBits(GPIOB,GPIO_Pin_3)/#define TFT_WR PB9 /那?3?1#define LCD_WR_UP GPIO_SetBits(GPIOB,GPIO_Pin_9)#define LCD_WR_DOWN GPIO_ResetBits(GPIOB,GPIO_Pin_9)#define TFT_8Bits_out(GPIOX, VAL ) GPIOX-BSRR = VAL|(VAL&0x00FF)16)/8bits数据端口struct rotate/各侧边的关联 即当前面的个侧边面块u8 *Up3;u8 *Down3;u8 *Left3;u8 *Right3;extern u8 Red,Gre,Blu;extern u8 Cube69;/magic cube color void LCD_Init ( void );void LCD_Set_Horizontal_Vertical ( unsigned int horizontal, unsigned int vertical );void LCD_Set_Window ( unsigned int , unsigned int , unsigned int, unsigned int );void LCD_Show_Blackground ( uint8_t red, uint8_t green, uint8_t blue );void LCD_ShowChar(uint8_t x,uint16_t y,uint8_t num,uint8_t size,uint8_t mode);void LCD_Fill(u8 xsta,u16 ysta,u8 xend,u16 yend);void LCD_DrawLine(u8 x1, u16 y1, u8 x2, u16 y2);void Draw_Circle(u8 x0,u16 y0,u8 r);void LCD_Cube_Paint(void);void Turn_Cube( u8 direction );void init_Cube(void);unsigned char Cube_Restore(u8 face);#endif/* ILI93XX.c */#include delay.h#include ILI93XX.h#include font.h#include usart.h/=u8 Red,Gre,Blu;u8 Cube69;/magic cube color/#define DEBUG4 1/不同阶段调试#define DEBUG7 1/不同阶段调试struct rotate Cube16;void LCD_Write_Data_Start()LCD_CS_DOWN;LCD_RS_DOWN;TFT_8Bits_out ( GPIOA, 0x00 );LCD_WR_DOWN;LCD_WR_UP;TFT_8Bits_out ( GPIOA, 0x22 );LCD_WR_DOWN;LCD_WR_UP;LCD_RS_UP;void LCD_Write_Data_End()LCD_RS_UP;LCD_CS_UP;void LCD_Write_Data ( uint8_t Red, uint8_t Green, uint8_t Blue )TFT_8Bits_out ( GPIOA, ( Red2 ) );LCD_WR_DOWN;LCD_WR_UP;TFT_8Bits_out ( GPIOA, ( Green2 ) );LCD_WR_DOWN;LCD_WR_UP;TFT_8Bits_out ( GPIOA, ( Blue8 ) );LCD_WR_DOWN;LCD_WR_UP;TFT_8Bits_out ( GPIOA, index );LCD_WR_DOWN;LCD_WR_UP;LCD_RS_UP;TFT_8Bits_out ( GPIOA, ( uint8_t ) ( data8 ) );LCD_WR_DOWN;LCD_WR_UP;TFT_8Bits_out ( GPIOA, ( uint8_t ) ( data ) );LCD_WR_DOWN;LCD_WR_UP;LCD_CS_UP;void LCD_Display_ON()LCD_Write_Register ( 0x07, 0x0033 );void LCD_Display_OFF()LCD_Write_Register ( 0x07, 0x0021 );void LCD_Init()GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOA, ENABLE ); /使能端口时钟GPIO_InitStructure.GPIO_Pin =0x00FF; /端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init ( GPIOA, &GPIO_InitStructure );RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOB, ENABLE ); /使能端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; /端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init ( GPIOB, &GPIO_InitStructure );LCD_RST_UP;LCD_RD_UP;LCD_RS_UP;LCD_WR_UP;LCD_CS_UP;/LCD_DATA_HIGH=0xff;LCD_CS_UP;LCD_RST_UP;LCD_RS_UP;LCD_RD_UP;LCD_WR_UP;delay_ms ( 1 );LCD_CS_DOWN;LCD_RST_DOWN;delay_ms ( 10 );LCD_RST_UP;LCD_CS_UP;delay_ms ( 50 );/* Start Initial Sequence */LCD_Write_Register ( 0x00E3, 0x3008 ); / Set internal timingLCD_Write_Register ( 0x00E7, 0x0012 ); / Set internal timingLCD_Write_Register ( 0x00EF, 0x1231 ); / Set internal timingLCD_Write_Register ( 0x00E5,0x78F0 ); / set SRAM internal timingLCD_Write_Register ( 0x0001,0x0100 ); / set SS and SM bitLCD_Write_Register ( 0x0002,0x0700 ); / set 1 line inversionLCD_Write_Register ( 0x0003,0xD030 ); / set GRAM write direction and BGR=1.LCD_Write_Register ( 0x0004,0x0000 ); / Resize registerLCD_Write_Register ( 0x0008,0x0202 ); / set the back porch and front porchLCD_Write_Register ( 0x0009,0x0000 ); / set non-display area refresh cycle ISC3:0LCD_Write_Register ( 0x000A,0x0000 ); / FMARK functionLCD_Write_Register ( 0x000C,0x0000 ); / RGB interface settingLCD_Write_Register ( 0x000D,0x0000 ); / Frame marker PositionLCD_Write_Register ( 0x000F,0x0000 ); / RGB interface polarity/*Power On sequence */LCD_Write_Register ( 0x0010,0x0000 ); / SAP, BT3:0, AP, DSTB, SLP, STBLCD_Write_Register ( 0x0011,0x0007 ); / DC12:0, DC02:0, VC2:0LCD_Write_Register ( 0x0012,0x0000 ); / VREG1OUT voltageLCD_Write_Register ( 0x0013,0x0000 ); / VDV4:0 for VCOM amplitudeLCD_Write_Register ( 0x0007,0x0001 );delay_ms ( 200 ); / Dis-charge capacitor power voltageLCD_Write_Register ( 0x0010,0x1690 ); / 1490/SAP, BT3:0, AP, DSTB, SLP, STBLCD_Write_Register ( 0x0011,0x0227 ); / DC12:0, DC02:0, VC2:0delay_ms ( 50 ); / Delay 50msLCD_Write_Register ( 0x0012,0x009D ); /001C/ Internal reference voltage= Vci;delay_ms ( 50 ); / Delay 50msLCD_Write_Register ( 0x0013,0x1900 ); /0x1000/1400 Set VDV4:0 for VCOM amplitude 1A00LCD_Write_Register ( 0x0029,0x0025 ); /0x0012 /001a Set VCM5:0 for VCOMH /0x0025 0034LCD_Write_Register ( 0x002B,0x000D ); / Set Frame Rate 000Cdelay_ms ( 50 ); / Delay 50msLCD_Write_Register ( 0x0020,0x0000 ); / GRAM horizontal AddressLCD_Write_Register ( 0x0021,0x0000 ); / GRAM Vertical Address/ - Adjust the Gamma Curve -/LCD_Write_Register ( 0x0030,0x0007 );LCD_Write_Register ( 0x0031,0x0303 );LCD_Write_Register ( 0x0032,0x0003 );LCD_Write_Register ( 0x0035,0x0206 );LCD_Write_Register ( 0x0036,0x0008 );/0207LCD_Write_Register ( 0x0037,0x0406 );/0306LCD_Write_Register ( 0x0038,0x0304 );/0102LCD_Write_Register ( 0x0039,0x0007 );/0707LCD_Write_Register ( 0x003C,0x0602 );/0702LCD_Write_Register ( 0x003D,0x0008 );/1604/- Set GRAM area -/LCD_Write_Register ( 0x0050,0x0000 ); / Horizontal GRAM Start AddressLCD_Write_Register ( 0x0051,0x00EF ); / Horizontal GRAM End AddressLCD_Write_Register ( 0x0052,0x0000 ); / Vertical GRAM Start AddressLCD_Write_Register ( 0x0053,0x013F ); / Vertical GRAM Start AddressLCD_Write_Register ( 0x0060,0xA700 ); / Gate Scan LineLCD_Write_Register ( 0x0061,0x0001 ); / NDL,VLE, REVLCD_Write_Register ( 0x006A,0x0000 ); / set scrolling line/- Partial Display Control -/LCD_Write_Register ( 0x0080,0x0000 );LCD_Write_Register ( 0x0081,0x0000 );LCD_Write_Register ( 0x0082,0x0000 );LCD_Write_Register ( 0x0083,0x0000 );LCD_Write_Register ( 0x0084,0x0000 );LCD_Write_Register ( 0x0085,0x0000 );/- Panel Control -/LCD_Write_Register ( 0x0090,0x0010 );LCD_Write_Register ( 0x0092,0x0600 );/LCD_Write_Register(0x0093,0x0003);/LCD_Write_Register(0x0095,0x0110);/LCD_Write_Register(0x0097,0x0000);/ LCD_Write_Register(0x0098,0x0000);LCD_Write_Register ( 0x0007,0x0133 ); / 262K color and display ON/LCD_Write_Register(0x0022);void LCD_Set_Horizontal_Vertical ( unsigned int horizontal, unsigned int vertical )LCD_Write_Register ( 0x20, horizontal );LCD_Write_Register ( 0x21, vertical );void LCD_Set_Window ( unsigned int start_horizontal, unsigned int start_vertical, unsigned int end_horizontal, unsigned int end_vertical )LCD_Set_Horizontal_Vertical ( start_horizontal, start_vertical );LCD_Write_Register ( 0x50, start_horizontal );LCD_Write_Register ( 0x52, start_vertical );LCD_Write_Register ( 0x51, end_horizontal );LCD_Write_Register ( 0x53, end_vertical );void LCD_Show_Blackground ( uint8_t red, uint8_t green, uint8_t blue )unsigned int i, j;LCD_Set_Horizontal_Vertical ( 0X00, 0X00 );LCD_Write_Data_Start();for ( i=0; i240; i+ )for ( j=0; j/size:字体大小 12/16/mode:叠加方式(1)还是非叠加方式(0)void LCD_ShowChar(u8 x,u16 y,u8 num,u8 size,u8 mode) #define MAX_CHAR_POSX 232#define MAX_CHAR_POSY 304 u8 temp; u8 pos,t; if(xMAX_CHAR_POSX|yMAX_CHAR_POSY)return; /?LCD_Write_Register(0x50,x); /?GRAM?LCD_Write_Register(0x51,x+(size/2-1);/?GRAM?LCD_Write_Register(0x52,y); /?GRAM?LCD_Write_Register(0x53,y+size-1); /?GRAM?LCD_Set_Horizontal_Vertical(x,y); /? LCD_Write_Data_Start();/LCD_Write_Register(0x22);/LCD_WriteRAM_Prepare(); /?GRAM num=num- ;/?if(!mode) /非叠加方式for(pos=0;possize;pos+)if(size=12)temp=asc2_1206numpos;/调用1206字体else temp=asc2_1608numpos; /调用1608字体for(t=0;t=1; else /叠加方式for(pos=0;possize;pos+)if(size=12)temp=asc2_1206numpos;/调用1206字体else temp=asc2_1608numpos; /调用1608字体for(t=0;t=1; /? /LCD_WriteReg(0x50, 0x0000); /?GRAM?/LCD_WriteReg(0x51, 0x00EF); /?GRAM?/LCD_WriteReg(0x52, 0x0000); /?GRAM?/LCD_WriteReg(0x53, 0x013F); /?GRAM? void LCD_Fill(u8 xsta,u16 ysta,u8 xend,u16 yend) u32 n;/?LCD_Write_Register(0x50, xsta); /?GRAM?LCD_Write_Register(0x51, xend); /?GRAM?LCD_Write_Register(0x52, ysta); /?GRAM?LCD_Write_Register(0x53, yend); /?GRAM?LCD_Set_Horizontal_Vertical(xsta,ysta);/? LCD_Write_Data_Start();/LCD_WriteRAM_Prepare(); /?GRAM n=(u32)(yend-ysta+1)*(xend-xsta+1); while(n-) LCD_Write_Data ( Red, Gre, Blu );/ /?LCD_Write_Register(0x50, 0x0000); /?GRAM?LCD_Write_Register(0x51, 0x00EF); /?GRAM?LCD_Write_Register(0x52, 0x0000); /?GRAM?LCD_Write_Register(0x53, 0x013F); /?GRAM? /?/x1,y1:?/x2,y2:? void LCD_DrawLine(u8 x1, u16 y1, u8 x2, u16 y2) u16 x, y, t;Red=0xFF;Blu=0;Gre=0;/设定颜色if(x1=x2)&(y1=y2)LCD_DrawPoint(x1, y1);else if(abs(y2-y1)abs(x2-x1)/?1 if(y1y2) t=y1;y1=y2;y2=t; t=x1;x1=x2;x2=t; for(y=y1;yx2)t=y1;y1=y2;y2=t;t=x1;x1=x2;x2=t; for(x=x1;x=x2;x+)/?x? y =(u32)(x-x1)*(y2-y1)/(x2-x1)+y1;LCD_DrawPoint(x,y); /在指定位置画一个指定大小的圆/(x,y):中心点/r :半径void Draw_Circle(u8 x0,u16 y0,u8 r)int a,b;int di;Red=0x00;Blu=0x3F;Gre=0;/设定颜色a=0;b=r; di=3-(r1); /判断下个点位置的标志while(a=b)LCD_DrawPoint(x0-b,y0-a); /3 LCD_DrawPoint(x0+b,y0-a); /0 LCD_DrawPoint(x0-a,y0+b); /1 LCD_DrawPoint(x0-b,y0-a); /7 LCD_DrawPoint(x0-a,y0-b); /2 LCD_DrawPoint(x0+b,y0+a); /4 LCD_DrawPoint(x0+a,y0-b); /5LCD_DrawPoint(x0+a,y0+b); /6 LCD_DrawPoint(x0-b,y0+a); a+;/使用Bresenham算法画圆 if(di0)di +=4*a+6; elsedi+=10+4*(a-b); b-; LCD_DrawPoint(x0+a,y0+b); /*/*以上为TFT显示驱动 下面为还原算法*/15*15 左到右 上到下Cube0-50-8 bit2-0:color bit3:changevoid LCD_Cube_Paint(void)u8 horizontal,t1,t2;u16 vertical;u8 i,j;for(i=0;i6;i+) if(i=0)horizontal=206;vertical=136;else if(i5)horizontal=143; / 1号 4号有错位 图形显示上vertical=(i-1)*63+10;else horizontal=80;vertical=136; for(j=0;j9;j+)if(Cubeij&0x08) /有改变才去重画 /颜色赋值switch(Cubeij&0x07)case 0: Red=0xFF;Gre=0xFF;Blu=0xFF;break; /Whitecase 1: Red=0;Gre=0;Blu=0xFF;break;/Bluecase 2: Red=0xFF;Gre=0x60;Blu=0;break;/Orangecase 3: Red=0;Blu=0;Gre=0xFF;break;/Greencase 4: Red=0xFF;Gre=0;Blu=0;break;/Redcase 5: Red=0xFF;Gre=0xFF;Blu=0;break;/yellowdefault:Red=0;Gre=0;Blu=0;t2=vertical+j%3*21;t1=horizontal-j/3*21;LCD_Fill(t1-20,t2,t1-1,t2+20-1);/各块分别填充的颜色Cubeij&=0xF7; /clear flag LCD_Write_Data_End();void init_Cube(void)u8 i,j;/ 初始显示for(i=0;i6;i+)/ for(j=0;j5) return ; switch(direction&0x30)case 0x10:/修改侧面for(i=0;i3;i+)temp= *Cube1center.Lefti;*Cube1center.Lefti= *Cube1center.Up2-i |0x08;*Cube1center.Up2-i= *Cube1center.Right2-i |0x08;*Cube1center.Right2-i= *Cube1center.Downi |0x08;*Cube1center.Downi=temp |0x08

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论